ElasticSearch中字符串类型(Text和keyword)的选择

Elasticsearch2021-02-23 05:40:58320条
ElasticSearch 5.0以后,字符串类型有重大变更,移除了string类型,string字段被拆分成两种新的数据类型: text和keyword。

ElasticSearch 5.0以后,字符串类型有重大变更,移除了string类型,string字段被拆分成两种新的数据类型:textkeyword

text

  1. 会分词,然后进行索引,用于全文搜索。
  2. 支持模糊、精确查询
  3. 不支持聚合

keyword

  1. 不进行分词,直接索引,keyword用于关键词搜索
  2. 支持模糊、精确查询
  3. 支持聚合

如果不指定类型,ElasticSearch字符串将默认被同时映射成text和keyword类型,会自动创建下面的动态映射(dynamic mappings):

{
    "foo": {
        "type": "text",
        "fields": {
            "keyword": {
                "type": "keyword",
                "ignore_above": 256
            }
        }
    }
}

这就是造成部分字段还会自动生成一个与之对应的.keyword字段的原因。

可以手动指定类型:

PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "name": {
          "type": "text"
          }
        }
      }
    }
  }
}

一个字符串字段可以映射为text字段用于全文本搜索,也可以映射为keyword字段用于排序或聚合,这时候需要用到fields设置多字段。如果业务关系中,需要该字段支持两种类型的查询,可以设置为如下形式:

PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "name": {
          "type": "text",
          "fields": {
            "raw": { 
              "type":  "keyword"
            }
          }
        }
      }
    }
  }
}

name.raw字段是name字段的keyword版本。

拓展:fields多字段另一个应用场景是,设置不同的字段解析器

PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "name": { 
          "type": "text",
          "fields": {
            "english": { 
              "type":     "text",
              "analyzer": "english"
            }
          }
        }
      }
    }
  }
}

text类型字段,解析器遇到空格时,会进行分词,比如abc, def会被分成[abc,def],但是abc,def不会拆分

评论啦~
暂无评论,快来抢沙发吧!