Lucene查询对象之BooleanQuery(备忘)

摘要:
在查看此对象之前,我们需要知道布尔查询对象可以做什么。让我们来看看这个布尔查询类/**AQuerythatmatchesdocuments的主要属性和方法匹配其他*查询的布尔组合,例如{@linkTermQuery}s、{@linkPhraseQuery}其他*布尔查询*/publicclassBoolean QueryextendsQueryimplementsIterable<Boolean Use>您可以清楚地看到Boolean Query继承了Query的抽象类。让我们分析一下Occur。它是一个枚举/**Specifieshow子句用于获取匹配文档*/publicstatenumOccur{/**使用此运算符可在匹配文档中出现必须的结果。*/must{@OverridepublicStringtoString(){return“+”;}},/**对于<i>应</i>出现在*匹配文档中的子句,请使用此运算符。对于没有<code>的布尔查询,必须</code˃*子句或更多<code>应</code˃子句必须与文档*匹配。*@seeBooleanQuery#setMinimumNumberShouldMatch*/应{@OverridepublicStringtoString(){return“”;}},/**对于不能出现在匹配文档中的子句使用此运算符。*请注意,它不可能搜索仅包含*MUST_NOT子句的查询。*/MUST_NOT{@OverridepublicStringtoString(){return“-”;};}组合关系的含义如下:1。必须和必须表示“和”之间的关系,即“联合”。

        在看这个对象之前,我们要知道BooleanQuery这个对象能干什么。它能干什么呢,它能进行组合查询。大家都知道,一般的高级查询(比如前程无忧的职位搜索应该用到了组合查询)都会用到组合查询。它了组合,它应该是搜索多个条目,每个条目应该是它的Clause。

       别的不多说,我们来看看这个BooleanQuery类的主要属性和方法。

    /** A Query that matches documents matching boolean combinations of other
  * queries, e.g. {@link TermQuery}s, {@link PhraseQuery}s or other
  * BooleanQuerys.
  */
 public class BooleanQuery extends Query implements Iterable<BooleanClause>

可以清晰的看到BooleanQuery继承Query这个抽象类。

/** Adds a clause to a boolean query.
   *
   * @throws TooManyClauses if the new number of clauses exceeds the maximum clause number
   * @see #getMaxClauseCount()
   */
  public void add(Query query, BooleanClause.Occur occur) {//可以将其他的Query对象加入作为它的一个条件  Occur来控制它的组合关系
    add(new BooleanClause(query, occur));
  }

  /** Adds a clause to a boolean query.
   * @throws TooManyClauses if the new number of clauses exceeds the maximum clause number
   * @see #getMaxClauseCount()
   */
  public void add(BooleanClause clause) {
    if (clauses.size() >= maxClauseCount)//-----------加查询条件有个上限,如果大于这个上限就会报异常
      throw new TooManyClauses();

    clauses.add(clause);
  }

接下来我们来看看各个条件的组合关系怎么控制的,有几种关系。下面我们来分析Occour.它是一个枚举

 /** Specifies how clauses are to occur in matching documents. */
  public static enum Occur {

    /** Use this operator for clauses that <i>must</i> appear in the matching documents. */
    MUST     { @Override public String toString() { return "+"; } },

    /** Use this operator for clauses that <i>should</i> appear in the
     * matching documents. For a BooleanQuery with no <code>MUST</code>
     * clauses one or more <code>SHOULD</code> clauses must match a document
     * for the BooleanQuery to match.
     * @see BooleanQuery#setMinimumNumberShouldMatch
     */
    SHOULD   { @Override public String toString() { return "";  } },

    /** Use this operator for clauses that <i>must not</i> appear in the matching documents.
     * Note that it is not possible to search for queries that only consist
     * of a <code>MUST_NOT</code> clause. */
    MUST_NOT { @Override public String toString() { return "-"; } };

  }

     组合关系代表的意思如下:
     1、MUST和MUST表示“与”的关系,即“并集”。
     2、MUST和MUST_NOT前者包含后者不包含。
     3、MUST_NOT和MUST_NOT没意义
     4、SHOULD与MUST表示MUST,SHOULD失去意义;
     5、SHOUlD与MUST_NOT相当于MUST与MUST_NOT。
     6、SHOULD与SHOULD表示“或”的概念。

     OK看示例吧!

       Directory dic=new SimpleFSDirectory(new File(ILuceneManager.DEFAULT_REGION_LUCENE_INDEX_PATH));
   IndexSearcher searcher=new IndexSearcher(dic);
   //----------组合查询
   BooleanQuery query=new BooleanQuery();
   //-----------地名带有浙字
   Term term1=new Term("ADDRESS", "浙");
   TermQuery tq1=new TermQuery(term1);
   BooleanClause clause=new BooleanClause(tq1, BooleanClause.Occur.SHOULD);   
   query.add(clause);
   
   //--------权重最高的
   Term term2=new Term("weight", "1");
   TermQuery tq2=new TermQuery(term2);
   BooleanClause clause2=new BooleanClause(tq2, BooleanClause.Occur.MUST);
   query.add(clause2);
   
   TopDocs tops=searcher.search(query,10);
   ScoreDoc[] scores=tops.scoreDocs;
   int length=tops.totalHits;
   for(int i=0;i<(length>LuceneManagerImpl.DEFAULT_QUERY_NUM?LuceneManagerImpl.DEFAULT_QUERY_NUM:length);i++){
    Document targetDoc=searcher.doc(scores[i].doc);
    System.out.println(targetDoc.getFields("NAME")[0].stringValue());
   };
   
   System.out.println("查询所得条数:"+tops.totalHits);

免责声明:文章转载自《Lucene查询对象之BooleanQuery(备忘)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Google架构【Python3爬虫】一次破解JS加密数据的记录下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

elasticsearch 性能优化

转载: https://www.cnblogs.com/jajian/p/10465519.html 硬件选择 Elasticsearch(后文简称 ES)的基础是 Lucene,所有的索引和文档数据是存储在本地的磁盘中,具体的路径可在 ES 的配置文件../config/elasticsearch.yml中配置,如下: # ---------------...

Lucene知识总结

(1) Lucene查询上只能提供近实时而非实时查询,原因是Segment在被flush或commit之前,数据保存在内存中,是不可被搜索的。 (2) IndexWriter提供的核心接口都是线程安全的,并且内部做了特殊的并发优化来优化多线程写入的性能。IndexWriter内部为每个线程都会单独开辟一个空间来写入,这块空间由DocumentsWriter...

lucene查询语法,适用于ELk:kibana查询

ucene查询语法,适用于ELk:kibana查询 Kibana在ELK中扮演着数据可视化角色,用来查询及展示数据; Elasticsearch查询采用的是luncene搜索引擎,其4过滤查询语法和lucene一致。 Kibana官方在线演示 字段搜索 Lucene支持实时数据。执行搜索时,您可以指定字段,也可以使用默认字段。字段名称和默认字段是特定于实...

lucene教程简介

1 lucene简介 1.1 什么是lucene     Lucene是一个全文搜索框架,而不是应用产品。因此它并不像www.baidu.com 或者google Desktop那么拿来就能用,它只是提供了一种工具让你能实现这些产品。 2 lucene的工作方式     lucene提供的服务实际包含两部分:一入一出。所谓入是写入,即将你提供的源(本质...

Elasticsearch 堆内存

1、什么是堆内存? Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象。 在 Java 中,堆被划分成两个不同的区域: 新生代 ( Young )、 老年代 ( Old )。 新生代 ( Young ) 又被划分为三个区域 Eden、 From Survivor、 To Survivor。 这样划分的目的是为了使...

elasticsearch之python备份

一:elasticsearch原理 Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。 但是,Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene非常复杂,...