zoukankan      html  css  js  c++  java
  • 理解Lucene中的Query

    Query是一个接口,它有很多实现类。
    QueryParser是Query解析器,用于将一个字符串解析为一个Query对象,这个Query对象可能属于TermQuery,也可能属于PhraseQuery、TermQuery、BooleanQuery等。可以通过Query对象的getClass()方法来查看这个对象到底是哪个实现类。

    Lucene已经给我们提供了很多Query查询器,如PhraseQuery,SpanQuery那为什么还要提供QueryParser呢?或者说设计QueryParser的目的是什么?QueryParser的目的就是让你从众多的Query实现类中脱离出来,因为Query实现类太多了,你有时候会茫然了,我到底该使用哪个Query实现类来完成我的查询需求呢,所以Lucene制定了一套Query语法,根据你传入的Query语法字符串帮你把它转换成Query对象,你不用关心底层是使用什么Query实现类。

    Query是一个抽象类,它的子孙包括:

    TermQuery:最简单的查询

    Term就是一个“键”。
    Lucene基本原理就是倒排索引,而倒排索引实际上相当于一种哈希。这种哈希需要键,在英语中键是单词,在汉语中键是分词之后的词语(也就是token)。
    Term查询的就是包含单个词语的文章。
    如果把“我爱中国”作为TermQuery来查询,那么结果很可能为null,因为“我爱中国”不是一个词语,建立索引时,没有把“我爱中国”作为键。

    PrefixQuery:已知Term的前缀,查询多个Term

    TermQuery只能查询固定的Term,PrefixQuery可以查询多个Term,这些Term的前缀都是相同的。

    BooleanQuery:与或搜索

    public void add(Query query, boolean required, boolean prohibited);
    required表示必须满足query,prohibited表示必须不满足query
    二者组合有4中情况:
    true,true:不可能出现这种情况
    true,false:必须满足
    false,true:必须不满足
    false,false:满足不满足都可以

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

    RangeQuery:在某一范围内搜索

    它需要参数begin和end,这两个参数都是Term类型的。

    MultiFieldQueryParser:多个域查询

    StandardAnalyzer analyzer = new StandardAnalyzer();
    MultiFieldQueryParser q = new MultiFieldQueryParser(new String[] {"title","tag" }, analyzer);
    

    PhraseQuery:若干个Term顺次连在一起

    这些个Term是近似连续的。
    可以设置slop参数来放松限制,slop表示的是编辑距离。

    PrefixPhraseQuery

    FuzzyQuery

    只能模糊化查询一个Term

    WildcardQuery:通配符查询

    SpanQuery:包含单词位置信息的查询

    SpanQuery是一个抽象类,它包含了单词的位置信息、长度信息。
    由SpanQuery衍生出的一系列Query:
    SpanTermQuery:词距查询的基础,结果和TermQuery相似,只不过是增加了查询结果中单词的距离信息。
    SpanFirstQuery:在指定距离可以找到第一个单词的查询。
    SpanNearQuery:查询的几个语句之间保持者一定的距离。
    SpanOrQuery:同时查询几个词句查询。
    SpanNotQuery:从一个词距查询结果中,去除一个词距查询。

    SpanQuery位于search.span包下

  • 相关阅读:
    MongoDB笔记
    mysql笔记
    08-下载中间件
    ubuntu1804安装pycharm2018.3.x
    02-CSS基础
    14-eval 函数
    13-文件
    12-模块和包
    11-异常
    有关dir和 unittest
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/6540155.html
Copyright © 2011-2022 走看看