Elasticsearch 索引的映射配置详解
概述
Elasticsearch 与传统的 SQL数据库的一个明显的不同点是,Elasticsearch 是一个 非结构化 的数据库,或者说是一个 无模式 的数据库。Elasticsearch 中数据最重要的三要素当属:索引、类型、文档,其中索引这个概念非常重要,我们可以粗略地将其类比到传统SQL数据库中的 数据表。本文就从 Elasticsearch 的索引映射如何配置开始讲起。
注: 本文原载于 My Personal Blog,欢迎光临 小站 !
本文内容脑图如下:文章共1540字,阅读本文大约需要5分钟 !
索引模式映射
创建索引时,可以自定义索引的结构,比如 创建一个保存用户信息数据的 users
索引,其典型的结构如下:
-
id
:唯一表示符 -
name
:姓名 -
birthday
:出生日期 -
hobby
:爱好
为此我们可以创建一个 json 格式的索引模式映射文件:users.json
{ "mappings" : { "user" : { "properties" : { "id" : { "type" : "long", "store" : "yes" }, "name" : { "type" : "string", "store" : "yes", "index" : "analyzed" }, "birthday" : { "type" : "date", "store" : "yes" }, "hobby" : { "type" : "string", "store" : "no", "index" : "analyzed" } } } } }
上面的 json代码意义如下:
- 创建一个名称为
users
的 Index - 里面有一个名称为
user
的 Type - 而
user
有四个 field - 且每个 field 都有自己的 属性 定义
然后我们来执行如下命令来新建一个索引:
curl -X PUT http://47.98.43.236:9200/users -d @users.json
结果如下,索引 users
、类型 user
、以及 四个字段 都已经顺利插入:
关于字段的 可选类型,有如下几种:
-
string
:字符串 -
number
:数字 -
date
:日期 -
boolean
:布尔型 -
binary
:二进制 -
ip
:IP地址 -
token_count
类型
关于每种类型有哪些 属性,可参考官方文档,由于内容太多,此处不再赘述。
分析器的使用
分析器是一种用于 分析数据 或者按照用户想要的方式 处理数据 的工具,对于 字符串类型 的字段,Elasticsearch 允许用户自定义分析器。
- 先来自定义一个分析器
{ "settings" : { "index" : { "analysis" : { "analyzer" : { "myanalyzer" : { "tokenizer" : "standard", "filter" : [ "asciifolding", "lowercase", "myFilter" ] } }, "filter" : { "myFilter" : { "type" : "kstem" } } } } }, "mappings" : { "user" : { "properties" : { "id" : { "type" : "long", "store" : "yes" }, "name" : { "type" : "string", "store" : "yes", "index" : "analyzed", "analyzer" : "myanalyzer" }, "birthday" : { "type" : "date", "store" : "yes" }, "hobby" : { "type" : "string", "store" : "no", "index" : "analyzed" } } } } }
上述 json代码中,用户定义了一个名为 myanalyzer 的分析器,该分析器包含 一个分词器 + 三个过滤器,分别如下:
- 分词器:
standard
- 过滤器:
asciifolding
- 过滤器:
lowercase
- 过滤器:
myFilter
(自定义过滤器,其本质是kstem
)
- 再来看如何测试和使用自定义的分析器
可以通过类似如下的 Restful接口来测试 analyze API 的工作情况:
curl -X GET 'http://47.98.43.236:9200/users/_analyze?field=user.name' -d 'Cars Trains'
可见我们输入的时一行字符串普通"Cars Trains"
,而输出为:car
和 train
,这说明短语 "Cars Trains"
被分成了两个词条,然后全部转为小写,最后做了词干提取的操作,由此证明我们上面自定义的分析器已然生效了!
相似度模型的配置
Elasticsearch 允许为索引模式映射文件中的不同字段指定不同的 相似度得分 计算模型,其用法例析如下:
"mappings" : { "user" : { "properties" : { "id" : { "type" : "long", "store" : "yes" }, "name" : { "type" : "string", "store" : "yes", "index" : "analyzed", "analyzer" : "myanalyzer", "similarity" : "BM25" }, "birthday" : { "type" : "date", "store" : "yes" }, "hobby" : { "type" : "string", "store" : "no", "index" : "analyzed" } } } }
上述 json文件中,我们为
name
字段使用了BM25
这种相似度模型,添加的方法是使用similarity
属性的键值对,这样一来 Elasticsearch 将会为name
字段使用BM25
相似度计算模型来计算相似得分。
信息格式的配置
Elasticsearch 支持为每个字段指定信息格式,以满足通过改变字段被索引的方式来提高性能的条件。Elasticsearch 中的信息格式有如下几个:
-
default
:默认信息格式,其提供了实时的对存储字段和词向量的压缩 -
pulsing
:将 重复值较少字段 的信息列表 编码为词条矩阵,可加快 该字段的查询速度 -
direct
:该格式在读过程中将词条加载到未经压缩而存在内存的矩阵中,该格式可以提升常用字段的性能,但损耗内存 -
memory
:该格式将所有的数据写到磁盘,然后需要FST来读取词条和信息列表到内存中 -
bloom_default
:默认信息格式的扩展,增加了把bloom filter
写入磁盘的功能。读取时bloom filter
被读取并存入内存,以便快速检查给定的值是否存在 -
bloom_pulsing
:pulsing
格式的扩展,也加入bloom filter
的支持
信息格式字段(postings_format
)可以在 任何一个字段上 进行设置,配置信息格式的示例如下:
"mappings" : { "user" : { "properties" : { "id" : { "type" : "long", "store" : "yes", "postings_format" : "pulsing" }, "name" : { "type" : "string", "store" : "yes", "index" : "analyzed", "analyzer" : "myanalyzer" }, "birthday" : { "type" : "date", "store" : "yes" }, "hobby" : { "type" : "string", "store" : "no", "index" : "analyzed" } } } }
在该例子之中,我们手动配置改变了
id
字段的信息格式为pulsing
,因此可加快该字段的查询速度。
文档值及其格式的配置
文档值 这个字段属性作用在于:其允许将给定字段的值被写入一个更高内存效率的结构,以便进行更加高效的排序和搜索。我们通常可以将该属性加在 需要进行排序 的字段上,这样可以 提效。
其配置方式是 通过属性 doc_values_format
进行,有三种常用的 doc_values_format
属性值,其含义从名字中也能猜个大概:
-
default
:默认格式,其使用少量的内存但性能也不错 -
disk
:将数据存入磁盘,几乎无需内存 -
memory
:将数据存入内存
举个栗子吧:
"mappings" : { "user" : { "properties" : { "id" : { "type" : "long", "store" : "yes" }, "name" : { "type" : "string", "store" : "yes", "index" : "analyzed", "analyzer" : "myanalyzer" }, "birthday" : { "type" : "date", "store" : "yes" }, "hobby" : { "type" : "string", "store" : "no", "index" : "analyzed" }, "age" : { "type" : "integer", "doc_values_format" : "memory" } } } }
上述 json配置中,我们给类型
user
添加了一个age
字段,假如我们想对年龄字段进行排序,那么给该字段设置文档值格式的属性是可以提升效率的。
后 记
由于能力有限,若有错误或者不当之处,还请大家批评指正,一起学习交流!
可 长按 或 扫描 下面的 小心心 来订阅 CodeSheep,获取更多 务实、能看懂、可复现的 原创文 ↓↓↓
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
HBase查询优化之Short-Circuit Local Reads
1.概述 在《HBase查询优化》一文中,介绍了基于HBase层面的读取优化。由于HBase的实际数据是以HFile的形式,存储在HDFS上。那么,HDFS层面也有它自己的优化点,即:Short-Circuit Local Reads。本篇博客笔者将从HDFS层面来进行优化,从而间接的提升HBase的查询性能。 2.内容 Hadoop系统在设计之初,遵循一个原则,那就是移动计算的代价比移动数据要小。故Hadoop在做计算的时候,通常是在本地节点上的数据中进行计算。即计算和数据本地化。流程如下图所示: 在最开始的时候,短回路本地化读取和跨节点的读取的处理方式是一样的,流程都是先从DataNode读取数据,然后通过RPC服务把数据传输给DFSClient,这样处理虽然流程比较简单,但是读取性能会受到影响,因为跨节点读取数据,需要经过网络将一个DataNode的数据传输到另外一个DataNode节点(一般来说,HDFS有3个副本,所以,本地取不到数据,会到其他DataNode节点去取数据)。 2.1 方案一:客户端直接读取DataNode文件 短回路本地化读取的核心思想是,由于客户端和数据...
- 下一篇
Flink 靠什么征服饿了么工程师?
平台现状 下面是目前饿了么平台现状架构图: 来源于多个数据源的数据写到kafka里,计算引擎主要是Storm,Spark和Flink,计算引擎出来的结果数据再落地到各种存储上。 目前Storm任务大概有100多个,Spark任务有50个左右,Flink暂时还比较少。 目前我们集群规模每天数据量有60TB,计算次数有1000000000,节点有400个。这里要提一下,Spark和Flink都是on yarn的,其中Flink onyarn主要是用作任务间jobmanager隔离, Storm是standalone模式。 应用场景 1.一致性语义 在讲述我们应用场景之前,先强调实时计算一个重要概念, 一致性语义: 1) at-most-once:即fire and forget,我们通常写一个java的应用,不去考虑源头的offset管理,也不去考虑
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果