2.elasticsearch中的mapping
mapping 顾名思义,代表了映射关系。是文档中字段和数据类型的映射关系
为什么要了解mapping
虽然elasticsearch中已尽有的动态mapping(Dynamic Mapping),而且新增字段默认也会添加新的mapping,但是毕竟是机器,有时会推算的不对,比如地理位置信息,特殊格式化的日期类型等。这时,如果需要es提供排序、聚合等查询功能,就不能满足我们的需求。
什么是mapping
- 通过手动设置mapping,我们可以
- 定义文档里字段的数据类型
- 定义字段的名称
- 定义对应字段的是否索引
- 定义对应字段的分词方式
- mapping会把JSON文档文档映射成Lucene所需要的扁平格式
- 一个mapping属于一个索引的type
- 每个文档都属于一个Type
- 一个type又一个mapping定义
- 7.0开始,不需要在mapping定义中指定type信息,因为默认每个索引只有一个type叫"_doc"
查询mapping
#GET 索引名/_mapping
GET mapping_test/_mapping
设置mapping
PUT users
{
"mappings" : {
"properties" : {
"firstName" : {
"type" : "text",//text类型全文搜索
"fields" : {
"keyword" : {
"type" : "keyword",//keyword支持聚合查询
"ignore_above" : 256
}
}
},
"lastName" : {
"type" : "keyword",
"null_value": "NULL"//支持字段为null,只有keyword类型支持
},
"mobile" : {
"type" : "text",
"index": false//此字段不被索引
},
"address":{
"type":"text",
"index_options":"offsets"//控制倒排索引记录的内容。offsets最多,记录四个
}
}
}
}
Dynamic Mapping
什么是动态mapping
在写入文档时,如果索引不存在,会自动创建索引,字段类型的自动识别如下:
JSON类型 | Elastic search类型 |
---|---|
字符串 | 1、匹配日期格式,设置成Date 2、配置数子设置为float或者long,该选项默认关闭3、设置为text,并且增加keyword字段,超过256位 不分词 |
布尔值 | boolean |
浮点数 | float |
整数 | long |
对象 | object |
数组 | 由第一个非空数值的类型做决定 |
空值 | 忽略 |
PUT dynamic_mapping_test/_mapping
{
"dynamic": false
}
PUT dynamic_mapping_test/_mapping
{
"dynamic": strict
}
dynamic属性默认为true,新增字段时会自动创建mapping
dynamic属性被设置为false时,新增字段不会创建mapping,但是数据会存储,无法根据字段条件查询,但是该字段会会被match_all查询处理
dynamic属性被设置为strict时,数据写入直接出错
es中字段对应的数据类型
- 简单类型
- text/keyword,对应json中的String,一般会设置字段为text,然后新建个keyword子字段,设置为keyword类型
- text类型被用来索引长文本,在建立索引前会将这些文本进行分词,转化为词的组合,建立索引。允许es来检索这些词语。text类型不能用来排序和聚合。
- Keyword类型不需要进行分词,可以被用来检索过滤、排序和聚合。keyword 类型字段只能用本身来进行检索
- date
- long, integer, short, byte, double, float
- boolean
- IPv4&IPv6
- text/keyword,对应json中的String,一般会设置字段为text,然后新建个keyword子字段,设置为keyword类型
- 复杂类型-对象和嵌套对象
- 对象类型/嵌套类型(n)
- 特殊类型
- geo_point&geo_shape/percolator
如何设置自定义mapping
常见的属性
- index 控制当前字段是否被索引,默认为true,如果设置成false,该字段不可被搜索
- index_options 控制倒排索引记录的内容
- docs 记录doc id
- freqs 记录doc id 和term frequencies
- positions 记录doc id/term frequencies/term position
- offsets 记录doc id/term frequencies/term position/character offects
- null_value 需要对字段为null值实现搜索
- 只有keyword类型支持设定为null_value
- copy_to
- _all在7+版本中被copy_t所替代
- 将字段内容拷贝到目标字段,查询时可以用目标字段作为查询条件,但是不会出现_source中
- fields
- 在字段下新增一个字段,可以自定义类型,使用不同的analyzer
- 可以用来实现以拼音方式搜索中文字段
- analyzer 分词器
- standard 默认分词器,按词切分,小写处理
- simple 按照非字母切分(符号被过滤),小写处理
- stop 小写处理,停用词过滤(the、a、is)
- whitespace 按照空格切分,不转小写
- keyword 不分词,直接将输入当作输出
- patter 正则表达式,默认\W+(非字符分隔)
- language 提供了30多种常见语言的分词器(english、german)
- 中文分词 icu_analyzer、ik、thulac
什么是分词器
分词器分为三部分,分别担任不同的工作
- character filters 对文本进行预处理,如去除html标签、字符串替换、正则匹配替换
- tokenizer 将文本按照一定规则,切分为词
- token filter 将tokenizer切分的词进行增加、修改、删除操作(添加近义词,复数改单数,小写)
设置自定义的分词器
可以将分词器的三个组成部分,自己搭配,实现自定义,也可以用java实现tokenizer插件
{
"tokenizer":"keyword",
"char_filter":["html_strip"],
"filter": ["stop","snowball"]
}
{
"tokenizer":"standard",
"char_filter": [
{
"type" : "mapping",
"mappings" : [ ":) => happy", ":( => sad"]
}
],
"filter": ["stop","snowball"]
}
#自定分词器,并且让firstName字段使用自定义分词器
PUT users
{
"settings": {
"analysis": {
"analyzer": {
"my_custom_analyzer": {
"type": "custom",
"char_filter": [
"emoticons"
],
"tokenizer": "punctuation",
"filter": [
"lowercase",
"english_stop"
]
}
},
"tokenizer": {
"punctuation": {
"type": "pattern",
"pattern": "[.,!?]"
}
},
"char_filter": {
"emoticons": {
"type": "mapping",
"mappings": [
":) => _happy_",
":( => _sad_"
]
}
},
"filter": {
"english_stop": {
"type": "stop",
"stopwords": "_english_"
}
}
}
},
"mappings" : {
"properties" : {
"firstName" : {
"type" : "text",
"analyzer": "my_custom_analyzer",
"fields": {
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
},
"lastName" : {
"type" : "keyword",
"null_value": "NULL"
},
"mobile" : {
"type" : "text",
"index": false
},
"address":{
"type":"text",
"index_options":"offsets"
}
}
}
}
设置索引模版和动态模版
比如索引是日志时,每天增加一个索引,那么设置索引模版可以自动按照模版生成索引mapping,设置分片。
index template
- 帮助你设定mapping和setting,并按照一定的规则,自动匹配到新创建的索引之上
- 模版仅在一个索引创建时产生作用,修改模版不会影响已创建的索引
- 可以设定多个索引模版,这些设置会被“merge”在一起
- 可以指定“order”的数值,控制“merging”的过程
PUT _template/template_default
{
"index_patterns": ["*"],
"order" : 0,
"version": 1,
"settings": {
"number_of_shards": 1,
"number_of_replicas":1
}
}
PUT /_template/template_test
{
"index_patterns" : ["test*"],
"order" : 1,
"settings" : {
"number_of_shards": 1,
"number_of_replicas" : 2
},
"mappings" : {
"date_detection": false,//匹配字符串转日期功能
"numeric_detection": true//匹配字符串转数值功能
}
}
#获取template
GET /_template/temp*
当一个索引被创建时
- 应用elasticsearch默认的settings和mappings
- 应用order数值低的index template中的设定
- 应用order数值高的,之前的设定会被覆盖
- 应用创建索引时用户指定的setting和mappings,覆盖之前模版中的设定
dynamic template(感觉用到的不多)
- 根据elasticsearch识别的数据类型,结合字段名称,对一个索引来动态设定字段类型,比如
- 所有的字符串类型都设置成keyword
- is开头的字段都设置成boolean
- long开头的都设置成long类型
PUT my_index
{
"mappings": {
"dynamic_templates": [
{
"strings_as_boolean": {
"match_mapping_type": "string",
"match":"is*",
"mapping": {
"type": "boolean"
}
}
},
{
"strings_as_keywords": {
"match_mapping_type": "string",
"mapping": {
"type": "keyword"
}
}
}
]
}
}
2.elasticsearch中的mapping的更多相关文章
- elasticsearch中的mapping映射配置与查询典型案例
elasticsearch中的mapping映射配置与查询典型案例 elasticsearch中的mapping映射配置示例比如要搭建个中文新闻信息的搜索引擎,新闻有"标题".&q ...
- ElasticSearch 中的 Mapping
公号:码农充电站pro 主页:https://codeshellme.github.io 1,ES 中的 Mapping ES 中的 Mapping 相当于传统数据库中的表定义,它有以下作用: 定义索 ...
- elasticsearch中的mapping简介
默认mapping elasticsearch(以下简称ES)是没有模式(schema)的,当我们执行以下命令: curl -d '{"name":"zach" ...
- 如何在Elasticsearch中安装中文分词器(IK+pinyin)
如果直接使用Elasticsearch的朋友在处理中文内容的搜索时,肯定会遇到很尴尬的问题--中文词语被分成了一个一个的汉字,当用Kibana作图的时候,按照term来分组,结果一个汉字被分成了一组. ...
- 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据操作(二)
CSSDesk body { background-color: #2574b0; } /*! zybuluo */ article,aside,details,figcaption,figure,f ...
- 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据操作
http://www.cnblogs.com/wgp13x/p/4934521.html 内容一样,样式好的版本. 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据 ...
- elasticsearch的映射(mapping)和分析(analysis)
转发自:http://blog.csdn.net/hzrandd/article/details/47128895 分析和分析器 分析(analysis)是这样一个过程: 首先,表征化一个文本块为适用 ...
- ES 15 - Elasticsearch中的数据类型 (text、keyword、date、geo等)
目录 1 核心数据类型 1.1 字符串类型 - string(不再支持) 1.1.1 文本类型 - text 1.1.2 关键字类型 - keyword 1.2 数字类型 - 8种 1.3 日期类型 ...
- ES 11 - 配置Elasticsearch的映射 (mapping)
目录 1 映射的相关概念 1.1 什么是映射 1.2 映射的组成 1.3 元字段 1.4 字段的类型 2 如何配置mapping 2.1 创建mapping 2.2 更新mapping 2.3 查看m ...
- Elasticsearch学习之图解Elasticsearch中的_source、_all、store和index属性
转自 : https://blog.csdn.net/napoay/article/details/62233031 1. 概述 Elasticsearch中有几个关键属性容易混淆,很多人搞不清楚_s ...
随机推荐
- Solution -「洛谷 P5659」「CSP-S 2019」树上的数
Description Link. 联赛原题应该都读过吧-- Solution Part 0 大致思路 主要的思路就是逐个打破,研究特殊的数据得到普通的结论. Part 1 暴力的部分分 暴力的部分分 ...
- Solution -「SCOI 2016」萌萌哒
Description Link. 给定一个长度为 \(n\) 的数组让你填数,需要满足 \(m\) 个形如 \(([l_{1},r_{1}],[l_{2},r_{2}])\) 的要求,这两个区间填好 ...
- Go 语言的前生今世与介绍
Go 语言的前生今世与介绍 目录 Go 语言的前生今世与介绍 一. Go 语言的发展 1.1 Go 语言是如何诞生的? 1.2 Go语言的早期团队和演进历程 1.3 Go语言正式发布并开源 1.4 G ...
- MySQL5.7版本单节点大数据量迁移到PXC8.0版本集群全记录-1
一个5.7版本的MySQL单点数据库,版本信息是: Server version: 5.7.31-log MySQL Community Server (GPL) 数据量已达到760G,日常存在性能问 ...
- Python 提取PDF文本和图片
从PDF中提取内容能帮助我们获取文件中的信息,以便进行进一步的分析和处理.此外,在遇到类似项目时,提取出来的文本或图片也能再次利用.要在Python中通过代码提取PDF文件中的文本和图片,可以使用 S ...
- 深度学习 YOLO v1 源码+笔记
""" Yolo V1 by tensorflow """ import numpy as np import tensorflow._ap ...
- 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(7) -- 图标列表展示和选择处理
我们在WPF应用端的界面中,使用lepoco/wpfui 来做主要的入口框架,这个项目它的菜单内置了不少图标,我们需要在动态菜单的配置中,使用它作为图标的展示处理,本篇随笔介绍如何基于图标枚举集合进行 ...
- CF1526C1
题目简化和分析: 给您一个数组,在其中选择若干个数使得: 任意前缀和 \(\ge 0\) 数量尽可能的大 我们可以使用贪心策略,策略如下: 如果当前数为非负,必喝. 而毒药尽可能的多喝,如果喝没了,就 ...
- mysql修改密码和开启远程访问
mysql默认是关闭远程访问的,开启命令如下 1.首先打开mysql所在的bin目录,C:\Program Files\MySQL\MySQL Server 5.5\bin 在地址栏输入cmd,回车 ...
- .NET6发布项目到腾讯云Windows2012R全网最详细教程
注意:本次使用腾讯云作为本次的演示 1.创建服务器及连接 1.1 请先在腾讯云.阿里云等创建实例 1.2 打开远程连接工具输入在腾讯云获取的公网iP输入计算机 1.3 根据图片点击连接 1.4 输入服 ...