Elastic Stack:es Mapping映射入门
一.概念
概念:自动或手动为index中的_doc建立的一种数据结构和相关配置,简称为mapping映射。
动态映射:dynamic mapping,自动为我们建立index,以及对应的mapping,mapping中包含了每个field对应的数据类型,以及如何分词等设置。
我们当然也可以手动在创建数据之前,先创建index,以及对应的mapping
语法:
1 | GET /INDEX/_mapping |
GET /book/_mapping查询结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | { "book" : { "mappings" : { "properties" : { "description" : { "type" : "text" , "fields" : { "keyword" : { "type" : "keyword" , "ignore_above" : 256 } } }, "name" : { "type" : "text" , "fields" : { "keyword" : { "type" : "keyword" , "ignore_above" : 256 } } }, "pic" : { "type" : "text" , "fields" : { "keyword" : { "type" : "keyword" , "ignore_above" : 256 } } }, "price" : { "type" : "float" }, "studymodel" : { "type" : "text" , "fields" : { "keyword" : { "type" : "keyword" , "ignore_above" : 256 } } }, "tags" : { "type" : "text" , "fields" : { "keyword" : { "type" : "keyword" , "ignore_above" : 256 } } }, "timestamp" : { "type" : "text" , "fields" : { "keyword" : { "type" : "keyword" , "ignore_above" : 256 } } } } } } } |
搜索:
1 2 3 4 | GET /website/_search?q= 2019 0 条结果 GET /website/_search?q= 2019 - 01 - 01 1 条结果 GET /website/_search?q=post_date: 2019 - 01 - 01 1 条结果 GET /website/_search?q=post_date: 2019 0 条结果 |
搜索结果为什么不一致,因为es自动建立mapping的时候,设置了不同的field不同的data type。不同的data type的分词、搜索等行为是不一样的。所以出现了_all field和post_date field的搜索表现完全不一样。
二.精确匹配与全文检索的对比分析
exact value 精确匹配:2019-01-01,exact value,搜索的时候,必须输入2019-01-01,才能搜索出来,如果你输入一个01,是搜索不出来的
full text 全文检索:
2019-01-01,2019 01 01,搜索2019,或者01,都可以搜索出来
china,搜索cn,也可以将china搜索出来
likes,搜索like,也可以将likes搜索出来
like,搜索love,同义词,也可以将like搜索出来
就不是说单纯的只是匹配完整的一个值,而是可以对值进行拆分词语后(分词)进行匹配,也可以通过缩写、时态、大小写、同义词等进行匹配。深入 NPL,自然语义处理。
三.分词器 analyzer
作用:切分词语,normalization(提升recall召回率),给你一段句子,然后将这段句子拆分成一个一个的单个的单词,同时对每个单词进行normalization(时态转换,单复数转换)。
测试分词器:
1 2 3 4 5 | GET /_analyze { "analyzer" : "standard" , "text" : "Text to analyze 80" } |
分词结果:
token:实际存储的tern关键字
position:在此词条在原文本中的位置
start_offset/end_offset:字符在原始字符串中的位置
四.手动创建映射
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | PUT book/_mapping { "properties" : { "name" : { "type" : "text" }, "description" : { "type" : "text" , "analyzer" : "english" , "search_analyzer" : "english" }, "pic" :{ "type" : "text" , "index" : false }, "studymodel" :{ "type" : "text" } } } |
Text文本类型:
1)analyzer :通过analyzer属性指定分词器。
2)index :index属性指定是否索引,默认为true,但是有一些内容不需要索引。
3)store :是否在source之外存储
keyword关键字字段:
目前已经取代了"index": false。上边介绍的text文本字段在映射时要设置分词器,keyword字段为关键字字段,通常搜索keyword是按照整体搜索,所以创建keyword字段的索引时是不进行分词的,比如:邮政编码、手机号码、身份证等。keyword字段通常用于过虑、排序、聚合等。
date日期类型:
日期类型不用设置分词器。
通常日期类型的字段用于排序。
通过format设置日期格式
1 2 3 4 | "timestamp" : { "type" : "date" , "format" : "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd" } |
五.修改映射
只能创建index时手动建立mapping,或者新增field mapping,但是不能update field mapping。
1 2 3 4 5 6 7 8 9 | PUT /book/_mapping/ { "properties" : { "new_field" : { "type" : "text" , "index" : "false" } } } |
通过删除索引来删除映射。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix