Elasticsearch是否为不同长度Shingle赋予相同IDF?5.6.5版本场景咨询
Elasticsearch Shingle相关问题解答
1. Elasticsearch是否会对不同长度的shingle赋予相同的逆文档频率(IDF)?
答案是不会。
在Elasticsearch里,每个shingle都是作为独立的词条(term)存在的,IDF的计算逻辑完全基于整个索引中包含该词条的文档总数。举个实际例子:
- 2词shingle「depreciation tax」的IDF,取决于索引里有多少文档包含这个连续的双词组合;
- 3词shingle「depreciation tax credit」的IDF,则是看有多少文档包含这个连续三词组合。
这两个shingle的文档出现次数几乎不可能完全一致,所以它们的IDF值自然不同。当然,如果极端情况下某个长shingle和短shingle的文档出现次数碰巧一样,那IDF会相同,但这是巧合,不是Elasticsearch的默认机制导致的。
2. 关于Elasticsearch 5.6.5中shingle过滤器的搜索得分问题
先看你的shingle过滤器配置:
"filter_shingle":{ "max_shingle_size":"4", "min_shingle_size":"2", "output_unigrams":"true", "type":"shingle" }
这个配置会为目标字段生成:单字词(unigram)、2词shingle、3词shingle、4词shingle。
搜索「depreciation tax」时的得分解释
你看到的得分拆分成了两部分:
weight(Synonym(content:depreciation content:depreciation tax)):这里的Synonym说明你的索引大概率还配置了同义词过滤器,这部分得分来自同义词匹配(包括单字词「depreciation」的同义词,以及shingle「depreciation tax」的同义词,如果有的话);weight(content:tax):这是单字词「tax」的匹配得分。
之所以会有shingle的匹配得分,是因为你的查询会同时匹配单字词和生成的shingle词条,而shingle的匹配通常会比单字词组合的匹配权重更高(因为它是连续的短语匹配),所以这部分会拉高整体得分。
搜索「depreciation taffy」时的情况
针对同一文档搜索这个词的话,得分会出现明显变化:
- 文档里没有「taffy」这个词,所以单字词「taffy」的匹配得分会是0(或者极低的默认值);
- 由于文档里不存在「taffy」,自然也不会生成包含「taffy」的shingle,所以这部分完全匹配不到;
- 最终得分只会来自「depreciation」的单字词匹配(以及对应的同义词匹配,如果有的话),整体得分会比搜索「depreciation tax」时低很多。如果你的查询是短语查询(
match_phrase),甚至可能直接匹配不到该文档。
内容的提问来源于stack exchange,提问作者LaserJesus
相关产品推荐
相关产品推荐

