您的位置:首页 > 其它

lucene 基于索引的查询

2016-12-05 15:49 387 查看

                                               lucene 基于索引的查询

根据title模糊查询:

根据上一篇文章我们将索引生成到了indexpack 文件夹中:
public String searchInfo(HttpServletRequest request) throws CorruptIndexException, IOException,

            InvalidTokenOffsetsException, ParseException {
  //索引文件保存的路径

        String indexpackUrl = InfoService.class.getResource("/").getPath().replaceFirst("/", "")

                .replaceAll("WEB-INF/classes/", "")

                + "static/indexpack";
//读取索引文件

        IndexReader indexReader = IndexReader.open(new SimpleFSDirectory(new File(indexpackUrl)));

        IndexSearcher indexSearch = new IndexSearcher(indexReader);   
     // 搜索页面传入的参数
        String title = request.getParameter("title");

       

        String content = request.getParameter("content");

        List<String> fieldsList = new ArrayList<String>();

        fieldsList.add("title");

        // 单个关键字查询器匹配

        // Query query=new TermQuery(new Term("title",title));

        // 模糊查查询器

        // FuzzyQuery query2=new FuzzyQuery(new

        // Term("title","*"+title+"*"),0.1f);

       // WildcardQuery query3 = new WildcardQuery(new Term("title", title));

         //多个查询组合用到的  可以and 多个query

        BooleanQuery booleanQueryHighlighter = new BooleanQuery();

        String[] fields = (String[]) fieldsList.toArray(new String[fieldsList.size()]);
        //前面讲了多种查询器 这种方式为统一的  不用自己判断使用哪种查询器 解决了我的中文搜索不到的问题

        QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_30, fields,

                new StandardAnalyzer(Version.LUCENE_30));

        Query query4 = parser.parse(title);

        // 一定包含 Occur.MUST

        booleanQueryHighlighter.add(query4, Occur.MUST);

        
       //查询的结果

        TopDocs topdocs = indexSearch.search(booleanQueryHighlighter, null, 10);

        StringBuilder builder = new StringBuilder();

        // 高亮显示

        Highlighter highLighter = null;

        SimpleHTMLFormatter fomater = new SimpleHTMLFormatter("<font color='red'>", "</font>");

        highLighter = new Highlighter(fomater, new QueryScorer(booleanQueryHighlighter));

        highLighter.setTextFragmenter(new SimpleFragmenter(Integer.MAX_VALUE));

        for (ScoreDoc doc : topdocs.scoreDocs) {

            Document document = indexSearch.doc(doc.doc);

            TokenStream tokenStream = new StandardAnalyzer(Version.LUCENE_30).tokenStream("token",

                    new StringReader(document.get("title")));

            String str = highLighter.getBestFragment(tokenStream, document.get("title"));

            builder.append(str);

        }

       

        return builder.toString();

    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: