多字段Map在ElasticSearch中是如何工作的

q3qa4bjr  于 2022-12-26  发布在  ElasticSearch
关注(0)|答案(1)|浏览(151)

我想在我的elasticsearch索引中的一个字段上同时支持文本搜索(匹配查询)和精确匹配(术语查询)。
下面是我创建的Map:

PUT multi_mapping_test/_mapping
{
  "properties": {
    "name": {
      "type": "text",
      "fields": {
        "keyword": {
          "type": "keyword"
        }
      }
    }
  }
}

然而,术语查询的行为并不像我所期望的那样(可能是对它的理解有误)。
例如,下面是几个已编入索引的示例文档:

POST multi_mapping_test/_doc
{
  "name": "abc llc"
}

POST multi_mapping_test/_doc
{
  "name": "def llc"
}

以下术语查询未产生结果:

GET multi_mapping_test/_search
{
  "query": {
    "term": {
      "name": {
        "value": "abc llc"
      }
    }
  }
}

我做错了什么吗?或者我对术语查询精确匹配的理解不正确?
P.S.当我为 only关键字类型放置Map时,术语查询工作正常。

kg7wmglp

kg7wmglp1#

字词查询:返回在提供的字段中包含精确字词的文档。搜索精确匹配时,应使用关键字字段类型。如下所示:

GET multi_mapping_test/_search
{
  "query": {
    "term": {
      "name.keyword": {
        "value": "abc llc"
      }
    }
  }
}

此外,您可以使用bool query在您的ElasticSearch索引中进行文本搜索(匹配查询)和精确匹配(术语查询)。

GET multi_mapping_test/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "name": "abc llc"
          }
        },
        {
          "term": {
            "name.keyword": {
              "value": "abc llc"
            }
          }
        }
      ],
      "minimum_should_match": 1
    }
  }
}

注:如果需要自动完成特征,也可以使用match_bool_prefix查询。详细信息:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-bool-prefix-query.html

“abc llc”_score将高于“def llc”,因为它同时匹配匹配查询和术语查询。

相关问题