首页 文章

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

提问于
浏览
0

如果单词“mumbai”出现在 Headers 的任何地方,我会返回此查询 .

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

}
}
}'

我需要返回匹配精确孟买的 Headers (因此排序值为58) . 如何过滤或添加脚本到“fields”参数?

2 回答

  • 1

    要让mumbai与仅包含mumbai且没有其他内容的doc匹配,您必须为要搜索的字段存储令牌计数字段 . 此令牌计数字段将包含该字段包含的令牌数 . 使用此字段,您可以在 Headers 字段上匹配mumbai,并将token_count字段与孟买中的令牌数量(即一个)匹配 . 请注意,其他文档中的token_count字段将超过1 .

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

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

  • 1

    试试 term 查询 . 它会进行精确匹配搜索

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

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

    Second Option: 如果您可以更改映射,则可以将 title 字段设置为 not_analyzed

    Third Option

    match 使用分析器选项查询

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

相关问题