弹性搜索中的确切查询搜索

时间:2015-12-09 05:14:50

标签: elasticsearch

如果单词“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)。如何过滤或添加脚本到“fields”参数?

2 个答案:

答案 0 :(得分:1)

尝试term查询。它会进行完全匹配搜索

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

术语查询与孟买和孟买不匹配,它将被视为不同的单词

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

第三个选项

带分析器选项的

match查询

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

答案 1 :(得分:1)

要让mumbai与仅包含mumbai的doc匹配,而不是其他任何东西,你必须为你正在搜索的字段存储一个令牌计数字段。 此令牌计数字段将包含该字段包含的令牌数。使用此字段,您可以在标题字段上匹配mumbai,并将token_count字段与孟买中的令牌数量(即一个)匹配。 请注意,其他文档中的token_count字段将超过1。

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

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