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

标签 lucene full-text-search elasticsearch

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

建筑索引:

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

没有找到;-(

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

谢谢你,

最佳答案

位置增量导致了这个问题,是的。虽然停用词可能已经消失且不可搜索,但它仍然不会将这两个词推到一起,因此查询 "tom the king" 找不到 "tom king" 也不是 “这样汤姆就不会成为他们的国王”

通常,当您使用过滤器删除分析中的某些内容时,它并不像从未存在过一样。 StopFilter 的目的尤其在于删除由不感兴趣的字词引起的搜索命中。它不是改变文档或句子的结构。

您过去可以在 StopFilter 上禁用位置增量,但从 Lucene 4.4 开始,该选项已被删除。


好吧,忘掉那个 CharFilter 的傻瓜吧。丑陋的 hack,不要那样做。

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

类似于:

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

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

关于lucene - 如何在 ElasticSearch 中查询带有停用词的短语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31719249/

相关文章:

Lucene IndexSearcher 线程安全

ruby-on-rails - 使用 Postgres 全文搜索来搜索完全匹配的最佳方法是什么?

elasticsearch - 复杂 Elasticsearch 查询

lucene - 找出 maxClauseCount 设置为 1024 错误的原因

java - Lucene复合查询搜索

search - 在 sitecore 中搜索内容项时出错

mysql - 我无法让 MySQL 全文搜索工作

安卓全文搜索

templates - 在Elastic中搜索模板以获取过滤器,并且应该

php - Elasticsearch 映射整数或长整型