记:Lucene布尔搜索

两盒软妹~` 提交于 2020-04-16 12:00:18

【推荐阅读】微服务还能火多久?>>>

BooleanQuery实际开发中常用到的一种Query查询,它其实是一个组合的Query,在使用时可以把各种Query对象加进去并标明他们之间的逻辑关系。BooleanQuery本身是一个布尔子句的容器,它提供了专门的API方法往其中添加子句,并标明他们之间的关系。多个关键词匹配搜索的业务场景不少,代码如下,简单的例子。

 public static void main(String[] args) throws IOException {
        //索引读取
        IndexReader reader = DirectoryReader.open(FSDirectory.open(Paths.get("indexdir")));
        //构建索引搜索
        IndexSearcher searcher = new IndexSearcher(reader);
        //构建搜索条件
        Query query1 = new TermQuery(new Term("title","美国"));
        Query query2 = new TermQuery(new Term("content","学生"));
        BooleanClause bc1 = new BooleanClause(query1, BooleanClause.Occur.MUST);
        BooleanClause bc2 = new BooleanClause(query2, BooleanClause.Occur.MUST_NOT);
        BooleanQuery booleanQuery = new BooleanQuery.Builder().add(bc1).add(bc2).build();
        //执行搜索
        TopDocs topDocs = searcher.search(booleanQuery,10);
        for (ScoreDoc sd : topDocs.scoreDocs) {
            Document doc = searcher.doc(sd.doc);
            System.out.println("DocID:" + sd.doc);
            System.out.println("id:" + doc.get("id"));
            System.out.println("title:" + doc.get("title"));
            System.out.println("文档评分:" + sd.score);
        }
    }

很显然,描述子句之间的关系,用Occur枚举类,列举说明子句之间在匹配文档时,如何并存的方式。

Specifies how clauses are to occur in matching documents.

 

  • MUST      表示该子句必须参与匹配文档中。
  • FILTER    除了这些子句不参与评分外,其他与MUST相似。
  • SHOULD    "应该",出现在匹配的文档中。
  • MUST_NOT  表示该子句不允许出现在匹配的文档中。

OCCUR.FILTER类型示例,过滤了评分。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!