【Elasticsearch】索引结构
Elasticsearch
索引主要结构有mapping
和setting。
Mapping:
索引的Mapping可以类比关系型数据库中的Schema,主要包含:
定义索引中字段名称
定义字段数据类型,如:字符串、数字、boolean等
可对字段设置倒排索引相关配置,如是否需要分词,使用什么分词器
注意:
ElasticSearch从7.x版本开始,一个Mapping只属于一个索引type,即一个索引只能有一个类型type,默认type 为_doc。
mapping结构示例:
#mappings关键字 "mappings": { #字段名称和类型的定义 "properties": { #字段名 "@timestamp": { #字段数据类型 "type": "date" }, "@version": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "calls": { "type": "long" }, "day": { "type": "date" }, "weekly": { "type": "text", #数据类型通过 fields 参数支持多字段,通过 fields 来定义 keyword 字段,这样就可以通过 weekly.keyword 来实现排序或者聚合 "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } }
mapping中的字段数据类型
每个字段都有一个数据数据type:
text,keyword,date,long, double,boolean等简单类型
支持JSON分层性质的类型,如 object,nested
一种特殊类型,如geo_point, geo_shape,completion。
出于不同目的,以不同方式,对同一字段建立索引通常很有用, 例如:
一个字符串字段可以被索引为text全文搜索字段,也可以被索引为keyword排序或聚合字段,还可以使用standard分析器等分词器为字符串字段建立索引
大部分数据类型通过fields参数支持多字段,在上面例子中,通过fields来定义keyword字段,这样就可以通过name.keyword来实现排序或者聚合。
注意:
mapping
中字段类型一旦设定后禁止直接修改。因为lucene
实现的倒排索引生成后不允许修改,所以在定义字段类型时候要考虑清楚。
mapping动态映射
Elasticsearch提供了动态映射的功能,即会根据用户输入的内容进行动态映射,功能如下:
在写入文档时,如果索引不存在,会自动创建索引,这种机制,使得用户无需手动定义mappings。
Elasticsearch会自动根据文档信息,推算出字段的类型,有时候,Elasticsearch`可能会推算不准确,如:地理位置信息,当类型推算得不对时,可能导致一些功能无法正常运行,如Range查询。
尽管动态映射对于入门者来说非常有用,但有时仍需要自己显式指定映射,因为动态映射的类型和分词器不一定符合自身要求。所以可以在创建索引时创建字段Mapping 映射 ,也可以使用PUT Mapping API将字段添加到现有索引中:(创建指定mapping结构的索引)
PUT /索引名称 { "mappings": { "properties": { "@timestamp": { "type": "date" }, "@version": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "day": { "type": "date" }, "telephone_traffic": { "type": "float" }, "weekly": { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } } } } }
给索引添加新字段并显示指定类型和分析器
PUT /索引名称/_mapping { "properties": { "english_title": { "type": "text", "analyzer": "english" } } }
来源:ElasticSearch之索引结构_elasticsearch 导入索引结构_止步前行的博客-CSDN博客