ElasticSearch全文检索

全文检索最重要的两个方面:
- 相关度:根据文档与查询的相关程度对结果集进行排序的能力。相关度可以使用TF/IDF、地理位置详尽程度、模糊相似度或者其它算法计算。
- 分析:将一段文本转换为一组唯一的、标准化了的标记token,用来创建倒排索引、查询倒排索引。
一旦提到相关度和分析,指的都是查询而非过滤!!!


基于短语VS基于全文

所有的查询都会进行相关度计算,但不是所有查询都有分析阶段。
像bool或者function_score这样的查询并不在文本字段执行。
文本查询有两大类:

基于短语的查询Term-based

像term或者fuzzy一类的查询是低级查询,它们没有分析阶段。
这些查询在单一的短语上执行,例如对单词“xxx”的查询会在倒排索引里面精确查找“xxx”这个词,并对每个包含这个单词的文档计算TF/IDF相关度“_score”。也就是说,term查询精确查找特定短语,不匹配短语的其他变形。

全文检索Full-text

match和query_string这样的查询是高级查询,它们对字段进行分析的方式如下:
- 如果检索一个date或者integer字段,则把查询语句作为日期或者整数格式数据;
- 如果检索一个准确值的字符串字段,则把整个查询语句作为一个短语;
- 如果检索一个全文本字段,查询会先用适当的解析器解析查询语句,产生需要查询的短语列表,然后对列表中的每个短语执行低级查询,合并查询结果,得到最终的文档相关度。
全文检索内部最终还是使用基于短语的查询。
如果确实需要查询一个准确值字段,需要考虑应该使用查询还是过滤器。


匹配查询

无论搜索什么内容,match查询是首先需要接触的查询。它是一个高级查询,意味着match查询知道如何更好地处理全文检索和准确值检索。
match查询一个主要用途是进行全文搜索。
一个简单的匹配查询的执行步骤:
- 检查field类型;
- 分析查询字符串;
- 找到匹配的文档;
- 为每个文档打分(词频,逆文档频率,包含查询短语的字段长度等等);

多词匹配

match查询可以进行多词查询。
多个关键词的时候,ES内部会执行两个term查询并综合二者的结果得到最终的结果,match的实现方式是将两个term查询放入一个bool查询。
match查询接收一个operator参数,默认为“or”,如果要求所有查询关键字都匹配,可以更改参数值为“and”(提高精度)。

"match": {
    "title": {
        "query": "xxx yyy!",
        "operator": "and"
    }
}

介于and和or之间的选项:match查询有“minimum_should_match”参数,参数值表示被视为相关的文档必须匹配的关键词个数。参数值可以设置为证书,也可以设置为百分数。

组合查询

bool查询与bool过滤的区别在于:布尔查询会计算相关性。
bool查询通过把所有复合must和should的子句得分加起来,然后除以must和should子句的总数为每个文档计算相关性得分;must_not子句并不影响得分,它仅仅用来排除已经被包含的文档。
精度控制:
- must子句必须匹配;
- must_not子句必须不匹配;
- should子句默认情况下不需要匹配,但是如果没有must子句,就必须至少匹配一个should子句。
- 如同match查询精度控制一样,也可以通过mimimum_should_match参数控制多少should子句需要被匹配。

match匹配与bool查询

  • match相当于bool的should;
  • match增加operator为and,相当于bool的must;
  • match增加minimum_should_match相当于bool增加minimum_should_match;
    可以在查询子句中指定一个boost值来控制相对权重,默认值为1,大于1的boost值可以提高查询子句的相对权重。
{ 
    "match": {
        "content": {
            "query": "Elasticsearch",
            "boost": 3
        }
    }
}

boost参数用来提高自居的相对权重(大于1)或者降低子句的相对权重(介于0到1),但是提高和降低并非线性的。
boost值被使用了以后新的得分是标准的。

控制分析

查询仅能查找在倒排索引中出现的词,所以确保在文档索引的时候以及字符串查询的时候使用同一个分析器是很重要的,为了查询的词能够在倒排索引中匹配到。
字段可以配置分析器,通过analyzer。
像match查询一样的高级别的查询可以知道字段的映射并且能够在被查询的字段上使用正确的分析器。

默认分析器

虽然可以在字段级别指定一个分析器,但是如果没有指定的话,ES会指定磨人的分析器。
分析器可以在好几个地方设置,ES会查找每个级别知道找到它可以使用的分析器,顺序如下:
- 在映射文件中指定字段的analyzer;
- 在文档的_analyzer字段上指定分析器;
- 在映射文件中指定类型的默认分析器analyzer;
- 在索引映射文件中设置默认分析器default;
- 在节点级别设置默认分析器default;
- standard分析器。
查找缩印的时候,ES查找分析器的顺序不太一样:
- 查询参数中指定analyzer;
- 映射文件中指定字段的analyzer;
- 映射文件中指定类型的默认分析器analyzer;
- 索引映射文件中设置默认分析器default;
- 节点级别默认分析器default;
- standard分析器;
可以通过使用索引模板来指定新的索引的配置和映射。

关联失效

ElasticSearch默认的相似算法,叫做词频率/反转文档频率(TF/IDF)。
词频率是一个词在当前查询的文档字段中出现的次数,出现次数越多,相关性越大。
反转文档频率指的是该索引中所有文档数与出现这个词的文文档数的百分比,词出现的频率越大,IDF越小。
由于性能问题,ES不通过索引中所有的文档计算IDF,每个分片会为分片中所有的文档计算一个本地的IDF取而代之。
如果文档索引很好地进行了分布式(文档出现在多个主分片中),那么本地IDF和全局IDF之间是有差别的。但是这个差别会随着数据量的增大而减小。

猜你喜欢

转载自blog.csdn.net/achang07/article/details/79728069