Elasticsearch 带状疱疹和停用词

jmn*_*mng 5 elasticsearch elasticsearch-2.0

https://www.elastic.co/guide/en/elasticsearch/guide/current/shingles.html 上的示例提到,当使用带状疱疹搜索时,停用词的标准过滤器会产生负面影响,因为过滤器将停用词替换为下划线并生成带有下划线的标记(与“常规”文本查询不匹配)。

但是,它建议使用Lucene 不再支持的enable_position_increments参数(并且至少在 ES 2.4 上会产生错误)。

有没有办法在不使用不受支持的 enable_position_increments 的情况下解决这个问题或达到相同的结果?或者下划线是一个可以解决的小问题?

我也在想,如果您使用相同的分析器进行搜索和索引编制,这是否可能不是问题:如果查询包含停用词,它们是否会被 _ 替换,从而生成与索引的带状疱疹匹配的标记(即使停用词是不同的)?

jmn*_*mng 4

我发现一个可能的解决方案是将fill_token 参数设置为 shingle 过滤器上的空字符串,因此下划线将简单地从标记中省略:

"filter_shingle": {
                "type": "shingle",
                "max_shingle_size": 5,
                "min_shingle_size": 2,
                "output_unigrams": "false",
                "filler_token": ""
            }
Run Code Online (Sandbox Code Playgroud)

有人可以评论这是否达到相同的结果,或者是否会产生有关评分或匹配的任何不可预见的问题?_analyze 的结果似乎是正确的,_ 被省略。

  • 请小心这一点,因为它可能会导致意想不到的结果。例如,假设在木瓦之前运行了一个停用词过滤器。一串“The Brown Fox”将返回[“Brown”,“Brown Fox”,...](注意剩下的空格)。这可能会导致像匹配短语这样的查询失败,因为查询开头需要有一个空格。 (2认同)