Elasticsearch系列---初识mapping

前面几篇的实战案例,我们向Elasticsearch索引数据时,只是简单地把JSON文本放在请求体里,至于JSON里的field类型,存储到ES里是什么类型,中间是怎么做的映射,这个映射过程,就是mapping要解决的问题。

mapping简单来说,就是解决JSON文本内容到field类型映射关系的定义。将时间域视为时间类型,数字视为数字类型,字符串识别为全文或精确值字符串,这个识别的过程,叫做mapping。

Elasticsearch支持的简单域类型,类似于Java的基础数据类型,有如下几种:

字符串:text,keyword

整数 : byte, short, integer, long

浮点数: float, double

布尔型: boolean

日期: date

当Elasticsearch收到JSON基本数据类型内容时,使用如下规则进行类型映射:
| JSON type | domain type
| :---- | :--: | -----: |
| 布尔型: true 或者 false | boolean
| 整数: 123 | long
| 浮点数: 123.45 | double
| 日期格式的字符串: 2014-09-15 | date
| 字符串: love you | text

查看映射

每个索引都可以通过/_mapping查询各个field的映射结果,ES本身有自动mapping的过程,但mapping后的结果一定要仔细检查一下。

查询请求:

GET /music/_mapping/children

响应结果:

{ "music": { "mappings": { "children": { "properties": { "content": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "language": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } }, "fielddata": true }, "length": { "type": "long" }, "likes": { "type": "long" }, "name": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } } } } }

mapping中就自动定义了每个field的数据类型,properties下面的是各个field字段的名称、类型等信息,text类型的还带一个keyword子field。

数据类型的分词规则

index在建立时或索引数据时,如果没有手动指定mapping信息,Elasticsearch会用它的规则自动为我们创建type信息,以及type对应的mapping,mapping中包含了每个field对应的数据类型,以及如何分词等设置。

不同类型的field,有的是精确搜索(exact value),有的是全文搜索(full text)。

exact value,在建立倒排索引的时候,是将整个值一起作为一个关键词建立到倒排索引中的,并且大小写敏感;

full text,会经历各种各样的处理,分词,normaliztion(时态转换,同义词转换,大小写转换),才会建立到倒排索引中。

在一个搜索请求过来的时候,对exact value field和full text field进行搜索的会与当初建立倒排索引的行为保持一致;比如说exact value搜索的时候,就是直接按照整个值进行匹配,full text query string,也会进行分词和normalization再去倒排索引中去搜索,这样才能达到预期的搜索效果。

ES基本的几种field类型,除了text是使用full text,其他的都是exact value,总结来说mapping,决定了数据类型,建立倒排索引的行为,还有进行搜索的行为。

自定义映射

基本数据类型基本够用,但是有些数据可能需要自定义映射,尤其是字符串,string类型默认是full text,但是我们可以自己定义分词器,不同的分词器,会带来不一样的搜索效果,string类型最重要的属性是index和analyzer。

index

这个属性控制字符串的索引规则,有三个值可供选择:

true:支持索引,并且依据当前类型决定是全文搜索还是精确匹配

false:不索引

例如:

{ "author": { "type": "text", "index": true } } analyzer

这个属性控制字符串使用的分词器,在支持中文的系统里,这个属性经常被用到,各路分词器大显身手,都需要用这个属性来指定,如:

{ "content": { "type": "text", "analyzer": "aliws" } } 测试映射

我们在建立索引之后,可以通过测试命令来查看不同的field的映射结果,即full text类型的是否有分词, exact value的是否原样保留,text的内容可以随意输入,当把这个作用工具调试时,可以诊断的内容的分词情况,举例如下:

full text类型

GET /music/_analyze { "field": "content", "text": "let me sleep" }

结果:

{ "tokens": [ { "token": "let", "start_offset": 0, "end_offset": 3, "type": "<ALPHANUM>", "position": 0 }, { "token": "me", "start_offset": 4, "end_offset": 6, "type": "<ALPHANUM>", "position": 1 }, { "token": "sleep", "start_offset": 7, "end_offset": 12, "type": "<ALPHANUM>", "position": 2 } ] }

exact value类型

GET /music/_analyze { "field": "content.keyword", "text": "let me sleep" }

结果:

{ "tokens": [ { "token": "let me sleep", "start_offset": 0, "end_offset": 12, "type": "word", "position": 0 } ] }

注意一个小细节:Elasticsearch在自动创建text类型时,为full text,但会自动建立一个keywork子field,这个子field是exact value类型的。

小结

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjsjp.html