lucene多条件查询
程序员文章站
2024-03-03 16:19:16
...
/**
* 多条件查询
*
* @param termQueryList
* @return
*/
public List<Document> complexSearch() {
List<Document> docList = new ArrayList<Document>();
try {
directory = FSDirectory.open(new File(LuceneConstant.INDEX_PATH));//打开索引文件夹
IndexReader reader = DirectoryReader.open(directory);//读取目录
IndexSearcher search = new IndexSearcher(reader);//初始化查询组件
BooleanQuery query = new BooleanQuery();;
query.add(new PrefixQuery(new Term("pinYin", letter)),BooleanClause.Occur.MUST);
query.add(NumericRangeQuery.newDoubleRange("price",minPrice,maxPrice,true, false),BooleanClause.Occur.MUST);
query.add(new TermQuery(new Term("name", name)),BooleanClause.Occur.MUST);
TopDocs td = search.search(query, 10000);//获取匹配上元素的一个docid
for (ScoreDoc doc : td.scoreDocs) {
docList.add(search.doc(doc.doc));
}
reader.close();//关闭资源
directory.close();//关闭连接
} catch (Exception e) {
e.printStackTrace();
}
return docList;
}
上面的例子给出了,前导模糊查询和范围查询普通查询的组合,BooleanClause.Occur.MUST,表示他们是与的关系
MUST, SHOULD, MUST_NOT 与 或 非
比如像这样更复杂的嵌套也是可以的。
(a = 1 or a = 2) and (b = 3 or b = 4) or (c <> 5 and c = 6)
实现方式就是在BooleanQuery中嵌套BooleanQuery
上一篇: 【模板】可持久化线段树