如何在 ElasticSearch 中查询带有停用词的短语

Tho*_*aux 5 lucene full-text-search elasticsearch

我正在索引一些启用了停用词的文本,我想使用“匹配短语”查询来搜索这些文本,但看起来停用词仍在考虑术语位置。

建筑指数:

PUT /fr_articles
{
   "settings": {
      "analysis": {
         "analyzer": {
            "stop": {
               "type": "standard",
               "stopwords" : ["the"]
            }
         }
      }
   },
   "mappings": {
      "test": {
         "properties": {
            "title": {
               "type": "string",
               "analyzer": "stop"
            }
         }
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

添加文档:

POST /fr_articles/test/1
{
    "title" : "Tom the king of Toulon!"
}
Run Code Online (Sandbox Code Playgroud)

搜索:

POST /fr_articles/_search
{
   "fields": [
      "title"
   ],
   "explain": true,
   "query": {
      "match": {
         "title": {
            "query": "tom king",
            "type" : "phrase"
         }
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

没有发现 ;-(

有办法解决吗?或者可能有多个跨度查询,但我希望这个词彼此靠近。

谢谢,

fem*_*gon 5

位置增量会导致此问题,是的。虽然停用词可能已消失且不可搜索,但它仍然不会将两个词推到彼此相邻的位置,因此查询"tom the king"既找不到"tom king"也找不到"such that tom will not be their king"

通常,当您使用过滤器在分析中删除某些内容时,并不完全像它从未存在过一样。的目的StopFilter尤其是删除由无趣的术语导致的搜索命中。它不是改变文档或句子的结构。

您曾经可以禁用位置增量 on StopFilter,但从 Lucene 4.4 开始,该选项已被删除。


好吧,忘记那个 CharFilter 傻瓜。丑陋的黑客,不要这样做。

要在不使用位置增量的情况下进行查询,您需要在查询解析器中进行配置,而不是在分析中进行配置。这可以在elasticsearch来完成,具有查询字符串查询,以enable_position_increments设置为false。

就像是:

{
    "query_string" : {
        "default_field" : "title",
        "query" : "\"tom king\""
        "enable_position_increments" : false
    }
}
Run Code Online (Sandbox Code Playgroud)

作为一个兴趣点,原始 Lucene 中的类似解决方案,通过设置QueryParser.setEnablePositionIncrements.