欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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