ElasticSearch中Mapping创建
ElasticSearch中Mapping创建
一,类型和映射
类型(type)在Elasticsearch 中表示一类相似的文档,类型是由名称和一组映射组成的。
PUT company
{
"mappings": {
"employee":{
"properties": {
"id":{"type": "keyword"},
"name":{
"type": "text",
"analyzer": "standard"
},
"about":{
"type": "text",
"analyzer": "whitespace"
},
"geo":{
"type": "geo_point"
}
}
}
}
}
通过以上代码创建了一个索引(index)名为company,类型名(type)为employee,包括id,…about等一组属性映射。
那映射是什么呢?映射,就像是数据库中的schema ,描述了文档可能具有的字段或属性,每个字段的数据类型以及Lucene是如何索引和存储这些字段的。
每一个属性的值存入数据库之后,都会根据每个属性的设置对该数据就行倒排索引,(倒排索引的建立是取决于设置的,分词器等等),当你做全局搜索的时候,就会很快的返回你想要的的数据。
类型是如何实现的
Elasticsearch6之后,Elasticsearch规定一个索引下面只允许有一个类型。
在employee类型中,about字段类型是text,使用的分词器是whitespace。
"about":{
"type": "text",
"analyzer": "whitespace"
}
Elasticsearch提供了以下数据类型
string 字符串类型
text and keyword
text:大文本,长字符串,可以通过指定的分词器进行分词就,建立倒排索引
keyword:不能够通过分词器进行分词,整个文本作为索引记录
Numeric datatypes 数字数据类型
long, integer, short, byte, double, float, half_float, scaled_float
Date datatype 日期类型
date
Boolean datatype 布尔类型
boolean
Binary datatype 二进制数据类型
binary
Range datatypes 范围数据类型
integer_range, float_range, long_range, double_range, date_range
Complex datatypesedit 复杂数据类型
Object datatype 对象数据类型
object for single JSON objects 对于单个JSON对象
Nested datatype 嵌套数据类型
nested for arrays of JSON objects 对于JSON对象的数组
Geo datatypesedit 地理位置数据类型
Geo-point datatype 地理点数据类型
geo_point for lat/lon points 对于纬度/经度点 可存入对象json,字符串,数组
Geo-Shape datatype Geo-Shape数据类型
geo_shape for complex shapes like polygons 对于像多边形这样的复杂形状
Specialised datatypesedit 专用数据类型
IP datatype IP数据类型
ip for IPv4 and IPv6 addresses 用于IPv4和IPv6地址
Completion datatype 完成数据类型
completion to provide auto-complete suggestions 提供自动完成的建议
Token count datatype 令牌计数数据类型
token_count to count the number of tokens in a string 计算字符串中的标记数
mapper-murmur3
murmur3 to compute hashes of values at index-time and store them in the index
在索引时计算值的哈希值并将它们存储在索引中
Percolator type 过滤器类型
Accepts queries from the query-dsl 接受来自query-dsl的查询
join datatype join 数据类型
Defines parent/child relation for documents within the same index
为同一索引中的文档定义父/子关系
一个索引一旦建立,就意味着已经按照你设置的映射规则建立倒排索引等等,所以,索引一旦建立,就不能进行修改。除非重新建立。
防止索引太多
为了防止索引创建的太多导致的内存不足,对索引的数量可以进行修改。
index.mapping.total_fields.limit
索引中的最大字段数。默认值为1000。
index.mapping.depth.limit
字段的最大深度,以内部对象的数量来衡量。例如,如果所有字段都是在根对象级别定义的,则深度为1。如果有一个对象映射,则深度为 2,等等。默认值为20。
index.mapping.nested_fields.limit
nested索引中的最大字段数,默认为50。使用100个嵌套字段索引1个文档实际上索引101个文档,因为每个嵌套文档都被索引为单独的隐藏文档。
二,索引建立的过程
mappings中的参数
- type(类型)
- analyzer(分析器) 作用是分词和词条标准化(比如dogs标准化为dog,大写标准化小写),默认是standard分析器,还可以在创建mapping时配置自定义分析器,并使用自定义分析器。
- normalizer 与analyzer类似,但是分词结果都是单一词
- boost 设置查询相关性权重,默认是1
- coerce 是否强制转换,默认为true,比如integer类型参数可以直接传递字符串数字,会自动转为数字。设置为false则不会强转,则参数值传递字符串会报错。
- copy_to 可将字段指向一个组别,之后的查询可直接查询该组别,查询范围会从组别包含的字段中进行查询,多个值用空格隔开,类似_all。
- doc_values 一般与keyword结合使用,默认为true,即查询可通过该字段进行排序和聚合查询,但是设置为fasle则不可通过该字段排序和聚合查询,但是相应会比较节省内存空间。
- dynamic 默认为true,es默认可以动态新增字段,改为false后,可以动态插入不存在的字段名,但是这个字段名只会在_source中显示,并不会在mapping中插入,不能通过索引进行查询。该参数与properties参数同级
- enabled 默认为true,设置为false则该字段不可被索引
- eager_global_ordinals 设置为true可以提高查询速度,但会降低更新速度,只可用在keyword类型使用,text类型只能在设置fileddata参数为ture时使用
- fileddata 与text配合使用,默认text类型不可支持排序和聚合查询,设置fileddata后即可,实现效果与新增keyword类型fields一致。
- format 一般与日期类型一起使用,格式化日期
- ignore_malformed 忽略异常插入的数据,默认为false,即插入异常数据会报错,比如integer类型插入非数字字符串,则会报错,设置为true则允许错误数据,可以插入。
- ignore_above 限制字段字符串长度,只能和keyword类型一起用,插入的数据超过限制数的数据不报错,但是不会被存储,搜索不到
- index 默认为true,设置为false则该字段不会存索引,即不可被搜索到。
- fields 为一个字段设定一个子字段,一般是由于当前字段数据类型不满足某种查询时使用,比如text类型的字段,想要排序就需要设置keyword类型的fields 通过此field进行排序,如下
PUT my_index
{
"mappings": {
"_doc": {
"properties": {
"city": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
}
}
}
}
}
}
PUT my_index/_doc/1
{
"city": "New York"
}
GET my_index/_search
{
"query": {
"match": {
"city": "york"
}
},
"sort": {
"city.raw": "asc"
},
"aggs": {
"Cities": {
"terms": {
"field": "city.raw"
}
}
}
}
- norms 规范化,默认为ture,如果该字段不参与计分,则可以设置为false以节省硬盘空间
- null_value 指定该字段为null或空数组时对应的索引值,默认null不可被索引,使用方式如下
PUT my_index
{
"mappings": {
"_doc": {
"properties": {
"status_code": {
"type": "keyword",
"null_value": "NULL"
}
}
}
}
}
PUT my_index/_doc/1
{
"status_code": null
}
PUT my_index/_doc/2
{
"status_code": []
}
GET my_index/_search
{
"query": {
"term": {
"status_code": "NULL"
}
}
}
- position_increment_gap 词间差距,当一个字段有多个值,默认该值为100,如下,因为Abraham 和 Lincoln分别在数组的两个词中,因此他们的伪差距为100,所以搜索不出来
PUT my_index/_doc/1
{
"names": [ "John Abraham", "Lincoln Smith"]
}
GET my_index/_search
{
"query": {
"match_phrase": {
"names": {
"query": "Abraham Lincoln"
}
}
}
}
PUT my_index
{
"mappings": {
"_doc": {
"properties": {
"names": {
"type": "text",
"position_increment_gap": 0
}
}
}
}
}
- properties 配置type字段或子字段,自字段可如下配置嵌套类型和object
PUT my_index
{
"mappings": {
"_doc": {
"properties": {
"manager": {
"properties": {
"age": { "type": "integer" },
"name": { "type": "text" }
}
},
"employees": {
"type": "nested",
"properties": {
"age": { "type": "integer" },
"name": { "type": "text" }
}
}
}
}
}
}
-
search_analyzer 配置字段查询分析器,与analyzer一样,但只用在搜索时,同时存在则搜索以这个为主(注 es新增数据索引和搜索都是通过指定分析器进行分词)
-
similarity 配置字段相关度计算算法,默认是BM25,还可配置classic(TF/IDF算法),boolean(不计算相关度,只看查询内容是否完全匹配)
-
store 是否存储源数据,默认是true,即会存储源数据,设置为false则该字段不保存数据,一般用于映射
-
term_vector 词条向量,默认为false 参数有以下几个
no 默认,不存储词条向量
yes 分词对应的字段会被存储
with_positions 分词和每个词的位置会被存储
with_offsets 分词和分词的起始和结束字符偏移量会被存储
with_positions_offsets 分词 位置和向量会被存储