Elasticsearch系列---初识mapping
概要
本篇简单介绍一下field数据类型mapping的相关知识。
mapping是什么?
前面几篇的实战案例,我们向Elasticsearch索引数据时,只是简单地把JSON文本放在请求体里,至于JSON里的field类型,存储到ES里是什么类型,中间是怎么做的映射,这个映射过程,就是mapping要解决的问题。
mapping简单来说,就是解决JSON文本内容到field类型映射关系的定义。将时间域视为时间类型,数字视为数字类型,字符串识别为全文或精确值字符串,这个识别的过程,叫做mapping。
Elasticsearch支持的简单域类型,类似于Java的基础数据类型,有如下几种:
- 字符串:text,keyword
- 整数 : byte, short, integer, long
- 浮点数: float, double
- 布尔型: boolean
- 日期: date
当Elasticsearch收到JSON基本数据类型内容时,使用如下规则进行类型映射:
| JSON type | domain type |
|---|---|
| 布尔型: true 或者 false | boolean |
| 整数: 123 | long |
| 浮点数: 123.45 | double |
| 日期格式的字符串: 2014-09-15 | date |
| 字符串: love you | text |
查看映射
每个索引都可以通过/_mapping查询各个field的映射结果,ES本身有自动mapping的过程,但mapping后的结果一定要仔细检查一下。
查询请求:
GET /music/_mapping/children
响应结果:
{
"music": {
"mappings": {
"children": {
"properties": {
"content": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"language": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
},
"fielddata": true
},
"length": {
"type": "long"
},
"likes": {
"type": "long"
},
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
}
mapping中就自动定义了每个field的数据类型,properties下面的是各个field字段的名称、类型等信息,text类型的还带一个keyword子field。
数据类型的分词规则
index在建立时或索引数据时,如果没有手动指定mapping信息,Elasticsearch会用它的规则自动为我们创建type信息,以及type对应的mapping,mapping中包含了每个field对应的数据类型,以及如何分词等设置。
不同类型的field,有的是精确搜索(exact value),有的是全文搜索(full text)。
- exact value,在建立倒排索引的时候,是将整个值一起作为一个关键词建立到倒排索引中的,并且大小写敏感;
- full text,会经历各种各样的处理,分词,normaliztion(时态转换,同义词转换,大小写转换),才会建立到倒排索引中。
在一个搜索请求过来的时候,对exact value field和full text field进行搜索的会与当初建立倒排索引的行为保持一致;比如说exact value搜索的时候,就是直接按照整个值进行匹配,full text query string,也会进行分词和normalization再去倒排索引中去搜索,这样才能达到预期的搜索效果。
ES基本的几种field类型,除了text是使用full text,其他的都是exact value,总结来说mapping,决定了数据类型,建立倒排索引的行为,还有进行搜索的行为。
自定义映射
基本数据类型基本够用,但是有些数据可能需要自定义映射,尤其是字符串,string类型默认是full text,但是我们可以自己定义分词器,不同的分词器,会带来不一样的搜索效果,string类型最重要的属性是index和analyzer。
index
这个属性控制字符串的索引规则,有三个值可供选择:
- true:支持索引,并且依据当前类型决定是全文搜索还是精确匹配
- false:不索引
例如:
{
"author": {
"type": "text",
"index": true
}
}
analyzer
这个属性控制字符串使用的分词器,在支持中文的系统里,这个属性经常被用到,各路分词器大显身手,都需要用这个属性来指定,如:
{
"content": {
"type": "text",
"analyzer": "aliws"
}
}
测试映射
我们在建立索引之后,可以通过测试命令来查看不同的field的映射结果,即full text类型的是否有分词, exact value的是否原样保留,text的内容可以随意输入,当把这个作用工具调试时,可以诊断的内容的分词情况,举例如下:
- full text类型
GET /music/_analyze
{
"field": "content",
"text": "let me sleep"
}
结果:
{
"tokens": [
{
"token": "let",
"start_offset": 0,
"end_offset": 3,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "me",
"start_offset": 4,
"end_offset": 6,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "sleep",
"start_offset": 7,
"end_offset": 12,
"type": "<ALPHANUM>",
"position": 2
}
]
}
- exact value类型
GET /music/_analyze
{
"field": "content.keyword",
"text": "let me sleep"
}
结果:
{
"tokens": [
{
"token": "let me sleep",
"start_offset": 0,
"end_offset": 12,
"type": "word",
"position": 0
}
]
}
注意一个小细节:Elasticsearch在自动创建text类型时,为full text,但会自动建立一个keywork子field,这个子field是exact value类型的。
小结
本篇主要介绍了一个mapping的概念,基础数据类型,以及查看映射信息和测试field映射效果的方法,测试映射效果算是一个比较有用的工具,后期实际开发中,遇到需要诊断的内容,可以用这个工具协助排查问题。
专注Java高并发、分布式架构,更多技术干货分享与心得,请关注公众号:Java架构社区

Elasticsearch系列---初识mapping的更多相关文章
- Elasticsearch系列---初识搜索
概要 本篇主要介绍搜索的报文结构含义.搜索超时时间的处理过程,提及了一下多索引搜索和轻量搜索,最后将精确搜索与全文搜索做了简单的对比. 空搜索 搜索API最简单的形式是不指定索引和类型的空搜索,它将返 ...
- Elasticsearch系列---初识Elasticsearch
Elasticsearch是什么? Elasticsearch简称ES,是一个基于Lucene构建的开源.分布式.Restful接口的全文搜索引擎,还是一个分布式文档数据库.天生就是分布式.高可用.可 ...
- elasticsearch中的mapping映射配置与查询典型案例
elasticsearch中的mapping映射配置与查询典型案例 elasticsearch中的mapping映射配置示例比如要搭建个中文新闻信息的搜索引擎,新闻有"标题".&q ...
- 第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mapping映射管理
第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mapping映射管理 1.映射(mapping)介绍 映射:创建索引的时候,可以预先定义字 ...
- 【Elasticsearch 7 探索之路】(六)初识 Mapping
上一篇主要讲解什么是 URL Search 和 Request Body Search 的语法.本篇对 Mapping 的 Dynamic Mapping 以及手动创建 Mapping 进行讲解. 1 ...
- elasticsearch 5.x 系列之三 mapping 映射的时候的各个字段的设置
首先看来创建一个mapping 来show show: curl -XPUT "master:9200/zebra_info?pretty" -H 'Content-Type: a ...
- Elasticsearch学习系列之mapping映射
什么是映射 为了能够把日期字段处理成日期,把数字字段处理成数字,把字符串字段处理成全文本(Full-text)或精确(Exact-value)的字符串值,Elasticsearch需要知道每个字段里面 ...
- ElasticSearch Index API && Mapping
ElasticSearch NEST Client 操作Index var indexName="twitter"; var deleteIndexResponse = clie ...
- elasticsearch系列(三)分表分库
首先ES没有库和表的概念,只有index,type,document(详细术语可以看ES的系列一 http://www.cnblogs.com/ulysses-you/p/6736926.html), ...
随机推荐
- 转载一篇棒棒的AWK教程
处理文件经常要用到awk,老是找同事帮忙,次数多了难免被吐槽orz,其实之前也有找过awk的教程,表示一直看不太懂 最近翻到了这篇教程,表示笔者真的太棒了,反正我是看一遍就懂了哈哈 剩下的只是熟悉度的 ...
- java.util.UUID工具类
生成数据表的主键Id会用到此工具类 /** * <获取主鍵> * <获取32位UUID> * @return * @see [类.类#方法.类#成员] */ public st ...
- java程序启动参数
例如 启动进程如下 /home/work/noah/ccs/jc-controller/jdk1.7.0_55/bin/java -Xmx4096m -Xms4096m -Xmn1024m -XX:+ ...
- Jenkins Pipeline waitForQualityGate pending 超时
请参考链接:http://www.iotxing.com/2019/06/12/258/jenkins-pipeline-waitforqualitygate%E8%B6%85%E6%97%B6/ 主 ...
- 【Markdown】新手快速入门基础教程
Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档.当前许多网站都广泛使用 Markdown 来撰写帮助文档或是用于论坛上发表消息.例如:GitHub.简书.reddi ...
- git 提交的时候 建立排除文件夹或者文件
1.在Git的根仓库下 touch .gitignore 2.编辑这个文件
- 搭建Hexo一键生成,同步部署
全网最全小白搭建Hexo+Gitee/Coding/Github 全网最全小白搭建Hexo+Gitee/Coding/Github 本站内容已全部转移到https://www.myyuns.ltd,具 ...
- 【网易官方】极客战记(codecombat)攻略-地牢-高举之剑
关卡连接: https://codecombat.163.com/play/level/the-raised-sword 为了战斗,学会武装你自己. 简介 依照名字攻击每个食人魔.记住,每个食人魔需要 ...
- Git 把码云上被fork项目源码merge到fork出来的分支项目
Git 把码云上被fork项目源码merge到fork出来的分支项目 By:授客 QQ:1033553122 需求描述 被fork的项目有更新代码,希望把更新的代码merge到fork分支项目 解决方 ...
- 洛谷P1130红牌(简单DP)
题目描述 某地临时居民想获得长期居住权就必须申请拿到红牌.获得红牌的过程是相当复杂 ,一共包括NNN个步骤.每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件.为了加快进程,每一步政府都 ...