05.索引的查询
通过Query 搜索
TermQuery
不对查询关键字进行分词处理,适合精确查询不分词的Field,如订单号,身份证号等
//创建查询对象
Query query = new TermQuery(new Term("fileName", "springmvc_test.txt"));
//搜索索引 目录
Directory directory = FSDirectory.open(new File(indexFolder));
//定义IndexReader
IndexReader reader = DirectoryReader.open(directory);
//创建indexSearcher
IndexSearcher indexSearcher = new IndexSearcher(reader);
//执行搜索
TopDocs topDocs = indexSearcher.search(query, 100);
//取查询结果的总数量
System.out.println(topDocs.totalHits);
for (ScoreDoc scoreDoc:topDocs.scoreDocs) {
Document document = indexSearcher.doc(scoreDoc.doc);
//从document中取出域的内容
System.out.println(document.get("filename"));
System.out.println(document.get("content"));
System.out.println(document.get("path"));
System.out.println(document.get("size"));
}
NumericRangeQuery
适合查找指定数字范围查询,如LongField
NumericRangeQuery<Long> numericRangeQuery = NumericRangeQuery.newLongRange("fileSize", 0l, 1024l, true, true);
BooleanQuery
实现组合条件查询,对多个Query的查询结果集合进行交、并、差等操作
// 数字范围查询
NumericRangeQuery<Long> numericRangeQuery = NumericRangeQuery
.newLongRange("fileSize", 0l, 1024l, true, true);
//定义Boolean查询
BooleanQuery booleanQuery = new BooleanQuery();
//必须满足fileSize在0到1024范围的条件
booleanQuery.add(numericRangeQuery, Occur.MUST);
//根据文件名搜索
Query query = new TermQuery(new Term("fileName", "springmvc.txt"));
//不查询文件名为“springmvc_test.txt”
booleanQuery.add(query, Occur.MUST);
IndexReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
TopDocs topDocs = searcher.search(booleanQuery, 100);
说明:
Occur.MUST 查询条件必须满足,相当于and
Occur.SHOULD 查询条件可选,相当于or
Occur.MUST_NOT 查询条件不能满足,相当于not非
MatchAllDocsQuery
查询所有结果
//查询全部文档
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查询
//f是默认搜索的域
QueryParser queryParser = new QueryParser("f", analyzer);
// 指定查询语法 ,如果不指定fileName就搜索默认的域
Query query2 = queryParser.parse("fileName:springmvc.txt");
或:
Query query2 = queryParser.parse("spring AND web");
MultiFieldQueryParser查询
//设置组合查询域
String[] fields = {"fileName","fileContent"};
//创建查询解析器
QueryParser queryParser = new MultiFieldQueryParser(fields, new IKAnalyzer());
//查询文件名、文件内容中包括“java”关键字的文档
Query query = queryParser.parse("java");
查询方式小结
- TermQuery不进行分词,因此适合精确查询不分词的Field,如订单号,身份证号等
- NumericRangeQuery适合查找指定数字范围查询,如LongField
- QueryParse需要进行分词,所以需要指定分词器
- QueryParse不支持对数字范围的搜索,它支持字符串范围。数字范围搜索建议使用NumericRangeQuery