Elasticsearch 带状疱疹和停用词
Elasticsearch shingles and stopwords
https://www.elastic.co/guide/en/elasticsearch/guide/current/shingles.html 中的示例提到,标准的停用词过滤器在使用带状疱疹进行搜索时会产生负面影响,因为过滤器会用下划线替换停用词并生成带下划线的标记(与 "regular"文本查询)。
但是,它建议使用 Lucene 不再支持的 enable_position_increments 参数(至少在 ES 2.4 上会产生错误)。
有没有办法在不使用不受支持的 enable_position_increments 的情况下解决这个问题,或者达到相同的结果?还是下划线是可以解决的小问题?
我也在想,如果您使用相同的分析器进行搜索和索引,这是否不是问题:如果查询包含停用词,它们是否会被 _ 替换,从而生成与索引带状疱疹匹配的标记 (即使停用词不同)?
我发现一个可能的解决方案是在 shingle 过滤器上将 filler_token parameter 设置为空字符串,这样标记中的下划线将被简单地省略:
"filter_shingle": {
"type": "shingle",
"max_shingle_size": 5,
"min_shingle_size": 2,
"output_unigrams": "false",
"filler_token": ""
}
有人可以评论一下这是否达到了相同的结果,或者它是否会在评分或匹配方面产生任何无法预料的问题? _analyze 的结果似乎是正确的,省略了 _。
我用这种方式来处理这种情况
"filter_shingle": {
"type": "shingle",
"max_shingle_size": 2,
"min_shingle_size": 2,
"output_unigrams": "true",
"filler_token": ""
}.
"analyzer":[
"my_shingle":{
"filter":["lowercase","stop","filter_shingle","trim"],
"tokenizer": "standard"
}
]
https://www.elastic.co/guide/en/elasticsearch/guide/current/shingles.html 中的示例提到,标准的停用词过滤器在使用带状疱疹进行搜索时会产生负面影响,因为过滤器会用下划线替换停用词并生成带下划线的标记(与 "regular"文本查询)。
但是,它建议使用 Lucene 不再支持的 enable_position_increments 参数(至少在 ES 2.4 上会产生错误)。
有没有办法在不使用不受支持的 enable_position_increments 的情况下解决这个问题,或者达到相同的结果?还是下划线是可以解决的小问题?
我也在想,如果您使用相同的分析器进行搜索和索引,这是否不是问题:如果查询包含停用词,它们是否会被 _ 替换,从而生成与索引带状疱疹匹配的标记 (即使停用词不同)?
我发现一个可能的解决方案是在 shingle 过滤器上将 filler_token parameter 设置为空字符串,这样标记中的下划线将被简单地省略:
"filter_shingle": {
"type": "shingle",
"max_shingle_size": 5,
"min_shingle_size": 2,
"output_unigrams": "false",
"filler_token": ""
}
有人可以评论一下这是否达到了相同的结果,或者它是否会在评分或匹配方面产生任何无法预料的问题? _analyze 的结果似乎是正确的,省略了 _。
我用这种方式来处理这种情况
"filter_shingle": {
"type": "shingle",
"max_shingle_size": 2,
"min_shingle_size": 2,
"output_unigrams": "true",
"filler_token": ""
}.
"analyzer":[
"my_shingle":{
"filter":["lowercase","stop","filter_shingle","trim"],
"tokenizer": "standard"
}
]