zoukankan      html  css  js  c++  java
  • lucene-查询query->BooleanQuery “与或”搜索

     BooleanQuery也是实际开发过程中经常使用的一种Query。它其实是一个组合的Query,在使用时可以把各种Query对象添加进去并标明它们之间的逻辑关系。

     BooleanQuery本身来讲是一个布尔子句的容器,它提供了专门的API方法往其中添加子句,并标明它们之间的关系,以下代码为BooleanQuery提供的用于添加子句的API接口:

    public void add(Query query, boolean required, boolean prohibited);

    注意:BooleanQuery是可以嵌套的,一个BooleanQuery可以成为另一个BooleanQuery的条件子句。

    package ch11;
    
    import org.apache.lucene.analysis.standard.StandardAnalyzer;
    import org.apache.lucene.document.Document;
    import org.apache.lucene.document.Field;
    import org.apache.lucene.index.IndexWriter;
    import org.apache.lucene.index.Term;
    import org.apache.lucene.search.BooleanQuery;
    import org.apache.lucene.search.IndexSearcher;
    import org.apache.lucene.search.Query;
    import org.apache.lucene.search.TermQuery;
    
    public class BooleanQueryTest1
    
    {
    
        public static void main(String[] args) throws Exception {
    
            // 生成新的Document对象
    
            Document doc1 = new Document();
    
            doc1.add(Field.Text("name", "word1 word2 word3"));
    
            doc1.add(Field.Keyword("title", "doc1"));
    
            Document doc2 = new Document();
    
            doc2.add(Field.Text("name", "word1 word4 word5"));
    
            doc2.add(Field.Keyword("title", "doc2"));
    
            Document doc3 = new Document();
    
            doc3.add(Field.Text("name", "word1 word2 word6"));
    
            doc3.add(Field.Keyword("title", "doc3"));
    
            // 生成索引书写器
    
            IndexWriter writer = new IndexWriter("c://index",
                    new StandardAnalyzer(), true);
    
            // 添加到索引中
    
            writer.addDocument(doc1);
    
            writer.addDocument(doc2);
    
            writer.addDocument(doc3);
    
            writer.close();
    
            Query query1 = null;
    
            Query query2 = null;
    
            BooleanQuery query = null;
    
            Hits hits = null;
    
            // 生成IndexSearcher对象
    
            IndexSearcher searcher = new IndexSearcher("c://index");
    
            query1 = new TermQuery(new Term("name", "word1"));
    
            query2 = new TermQuery(new Term("name", "word2"));
    
            // 构造一个布尔查询
    
            query = new BooleanQuery();
    
            // 添加两个子查询
    
            query.add(query1, true, false);
    
            query.add(query2, true, false);
    
            hits = searcher.search(query);
    
            printResult(hits, "word1和word2");
    
        }
    
        public static void printResult(Hits hits, String key) throws Exception
    
      {
    
        System.out.println("查找 /"" + key + "/" :");
    
        if (hits != null)
    
        {
    
          if (hits.length() == 0)
    
          {
    
            System.out.println("没有找到任何结果");
    
          }
    
          else
    
          {
    
            System.out.println("找到" + hits.length() + "个结果");
    
            for (int i = 0; i < hits.length(); i++)
    
            {
    
              Document d = hits.doc(i);
    
              String dname = d.get("title");
    
              System.out.print(dname + "   ");
    
            }
    
            System.out.println();
    
            System.out.println();
    
          }
    
        }
    
      }
    }

    代码首先构造了两个TermQuery,然后构造了一个BooleanQuery的对象,并将两个TermQuery当成它的查询子句加入Boolean查询中。

    再来看一下BooleanQuery的add方法,除了它的第一个参数外,它还有另外两个布尔型的参数。第1个参数的意思是当前所加入的查询子句是否必须满足,第2个参数的意思是当前所加入的查询子句是否不需要满足。这样,当这两个参数分别选择true和false时,会有4种不同的组合。

         truefalse:表明当前加入的子句是必须要满足的。
    
         falsetrue:表明当前加入的子句是不可以被满足的。
    
         falsefalse:表明当前加入的子句是可选的。
    
         truetrue:错误的情况。

    由前面的示例可以看出由于加入的两个子句都选用了true&false的组合,因此它们两个都是需要被满足的,也就构成了实际上的“与”关系

     如果是要进行“或”运算,则可按如下代码来构建查询子句

    query.add(query1, false, false);
    
    query.add(query2, false, false);

    由于布尔型的查询是可以嵌套的,因此可以表示多种条件下的组合。不过,如果子句的数目太多,可能会导致查找效率的降低。因此,Lucene给出了一个默认的限制,就是布尔型Query的子句数目不能超过1024。

  • 相关阅读:
    c#项目架构搭建经验
    c++ template怎么使用及注意事项
    c++怎么将一个类,拆分出接口类,和实现类
    c++l类
    错过C++
    Fixed 鸟粪一样的TreeView下的NodeMouseDoubleClick Bug
    Oracle 12C 新特性之表分区带 异步全局索引异步维护(一次add、truncate、drop、spilt、merge多个分区)
    Oracle 12C 新特性之在线重命名、迁移活跃的数据文件
    Oracle 12C 新特性之级联truncate
    Oracle 12C 新特性之扩展数据类型(extended data type)
  • 原文地址:https://www.cnblogs.com/hwaggLee/p/5232402.html
Copyright © 2011-2022 走看看