【问题标题】:Elasticsearch shingles and stopwordsElasticsearch 带状疱疹和停用词
【发布时间】:2017-07-13 22:41:01
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: elasticsearch elasticsearch-2.0


    【解决方案1】:

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

    "filter_shingle": {
                    "type": "shingle",
                    "max_shingle_size": 5,
                    "min_shingle_size": 2,
                    "output_unigrams": "false",
                    "filler_token": ""
                }
    

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

    【讨论】:

    • 在测试带和不带下划线的带状疱疹后,我在elastic.co/guide/en/elasticsearch/guide/current/shingles.html 的示例中得到了完全相同的分数
    • 小心这个,因为它可能会导致意想不到的结果。例如,假设在木瓦之前运行了一个停用词过滤器。一串 "The Brown Fox" 将返回 [" Brown", " Brown Fox", ...] (注意剩下的空格)。这可能会像匹配短语一样抛出查询,因为查询开头需要一个空格。
    【解决方案2】:

    我用这种方式来处理这种情况

    "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"
      }
    ]
    

    【讨论】:

      猜你喜欢
      • 2015-02-09
      • 1970-01-01
      • 2017-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      • 1970-01-01
      相关资源
      最近更新 更多