Multi-field Mapping

multi_field (多域类型)允许你对同一个值以映射的方式定义成多个基本类型。这个非常有用,比如,一个 string 类型字段可以被映射成 text 字段作为 full-text 进行搜索,同时也可以作为 keyword 字段用于排序和聚合。

下面来看个例子:

PUT /multi_field_test
{
  "mappings": {
    "properties": {
      "description":{
        "type": "text"
      },
      "ingredients":{
        "type": "text",
        "fields": {
          "keyword":{
            "type":"keyword"
          }
        }
      }
    }
  }
}

我们是定义一个名为 ingredients 的字段, 它的数据类型是 string 字符类型, 该字段映射了两次(实际物理上产生了2个索引字段),一个是text 分词类型,另外一个定义成了keyword 类型,即不分词处理。

往索引中插入一条文档:

POST /multi_field_test/_doc
{
  "description": "To make this spaghetti carbonara...",
  "ingredients": ["Spaghetti", "Bacon", "Eggs"]
}

image-20220720095422249

此时ingredients字段会产生两个索引(text和keyword):

image-20220717232638212

进行match query查询:

image-20220720100223560

进行term query查询:

image-20220720100256019

可见无论是使用match query还是term query,都能查询到结果