欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

4.elasticsearchmapping基础

时间:2023-04-16

        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信息。

 

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。