05.索引的查询

通过Query 搜索

TermQuery

不对查询关键字进行分词处理,适合精确查询不分词的Field,如订单号,身份证号等

  1. //创建查询对象
  2. Query query = new TermQuery(new Term("fileName", "springmvc_test.txt"));
  3. //搜索索引 目录
  4. Directory directory = FSDirectory.open(new File(indexFolder));
  5. //定义IndexReader
  6. IndexReader reader = DirectoryReader.open(directory);
  7. //创建indexSearcher
  8. IndexSearcher indexSearcher = new IndexSearcher(reader);
  9. //执行搜索
  10. TopDocs topDocs = indexSearcher.search(query, 100);
  11. //取查询结果的总数量
  12. System.out.println(topDocs.totalHits);
  13. for (ScoreDoc scoreDoc:topDocs.scoreDocs) {
  14. Document document = indexSearcher.doc(scoreDoc.doc);
  15. //从document中取出域的内容
  16. System.out.println(document.get("filename"));
  17. System.out.println(document.get("content"));
  18. System.out.println(document.get("path"));
  19. System.out.println(document.get("size"));
  20. }

NumericRangeQuery

适合查找指定数字范围查询,如LongField

  1. NumericRangeQuery<Long> numericRangeQuery = NumericRangeQuery.newLongRange("fileSize", 0l, 1024l, true, true);

BooleanQuery

实现组合条件查询,对多个Query的查询结果集合进行交、并、差等操作

  1. // 数字范围查询
  2. NumericRangeQuery<Long> numericRangeQuery = NumericRangeQuery
  3. .newLongRange("fileSize", 0l, 1024l, true, true);
  4. //定义Boolean查询
  5. BooleanQuery booleanQuery = new BooleanQuery();
  6. //必须满足fileSize在0到1024范围的条件
  7. booleanQuery.add(numericRangeQuery, Occur.MUST);
  8. //根据文件名搜索
  9. Query query = new TermQuery(new Term("fileName", "springmvc.txt"));
  10. //不查询文件名为“springmvc_test.txt”
  11. booleanQuery.add(query, Occur.MUST);
  12. IndexReader reader = DirectoryReader.open(directory);
  13. IndexSearcher searcher = new IndexSearcher(reader);
  14. TopDocs topDocs = searcher.search(booleanQuery, 100);
  15. 说明:
  16. Occur.MUST 查询条件必须满足,相当于and
  17. Occur.SHOULD 查询条件可选,相当于or
  18. Occur.MUST_NOT 查询条件不能满足,相当于not

MatchAllDocsQuery

查询所有结果

  1. //查询全部文档
  2. Query query = new MatchAllDocsQuery();

通过QueryParser 搜索

QueryParser需要先解析查询的语法,分词,然后生成Query进行查询

QueryParser语法

  • 项查询:
    • FieldName : value
  • 范围查询:
    • FieldName:[min TO max]
    • 注意:QueryParse不支持对数字范围的搜索,它支持字符串范围。数字范围搜索建议使用NumericRangeQuery。
  • 组合查询:
    • +fileSize:[0 TO 1024] +fileName:springmvc.txt
  • 关键字查询
    • AND:关键字1 AND 关键字2
    • OR:关键字1 OR 关键字2
    • NOT:关键字1 NOT 关键字2

QueryParser查询

  1. //f是默认搜索的域
  2. QueryParser queryParser = new QueryParser("f", analyzer);
  3. // 指定查询语法 ,如果不指定fileName就搜索默认的域
  4. Query query2 = queryParser.parse("fileName:springmvc.txt");
  5. 或:
  6. Query query2 = queryParser.parse("spring AND web");

MultiFieldQueryParser查询

  1. //设置组合查询域
  2. String[] fields = {"fileName","fileContent"};
  3. //创建查询解析器
  4. QueryParser queryParser = new MultiFieldQueryParser(fields, new IKAnalyzer());
  5. //查询文件名、文件内容中包括“java”关键字的文档
  6. Query query = queryParser.parse("java");

查询方式小结

  • TermQuery不进行分词,因此适合精确查询不分词的Field,如订单号,身份证号等
  • NumericRangeQuery适合查找指定数字范围查询,如LongField
  • QueryParse需要进行分词,所以需要指定分词器
  • QueryParse不支持对数字范围的搜索,它支持字符串范围。数字范围搜索建议使用NumericRangeQuery
posted @ 2017-02-28 11:46  Wesly186  阅读(105)  评论(0)    收藏  举报