我可以将文本的默认类型定义为对象类型中的关键字吗?

Can I define default type for text as keyword inside an object type?

假设我有以下映射:

{
    "mappings": {
        "_doc": {
            "properties": {
                "id":       {"type": "keyword"},
                "params":   {
                    "type": "object",
                },
            }
        }
    }
}

params 有很多带有数字和文本值的字段。我不想指定它的所有字段,但我想指定所有文本字段应该是 keyword 类型而不是 text 类型,这是默认的并且是分析的(我想要避免)。

我该怎么做?我正在使用 ElasticSearch 6.7

这称为动态模板(参见 https://www.elastic.co/guide/en/elasticsearch/reference/6.7/dynamic-templates.html

对于你的问题,你可以定义映射如下:

PUT my_index
{
  "mappings": {
    "_doc": {
      "dynamic_templates": [
        {
          "strings": {
            "match_mapping_type": "string",
            "mapping": {
              "type": "keyword"
            }
          }
        }
      ]
    }
  }
}

这会将所有检测到的 string 字段转换为 keyword。如果只想应用于字段的子集,可以使用 matchunmatchpath_matchpath_unmatch 子句。 (有关它们之间的差异,请参阅文档)。

添加 @banuj 提到的内容:

看来可以结合match_mapping_type and path_match来达到我想要的效果

PUT my_index
{
  "mappings": {
    "_doc": {
      "dynamic_templates": [
        {
          "keyword params": {
            "mapping": {
              "type": "keyword"
            },
            "match_mapping_type": "string",
            "path_match": "params.*"
          }
        }
      ]
    }
  }
}