1. 为什么要映射
es中的文档等价于java中的对象,那么在java中有字段(比如string, int, long等类型), 同理在es索引中的具体字段也是有类型的.
PUT /testDocument/article/1
{
"title" : "elasticsearchshi是是什么",
"author" : "zhangsan",
"titleScore" : 60
}
如上这种操作没有指明索引类型, es会自动根据类型识别字段.那么如何知道es自动识别的字段类型呢
2. es如何查看索引字段类型
kibana中的命令GET/testDocument/article/_mapping
3. 为什么要对索引设置mapping
然后再插入一条数据
PUT /testDocument/article/2
{
"title" : "elasticsearchshi是是什么",
"author" : "zhangsan",
"titleScore" : 66.666
}
查询数据: GET /doucment/aricle/2
-
我们会发现本来是long类型的titleScore在es中有能够存入, 而且没有报错, 但其实这就是一个问题.
-
如果后期es对接java的时候, java会对字段指定类型, 比如
class Article{
private String title;
private String author;
private ? titleScore; //《什么类型合适》?如果使用double类型,那么后面肯定会有数据格式转换的异常 doublelong
} -
所以,我们如果能提前知道字段类型, 这样java封装字段就能正确指定类型了. 怎么办呢 办法就是使用mapping映射管理, 提前指定字段类型,防止后续出现根式转换异常的问题.
先删除原来的document
DELETE testDocument
然后添加新数据,设置mapping
PUT testDocument
{
“mappings”: {
“article” : {
“properties”:
{
“title” : {“type”: “text”} ,
“author” : {“type”: “text”} ,
“titleScore” : {“type”: “double”}} }
}
}查询索引数据类型
get testDocument/article/_mapping
4. 基本命令
-
添加索引:school,文档类型:logs,索引字段:messages ,messages字段的类型为text
PUT school
{
“mapping”: {
“logs”: {
“properties”: {“messages” : {“type”: “text”}}
}
}
} -
查看索引school/logs的字段类型
GET /school/_mapping/logs
-
继续添加字段
POST /school/_mapping/logs
{
“properties”: {“number” : {“type”: “text”}}
} -
继续查看school/logs的字段属性
GET /school/_mapping/logs
上图说明mapping映射设置成功~
5. 获取映射字段
语法:
GET /{index}/_mapping/{type}/field/{field}
-
获取number字段属性
GET /school/_mapping/logs/field/number
6. .生产环境的bug(复制索引库)
问题: 使用es默认生成mapping, 使用java api统计数据的, 发现数据不准确.
解决: 发现程序员A在创建索引的时候,使用的默认mapping,导致精度损失。为了解决这个问题,重新构建一个新的库,这个库设置某个字段为double。
-
第一步: 重新创建一个索引库document1, 失去精准的字段设置mapping
PUT document1
{
“mappings”: {
“article” : {
“properties”:
{
“title” : {“type”: “text”} ,
“author” : {“type”: “text”} ,
“titleScore” : {“type”: “double”}
}
}
}
} -
然后用reindex的命令, 将原始库的内容,拷给到document1中
POST _reindex
{
“source”: {
“index”: “document”
},
“dest”: {
“index”: “document1”
}
}