Mapping在ElasticSearch中是一个非常重要的概念。决定了一个index中的field使用什么数据类型存储,使用什么分词器解析,是否有子字段等。

为什么要学习Mapping?

如果没有Mapping,那么所有的text类型属性默认都使用standard分词器。所以如果希望使用IK分词器就必须配置自定义Mapping。

1、Mapping核心数据类型

ElasticSearch中数据类型有很多,在这里只介绍常用的数据类型。
只有text类型才能被分词。其他类型不允许。
文本(字符串):text
整数:byte、short、integer、long
浮点型:float、double
布尔类型:boolean
日期类型:date
数组类型:array {a:[]}
对象类型:object {a:{}}
不分词的字符串(关键字):keyword

2、dynamic Mapping对字段的类型匹配

true or false->boolean
123 -> long
123.123 -> double
2018-10-10 -> date
hello world -> text
[]-> array
{} -> object

在上述的自动mapping字段类型分配的时候,只有text类型的字段需要分词器。默认的分词器是standard分词器。

3、查看索引mapping

可以通过命令查看已有的index的mapping具体信息,语法如下 :
GET 索引名/_mapping
image.png

4、custom mapping

可以通过命令,在创建index和type的时候来定制mapping映射,也就是指定字段的类型和字段数据使用的分词器。
手动设置mapping时,只能新增mapping设置,不能对已有的mapping进行修改
如:有索引A,其中有类型b,增加字段f1的mapping定义。后续可以加字段f2的mapping定义,但是不能修改f1字段的mapping定义。
通常都是手动创建index,并进行各种定义,如:setting,mapping等。

4-1 创建索引时指定mapping

  1. PUT 索引名称
  2. {
  3. "mappings":{
  4. "properties":{
  5. "字段名":{
  6. "type":类型,
  7. ["analyzer":字段的分词器,]
  8. ["fields":{
  9. "子字段名称":{
  10. "type":类型,
  11. "ignore_above":长度限制
  12. }
  13. }]
  14. }
  15. }
  16. }
  17. }
  18. #"index" - 是否可以作为搜索索引。可选值:true | false
  19. #"analyzer" - 指定分词器。
  20. #"type" - 指定字段类型
  1. ![image.png](https://cdn.nlark.com/yuque/0/2022/png/872322/1651887718323-0956d023-db0b-431a-a2d0-714753e06201.png#clientId=uc1a92877-dae8-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=617&id=ua72d668d&margin=%5Bobject%20Object%5D&name=image.png&originHeight=617&originWidth=1091&originalType=binary&ratio=1&rotation=0&showTitle=false&size=43081&status=done&style=none&taskId=u980bda5c-3f4d-41cf-adbc-aa4e43ddbf8&title=&width=1091)

4-2 为已有的索引添加新的字段mapping

  1. PUT 索引名/_mapping
  2. {
  3. "properties":{
  4. "新字段名":{
  5. "type":类型,
  6. "analyer":字段的分词器,
  7. "fields":{
  8. "子字段名":{
  9. "type":类型,
  10. "ignore_above":长度
  11. }
  12. }
  13. }
  14. }
  15. }

image.png

4-3 查看索引的mapping

image.png

4-4 测试不同字段的分词器

  1. GET 索引名称/_analyze
  2. {
  3. "field":"索引中的text类型的字段名",
  4. "text":"要分词处理的文本数据"
  5. }

image.png
image.png