当前位置:网站首页>es 中 mapping 简介
es 中 mapping 简介
2022-06-26 07:02:00 【話吥哆先森丶】
默认mapping
elasticsearch(以下简称ES)是没有模式(schema)的,当我们执行以下命令:
curl -XPUT http://localhost:9200/test/item/1 -d '{"name":"bob", "description": "A Pretty cool guy."}'ES能非常聪明的识别出"name"和"description"字段的类型是string, ES默认会创建以下的mapping:
mappings: {
item: {
properties: {
description: {
type: string
}
name: {
type: string
}
}
}
}什么是mapping
ES的mapping非常类似于静态语言中的数据类型:声明一个变量为int类型的变量, 以后这个变量都只能存储int类型的数据。同样的, 一个number类型的mapping字段只能存储number类型的数据。
同语言的数据类型相比,mapping还有一些其他的含义,mapping不仅告诉ES一个field中是什么类型的值, 它还告诉ES如何索引数据以及数据是否能被搜索到。
注:当你的查询没有返回相应的数据, 你的mapping很有可能有问题。当你拿不准的时候, 直接检查你的mapping。
剖析mapping
一个mapping由一个或多个analyzer组成, 一个analyzer又由一个或多个filter组成的。当ES索引文档的时候,它把字段中的内容传递给相应的analyzer,analyzer再传递给各自的filters。
filter的功能很容易理解:一个filter就是一个转换数据的方法, 输入一个字符串,这个方法返回另一个字符串,比如一个将字符串转为小写的方法就是一个filter很好的例子。
一个analyzer由一组顺序排列的filter组成,执行分析的过程就是按顺序一个filter一个filter依次调用, ES存储和索引最后得到的结果。
总结来说, mapping的作用就是执行一系列的指令将输入的数据转成可搜索的索引项。
默认analyzer
回到我们的例子, ES猜测description字段是string类型,于是默认创建一个string类型的mapping,它使用默认的全局analyzer, 默认的analyzer是标准analyzer, 这个标准analyzer有三个filter:token filter, lowercase filter和stop token filter。
我们可以在做查询的时候键入_analyze关键字查看分析的过程。使用以下指令查看description字段的转换过程:
curl -X GET "http://localhost:9200/test/_analyze?analyzer=standard&pretty=true" -d "A Pretty cool guy."
{
"tokens" : [ {
"token" : "pretty",
"start_offset" : 2,
"end_offset" : 8,
"type" : "<ALPHANUM>",
"position" : 2
}, {
"token" : "cool",
"start_offset" : 9,
"end_offset" : 13,
"type" : "<ALPHANUM>",
"position" : 3
}, {
"token" : "guy",
"start_offset" : 14,
"end_offset" : 17,
"type" : "<ALPHANUM>",
"position" : 4
} ]可以看到, 我们的description字段的值转换成了[pretty], [cool], [guy], 在转换过程中大写的A, 标点符号都被filter过滤掉了, Pretty也转成了全小写的pretty, 这里比较重要的是, 即使ES存储数据的时候仍然存储的是完整的数据, 但是可以搜索到这条数据的关键字只剩下这三个单词了, 其他的都是抛弃掉了。
看看以单词a来搜索的结果:
$ curl -X GET "http://localhost:9200/test/_search?pretty=true" -d '{
"query" : {
"text" : { "description": "a" }
}
}'
{
"took" : 29,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 0,
"max_score" : null,
"hits" : [ ]
}
}
text类型的搜索在查询过程中使用了和之前插入数据相同的分析/过滤系统, 所以我们输入"a",mapping不会有任何返回, 因为单词“a”不会被ES存储和索引。反过来,如果我们使用单词"cool"进行搜索:
curl -X GET "http://localhost:9200/test/_search?pretty=true" -d '{
"query" : {
"text" : { "description": "cool" }
}
}'
{
"took" : 29,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 0.15342641,
"hits" : [ {
"_index" : "test",
"_type" : "item",
"_id" : "1",
"_score" : 0.15342641, "_source" : {"name":"zach", "description": "A pretty cool guy"}
} ]
}
}现在就能得到正确的结果,这是一个公认的简单例子, 但是它描述了ES是如何工作的, 不要把mapping想成是数据类型, 把它想象成是搜索数据的指令集合。如果你不想字符"a"被删除, 你需要修改你的analyzer。
边栏推荐
- Kotlin compose state recovery remembersaveable and remember
- Numpy learning challenge level 4 - numpy array attribute
- 网络io,磁盘io
- My SQL (II)
- 屏幕共享推荐
- JS download pictures
- Stm32f1 and stm32subeide programming example - thermal sensor driver
- 浅析一道经典题
- MySQL基础用法01
- If you meet a female driver who drives didi as an amateur, you can earn 500 yuan a day!
猜你喜欢

Hudi compilation of data Lake architecture

MySQL operation database

面试被问Redis主从复制不会答?这13张图让你彻底弄明白
![[digital signal processing] basic sequence (unit step sequence | relationship between unit step sequence and unit pulse sequence | rectangular sequence | relationship between rectangular sequence and](/img/0c/3aeb7f93576181bbc46d2d1a1aa0e7.jpg)
[digital signal processing] basic sequence (unit step sequence | relationship between unit step sequence and unit pulse sequence | rectangular sequence | relationship between rectangular sequence and

Kotlin compose state recovery remembersaveable and remember

unity之EasyAR使用

Service interface test guide

基于sanic的服务使用celery完成动态修改定时任务

LabVIEW Arduino TCP/IP遠程智能家居系統(項目篇—5)

面试官:测试计划和测试方案有什么区别?
随机推荐
How to open an account in flush? Is it safe to open an account online?
数据湖架构之Hudi编译篇
【图像融合】基于耦合特征学习的多模式医学图像融合附matlab代码
LabVIEW Arduino TCP/IP远程智能家居系统(项目篇—5)
【推荐10个 让你轻松的 IDEA 插件,少些繁琐又重复的代码】
如何把数据库的数据传给复选框
i3wm 获取window class
MATLAB线性规划模型学习笔记
Spark3.3.0源码编译补充篇-抓狂的证书问题
SQL中空值的判断
LabVIEW Arduino TCP/IP遠程智能家居系統(項目篇—5)
Interviewer: what is the difference between a test plan and a test plan?
Deep exploration image theme color extraction
Numpy learning challenge level 5 - create array
SQL query statement
Mysql操作数据库
面试官:测试计划和测试方案有什么区别?
“试用期避免被辞退“ 指南攻略
In depth analysis of redis object structure
Judgment of SQL null value