分词器
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 是如何计算评分的:
- 它会执行 should 语句中的两个查询。
- 加和两个查询的评分。
- 乘以匹配语句的总数。
- 除以所有语句总数(这里为: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)
字段中心式三个问题:
- 多个字段匹配相同的词 会比 一个字段完全匹配 的得分高
- and 操作符或设置 minimum_should_match 剪长尾 的效果不对
- 词频 的 TF 和 ITF工作方式 可能有问题
词频TF
一个词在单个文档的某个字段中出现的频率越高,这个文档的相关度就越高。
逆向文档频率ITF
一个词在所有文档某个字段索引中出现的频率越高,这个词的相关度就越低。
cross_fields跨字段查询
词中心式查询
天然解决第一个问题
cross_fields 类型首先分析查询字符串并生成一个词列表,然后它从所有字段中依次搜索每个词。这种不同的搜索方式很自然的解决了 字段中心式 查询三个问题中的二个。
版权声明:本文为m0_37561165原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。