如何在ElasticSearch中使用停用词查询短语

时间:2015-07-30 08:52:58

标签: lucene full-text-search elasticsearch

我正在使用停用词启用某些文字的索引,我想使用"匹配词组"来搜索这些文字。查询没有slop,但看起来停顿词仍然考虑到术语位置。

建筑指数:

PUT /fr_articles
{
   "settings": {
      "analysis": {
         "analyzer": {
            "stop": {
               "type": "standard",
               "stopwords" : ["the"]
            }
         }
      }
   },
   "mappings": {
      "test": {
         "properties": {
            "title": {
               "type": "string",
               "analyzer": "stop"
            }
         }
      }
   }
}

添加文档:

POST /fr_articles/test/1
{
    "title" : "Tom the king of Toulon!"
}

搜索:

POST /fr_articles/_search
{
   "fields": [
      "title"
   ],
   "explain": true,
   "query": {
      "match": {
         "title": {
            "query": "tom king",
            "type" : "phrase"
         }
      }
   }
}

什么都没找到; - (

有没有办法解决它?或者可能有多个跨度查询,但我希望该术语彼此接近。

谢谢你,

2 个答案:

答案 0 :(得分:4)

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

通常情况下,当您使用过滤器删除分析中的某些内容时,它并不像从未出现过那样。特别是StopFilter的目的是删除由不感兴趣的术语导致的搜索命中。它不是要改变文件或句子的结构。

您以前可以在StopFilter上禁用位置增量,但该选项已被删除,自Lucene 4.4起。

好的,忘了CharFilter tomfoolery。丑陋的黑客,不要这样做。

要在不使用位置增量的情况下进行查询,您需要在查询解析器中进行查询,而不是在分析中进行配置。这可以在elasticsearch中完成,Query String Queryenable_position_increments设置为false。

类似的东西:

{
    "query_string" : {
        "default_field" : "title",
        "query" : "\"tom king\""
        "enable_position_increments" : false
    }
}

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

答案 1 :(得分:0)

您可以设置一个选项enable_position_increments: false,例如在一个停止过滤器中,但自Lucene 4.4以来它已被弃用

这是相关的Lucene问题:https://issues.apache.org/jira/browse/LUCENE-4065

换句话说,目前最好的方法可能是使用slop选项,直到修复Lucene问题