【问题标题】:exact query search in elasticsearchelasticsearch中的精确查询搜索
【发布时间】:2016-03-14 06:40:45
【问题描述】:

如果“mumbai”一词出现在标题中的任何位置,我会返回此查询。

{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "term": {
          "title": "mumbai"
        }
      }
    }
  }
}

所以结果包含...

mumbai
mumbai ports
financial capital mumbai

我只需要返回“mumbai”词,而不是 mumbai 词与其他短语相关联的其他文档。只有第一个结果是正确的。如何丢弃其他结果?


更新

此查询按预期工作,如果匹配准确,它将列出排序值 58(随机值)。

curl -XPOST "localhost:9200/enwiki_content/page/_search?pretty" -d'
{ 
    "fields": "title",
    "query": {
        "match": {"title": "Mumbai"}
    },
    "sort": {
    "_script": {
        "script":  "_source.title == \"Mumbai\" ? \"58\": \"78\";",
        "type": "string" 

}
}
}'

我需要返回完全匹配孟买的标题(因此排序值为 58)。如何过滤或将脚本添加到“字段”参数?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    要让 mumbai 与仅包含 mumbai 而没有其他内容的 doc 匹配,您必须为正在搜索的字段存储一个令牌计数字段。 此令牌计数字段将包含该字段包含的令牌数。使用此字段,您可以在 title 字段中匹配 mumbai,并将 token_count 字段与 mumbai 中的令牌数(即 1)匹配。 注意其他文档中的token_count字段会大于1。

    供参考: https://www.elastic.co/guide/en/elasticsearch/reference/current/token-count.html

    注意:如果您使用的是停用词,那么您需要了解与令牌计数相关的其他注意事项。您可以在上面的链接中找到信息。

    【讨论】:

      【解决方案2】:

      试试term 查询。它将进行精确匹配搜索

      {
          "query": {
              "bool": {
                  "must": [
                      {
                          "term": {
                              "title": "mumbai"
                          }
                      }
                  ]
              }
          }
      }
      

      词条查询不会匹配Mumbai和mumbai,会被算作不同的词

      第二个选项: 如果可以更改映射,则可以将title 字段设置为not_analyzed

      第三个选项

      match 使用分析器选项查询

      {
        "query": {
          "match": {
            "title": {
              "query": "mumbai",
              "analyzer": "keyword"
            }
          }
        }
      }
      

      【讨论】:

      • 请注意,山塔诺已经有一个术语查询,正在寻求不同的解决方案。所以这里只有你的第二个选择是一个可行的选择。
      • Shantanuo 使用过滤查询,在上述情况下对 match_all 查询的结果应用过滤。在 2.0-beta elastic.co/guide/en/elasticsearch/reference/current/… 中也弃用了过滤查询
      • 这没什么区别,match_all 是所有文档的传递。如果它不在那里,那将是一样的。我的意思是您的查询和他的查询是等价的。 filtered 可能在 ES 2.0 中被弃用,但 1)仍然有效,2)我们不知道他是否使用 2.0。在我看来,这不是手头的问题。相反,我会扩展您的第二个选项,这更有可能是他所追求的。
      • 这些选项都不起作用,我仍然得到所有 3 个文档。我无法更改映射(可能是因为我不知道如何)。但这对查询有困难吗?
      猜你喜欢
      • 1970-01-01
      • 2013-10-07
      • 2020-02-24
      • 1970-01-01
      • 2020-10-09
      • 1970-01-01
      • 2021-03-27
      • 2017-04-02
      • 2016-11-04
      相关资源
      最近更新 更多