es 很强大,合适的mapping,才能更大发挥它的优势,使用es前,需要对mapping进行详细的了解,以便在使用中,根据实际情况去设置合适的mapping
2.1analyzer :分词器
只作用于text类型的字段
char_filter:字符过滤器
tokenizer:指定分词器
filter:词单元过滤器
analyzer: 自定义的分词器
2.1.1PUT /my_index
{
"settings": {
"analysis": {
"char_filter": { ..、custom character filters ..、},//字符过滤器
"tokenizer": { ..、custom tokenizers ..、},//分词器
"filter": { ..、custom token filters ..、}, //词单元过滤器
"analyzer": { ..、custom analyzers ..、}//自定义的分词器
}
}
}
2.1.2案例:
PUT /my_index
{ "settings":{ "analysis":{ "analyzer":{ "my_analyzer":{ "type":"custom", "tokenizer":"standard", "filter":[ "lowercase" ] }, "my_stop_analyzer":{ "type":"custom", "tokenizer":"standard", "filter":[ "lowercase", "english_stop" ] } }, "filter":{ "english_stop":{ "type":"stop", "stopwords":"_english_" } } } }, "mappings":{ "properties":{ "title": { "type":"text", "analyzer":"my_analyzer", //用来分词,包含索引存储阶段和搜索阶段(其中查询阶段可以被search_analyzer参数覆盖),该参数默认设置为index的analyzer设置或者standard analyzer "search_analyzer":"my_stop_analyzer", //这个字段用来指定搜索阶段时使用的分词器,默认使用analyzer的设置 "search_quote_analyzer":"my_analyzer" //搜索遇到短语时使用的分词器,默认使用search_analyzer的设置 } } } }
2.2 boost
boost用于影响返回结果的相关性评分,在原评分基础上*boost值。boost仅对analyzer分词后的单词文本检索有效。
2.2.1 创建索引是指定
PUT my-index-000001 { "mappings": {
"doc_":{ "properties": { "title": { "type": "text", "boost": 2 }, "content": { "type": "text" } } } }
}
2.2.2 搜索时指定
POST _search { "query": { "match": { "title": { "query": "quick brown fox", "boost": 2 } } } }
2.3 coerce 强制类型转换(默认开启)
2.3.1
数据并不总是干净的。根据它的生成方式,数字可能会在JSON正文中呈现为真正的JSON数字,例如5,但它也可能呈现为字符串,例如"5"。或者,应该是整数的数字可以替代地呈现为浮点,例如5.0,或甚至"5.0"。
强制尝试清除脏值以适合字段的数据类型。例如:
字符串将被强制转换为数字。浮点将被截断为整数值。
PUT my_index
{
"mappings": {
"_doc": {
"properties": {
"number_one": {
"type": "integer"
},
"number_two": {
"type": "integer",
"coerce": false//关闭强制转换,必须传入int类型的数据
}
}
}
}
}
2.3.2 测试创建两个文档
PUT my_index/_doc/1
{
"number_one": "10"
}
正常创建文档。
PUT my_index/_doc/2
{
"number_two": "10"
}
创建文档失败,不是integer类型的数据,浮点型的数据仍然失败。
2.3.3 index.mapping.coerce 全局禁用强制
PUT my-index-000001 { "settings": { "index.mapping.coerce": false }, "mappings": { "properties": { "number_one": { "type": "integer", "coerce": true }, "number_two": { "type": "integer" } } } }
2.4 copy_to
该copy_to参数允许您创建自定义 _all字段可以将多个字段的值复制到组字段中,然后可以将其作为单个字段进行查询。
2.4.1 例如,可以将first_name和last_name字段复制到full_name字段,如下所示
PUT my-index-000001 {
"mappings": {
"_doc": {
"properties": {
"first_name": {
"type": "text",
"copy_to": "full_name"
},
"last_name": {
"type": "text",
"copy_to": "full_name"
},
"full_name": {
"type": "text"
}
}
}
}
}
2.4.2 新增文档 PUT my-index-000001/_doc/1 { "first_name": "John", "last_name": "Smith" }
2.4.3 测试搜索 GET my-index-000001/_search { "query": { "match": { "full_name": { "query": "John Smith", "operator": "and"//只匹配"John Smith" } } } }
2.5 doc_values (默认开启器)
Doc Values 常被应用到以下场景:
对一个字段进行排序对一个字段进行聚合某些过滤,比如地理位置过滤某些与字段相关的脚本计算
如果确信某字段不需要排序或者聚合,或者从脚本中访问字段值,那么我们可以设置 doc_values = false,这样可以节省磁盘空间。
PUT my-index-000001 { "mappings": { "properties": { "status_code": { "type": "keyword" }, "session_id": { "type": "keyword", "doc_values": false } } } }
2.6 dynamic 动态映射(默认true)
dynamic
true:遇到陌生字段就 dynamic mappingfalse:遇到陌生字段就忽略strict:遇到陌生字段就报错PUT my-index-000001 { "mappings": { "dynamic": false, "properties": { "user": { "properties": { "name": { "type": "text" }, "social_networks": { "dynamic": true, "properties": {} } } } } } }
2.7 eager_global_ordinals
2.8 enabled
默认是true。只用于mapping中的object字段类型。当设置为false时,其作用是使es不去解析该字段,并且该字段不能被查询和store,只有在_source中才能看到(即查询结果中会显示的_source数据)。设置enabled为false,可以不设置字段类型,默认为object
2.9 fielddata
FieldData缓存主要应用场景是在对某一个text 类型field排序(其他类型排序不会有缓存)或者计算类的聚合运算时。
PUT my-index-000001/_mapping PUT my-index-000001/_mapping { "properties": { "my_field": { "type": "text", "fielddata": true } } }
fielddata_frequency_filter:可以过滤出现低频率的数据
PUT my-index-000001 { "mappings": { "properties": { "tag": { "type": "text", "fielddata": true, "fielddata_frequency_filter": { "min": 0.001, "max": 0.1, "min_segment_size": 500 } } } } }
2.10 fields 一个字段多种数据类型
一个字段多种数据类型,使用的方法不一样。例如,一个字符串字段可以映射为text字段用于全文本搜索,也可以映射为keyword字段用于排序或聚合。
PUT my_index
{
"mappings": {
"_doc": {
"properties": {
"city": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
}
}
}
}
}
}
city.raw字段是city字段的keyword版本。
note:city字段用于全文本搜索。
note:city.raw用于排序与聚合。
2.11 format
日期进行格式化
PUT my-index-000001 { "mappings": {
"_doc": { "properties": { "date": { "type": "date", "format": "yyyy-MM-dd" } } } }
2.12 ignore_above
表示最大的字段值长度,超出这个长度的字段将不会被索引,但是会存储。
PUT my-index-000001 { "mappings": { "properties": { "message": { "type": "keyword", "ignore_above": 20 } } } }}
2.13 ignore_malformed
取值可以为true或false,默认值是false。若想要忽略格式错误的数值,则应该设置为true,可以存储任意类型
PUT my-index-000001 { "mappings": {
"_doc": { "properties": { "number_one": { "type": "integer", "ignore_malformed": true }, "number_two": { "type": "integer" } } } }
}
2.14 index_options
用于控制倒排索引记录的内容:
2.15 index_phrases
2.16 index_prefixes
2.17 index
默认是true。当设置为false,表明该字段不能被查询,如果查询会报错。但是可以被store。当该文档被查出来时,在_source中也会显示出该字段。
2.18 meta
2.19 normalizer
规划化,主要针对keyword类型,在索引该字段或查询字段之前,可以先对原始数据进行一些简单的处理,然后再将处理后的结果当成一个词根存入倒排索引中,举例如下:
PUT index
{
"settings": {
"analysis": {
"normalizer": {
"my_normalizer": { // @1
"type": "custom",
"char_filter": [],
"filter": ["lowercase", "asciifolding"] // @2
}
}
}
},
"mappings": {
"_doc": {
"properties": {
"foo": {
"type": "keyword",
"normalizer": "my_normalizer" // @3
}
}
}
}
}
代码@1:首先在settings中的analysis属性中定义normalizer。
代码@2:设置标准化过滤器,示例中的处理器为小写、asciifolding。
代码@3:在定义映射时,如果字段类型为keyword,可以使用normalizer引用定义好的normalizer。
2.20 norms
计算文档/字段得分(Score)的调节因子,如果不关心评分可以禁用。
特别是,仅用于筛选或聚合的字段应该关闭。
PUT my-index-000001/_mapping { "properties": { "title": { "type": "text", "norms": false } } }
2.21 null_value
对Null值进行搜索
PUT my-index-000001/_mapping { "properties": {
"mobile":{ "type":"keyword", "null_value":"NULL" }
}
2.22 position_increment_gap
2.23 properties
2.24 search_analyzer
2.25 similarity
用于指定文档评分模型,参数有三个:
BM25:ES和Lucene默认的评分模型。
classic:TF/IDF评分模型。
boolean:布尔评分模型。
2.26 store
默认为no,
如果在{"store":yes}的情况下,ES会对该字段单独存储倒排索引,每次根据ID检索的时候,会多走一次IO来从倒排索引取数据。
而如果_source enabled 情况下,ES可以直接根据Client类来解析_source JSON,只需一次IO就将所有字段都检索出来了。
{"store":yes}既然这么费力不讨好,但是仍然有两个应用场景:
文档很长,检索所有文档或者存储所有文档、获取所有field的代价比较大仅仅针对某几个字段进行re-index的时候
2.27 term_vector
每次有document数据插入时,elasticsearch除了对document进行正排、倒排索引的存储之外,如果此索引的field设置了term_vector参数,elasticsearch还会对这个的分词信息进行计算、统计,比如这个document有多少个field,每个field的值分词处理后得到的term的df值,ttf值是多少,每个term存储的位置偏移量等信息,这些统计信息统称为term vector。
term vector的值有5个
no:不存储term vector信息,默认值yes:只存储field terms信息,不包含position和offset信息with_positions:存储term信息和position信息with_offsets:存储term信息和offset信息with_positions_offsets:存储完整的term vector信息,包括field terms、position、offset信息。