当前位置:网站首页>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。
边栏推荐
- MATLAB线性规划模型学习笔记
- NumPy学习挑战第四关-NumPy数组属性
- Numpy learning challenge level 1 - Download and installation of numpy
- Typescript: use polymorphism instead of switch and other conditional statements
- Zraqnhydae
- MYSQL(三)
- NumPy学习挑战第五关-创建数组
- 【yolov4】基于yolov4深度学习网络目标检测MATLAB仿真
- Paths with a certain value in a binary tree (1) (2) (3) (Sword finger offer)
- Rust中的过程宏
猜你喜欢

LabVIEW arduino TCP / IP Remote Intelligent Home System (Project section - 5)

MySQL基础用法01

数据湖架构之Hudi编译篇

【yolov4】基于yolov4深度学习网络目标检测MATLAB仿真

MySQL

Big factory interview TCP protocol classic 15 consecutive questions! 22 pictures to make you fully understand

STM 32 uses cube to generate Tim to trigger ADC and transmit through DMA

Paths with a certain value in a binary tree (1) (2) (3) (Sword finger offer)

ZRaQnHYDAe

数据挖掘是什么?
随机推荐
Guide to "avoid dismissal during probation period"
OCA Security Alliance (cybersecurity mesh)
How to open an account in flush? Is it safe to open an account online?
China peek market outlook and future strategic planning proposal report 2022-2027
JS download pictures
Screen sharing recommendations
[digital signal processing] basic sequence (unit step sequence | relationship between unit step sequence and unit pulse sequence | rectangular sequence | relationship between rectangular sequence and
Shell编程-用户信息管理
Analyse d'un problème classique
My SQL(二)
Open source demo| you draw and I guess -- make your life more interesting
C#实现给DevExpress中GridView表格指定列添加进度条显示效果——代码实现方式
Recognize pnpm: faster, higher performance NPM
My SQL (II)
web入门之 Promise API
Solution of garbled code in sparkshell deletion key of SecureCRT
[image segmentation] blood vessel extraction from retinal fundus images based on maximum principal curvature with matlab code
专业课-代码题记录
China polyphenylene oxide Market Development Prospect and Investment Strategy Research Report 2022-2027
oracle创建带返回值的存储过程并sql执行调用