Elastic search常用分词 和 多字段搜索优化

分词器

ES的分词器把文本解析为一个一个的词,写入倒排索引中

filter过滤器

  • lemmagen 词性还原
  • stop 停顿词
  • shingle 临近词n个作为一组查询

analyzer分词器

  • standard标准分词器

多字段搜索优化

bool 查询采取 more-matches-is-better 匹配越多越好的方式,所以每条 match 语句的评分结果会被加在一起,从而为每个文档提供最终的分数 _score 。

boost 权重

{
    "multi_match": {
        "query":                "Quick brown fox",
        "type":                 "best_fields",  //默认类型
        "fields":               [ "title", "body^2" ], // ^2指定权重,*可以模糊匹配
        "tie_breaker":          0.3,
        "minimum_should_match": "30%"  //被传递到match查询中
    }
}

最佳字段best_fields

bool 是如何计算评分的:

  1. 它会执行 should 语句中的两个查询。
  2. 加和两个查询的评分。
  3. 乘以匹配语句的总数。
  4. 除以所有语句总数(这里为:2)。

dis_max 即分离 最大化查询(Disjunction Max Query):

将任何与任一查询匹配的文档作为结果返回,但只将最佳匹配的评分作为查询的评分结果返回

以通过指定 tie_breaker 这个参数将其他匹配语句的评分也考虑其中;合理值应该与零接近(处于 0.1 - 0.4 之间)

多数字段most_fields

全文搜索被称作是 召回率(Recall) 与 精确率(Precision) 的战场: 召回率 ——返回所有的相关文档; 精确率 ——不返回无关文档。目的是在结果的第一页中为用户呈现最为相关的文档。

入索引可以使用不同的字段。一个是原字段(提升召回率),一个是经过词干提取、同义词处理、变音和口音词处理的字段(提升精确率)

同时可以调整boost参数指定哪个字段更重要

我们希望将所有匹配字段的评分合并起来,所以使用 most_fields 类型。这让 multi_match 查询用 bool 查询将两个字段语句包在里面,而不是使用 dis_max 查询

字段中心式(field-centric) 和 词中心式(term-centric)

字段中心式三个问题:

  1. 多个字段匹配相同的词 会比 一个字段完全匹配 的得分高
  2. and 操作符或设置 minimum_should_match 剪长尾 的效果不对
  3. 词频 的 TF 和 ITF工作方式 可能有问题
    词频TF

一个词在单个文档的某个字段中出现的频率越高,这个文档的相关度就越高。

逆向文档频率ITF

一个词在所有文档某个字段索引中出现的频率越高,这个词的相关度就越低。

cross_fields跨字段查询

词中心式查询
天然解决第一个问题
cross_fields 类型首先分析查询字符串并生成一个词列表,然后它从所有字段中依次搜索每个词。这种不同的搜索方式很自然的解决了 字段中心式 查询三个问题中的二个。


版权声明:本文为m0_37561165原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。