Elasticsearch同义词、停用词过滤器异常及查询结果不符问题求助
一、单向同义词无匹配结果的原因
你配置的单向同义词International Cricket Council => ICC, I.C.C,在索引阶段会把原文本中的"International Cricket Council"替换成"ICC"和"I.C.C"(再经过小写过滤器处理为"icc"和"i.c.c"),原短语的三个分词(international、cricket、council)不会被保留在倒排索引中。
而当你执行包含"international""Cricket""Council"的多条件match查询时,查询文本会被分析器处理为这三个词的小写形式,但倒排索引里根本没有这些词,自然无法匹配到任何结果。
反之,match_phrase查询"icc"时,查询文本被处理为"icc",和倒排索引中存储的token完全匹配,所以能得到预期结果。
二、双向同义词的高亮与计数问题原因
1. 不必要的高亮
双向同义词映射International Cricket Council, ICC, I.C.C => International Cricket Council, ICC, I.C.C会让索引阶段和查询阶段都将所有相关词/短语互相转换:
- 索引时,原文本"International Cricket Council"会被转换成三个条目:原短语的分词(international、cricket、council)、"icc"、"i.c.c",全部存入倒排索引。
- 查询时,比如你查"icc",查询文本会被转换成"international cricket council"、"icc"、"i.c.c"三个查询条件。这时候,哪怕文档里只有原短语,也会被匹配到,高亮时就会把原短语标出来——但你实际只想高亮"icc"相关内容,所以会觉得是不必要的高亮。
2. 大数据量下计数不符
这种双向等价映射会导致查询范围被无意义扩大:当你查询"International Cricket Council"时,查询文本会被转换成三个查询条件,只要文档里包含其中任意一个(比如只含"icc"的文档),都会被纳入结果集。这就导致实际匹配的文档数远多于你期望的「仅包含原短语」的文档数,出现计数不符的情况。
另外,如果使用的是普通synonym过滤器而非synonym_graph,多词短语的同义词处理会更混乱——普通过滤器无法正确识别短语同义词,会把多词拆成单个token,进一步导致倒排索引中出现冗余条目,放大计数误差。
内容的提问来源于stack exchange,提问作者randomDev

