Elasticsearch 查询以在字符串字段上找到完全匹配(不分析)

Elasticsearch query to find exact match on string field ( Without analyzing )

我们在索引中存储类别,这里是类别的映射

"name": {
     "type": "string",
     "analyzer": "autocomplete",
     "search_analyzer": "standard"
 }

现在,我们要对该字段进行精确搜索,这是我们正在尝试的查询

    {
      "from": "0",
      "size": "15",
      "query": {
        "filtered": {
          "query": {
            "bool": {
              "must": [
                {
                  "multi_match": {
                    "query": "a",
                    "type": "cross_fields",
                    "fields": [
                      "field1^20",
                      "filed1^12"
                    ]
                  }
                },
                {
                  "match": {
                    "category.name": "Arts and Culture"
                  }
                }
              ]
            }
          },
          "filter": {
            "bool": {
              "must": [
                {
                  "terms": {
                    "address_type": [
                      "val1",
                      "val2"
                    ]
                  }
                },
                {
                  "terms": {
                    "status": ["Active","Inactive"]
                  }
                }
              ]
            }
          }
        }
      }
    }

但它不完全匹配,我不想更改映射,因为我们还想在其他一些用例中进行部分搜索。

我只想在查询中进行一些修改来进行精确匹配,是否可行或有任何解决方法?

感谢您的帮助。

映射会影响数据的存储方式以及查询该字段的方式。您的类别字段(名为 name)字段配置为用于自动完成而不是用于精确匹配搜索。所以你必须改变映射以支持精确匹配搜索。

但是,您可以在不更改当前字段的情况下执行此操作,而只需通过将您的字段转换为多字段并添加一个支持精确匹配查询的字段来添加一个额外的字段。映射片段:

"name":{ "type": "string", "analyzer": "autocomplete", "search_analyzer": "standard", "fields":{ "raw":{ "type" "string", "index": "not_analyzed" } } } }

注意:我注意到您使用的是旧版本的 Elasticsearch(类型 "string" 已替换为类型 "text"(对于全文-search) 和 "keyword"(用于精确匹配搜索)。我试图想出一个适用于旧版本 Elasticsearch 的映射,并希望它有效。如果不是,您需要提供您正在使用的 Elasticsearch 版本。

修复映射后,您需要确保该字段也已填充。您可以通过执行以下请求重新索引所有内容来做到这一点:

POST <your_index_name>/_update_by_query

在您的查询中,您需要按如下方式搜索(精确匹配):

"match": {
  "category.name.raw": "Arts and Culture"
}

对于部分搜索,您将继续使用 category.name-字段(没有后缀 raw