ElasticSearch 数据建模
公号:码农充电站pro
主页:https://codeshellme.github.io
通常在使用 ES 构建数据模型时,需要考虑以下几点:
- 字段类型
- 是否需要搜索与分词
- 是否需要聚合与排序
- 是否需要额外的存储
1,字段类型
对于不同类型的数据,主要考虑下面几点:
- 对于 Text 类型:用于全文本字段,数据会被分词器分词。
- 默认不支持聚合分析及排序,需要设置 fielddata 为
true。
- 默认不支持聚合分析及排序,需要设置 fielddata 为
- 对于 Keyword 类型:用于不需要分词处理的文本,例如手机号,email 地址,性别等。
- 适用于精确匹配,支持聚合与排序。
- 对于多字段类型:默认情况下,ES 会为将文本设置为 text 类型,并添加一个 keyword 子字段。
- 在处理人类语言时,可以通过增加“英文”,“拼音”和“标准”分词器,来满足搜索需求。
- 对于数值类型:尽量选择贴近的类型。比如 byte 类型能满足需求,就不要用 long。
2,搜索需求
对于搜索需求,主要考虑以下几点:
3,聚合与排序
对于聚合与排序,主要考虑以下几点:
- 如果不需要检索,排序和聚合,可将 enabled 设置成
false。 - 如果需要检索,但不需要排序与聚合,可将 doc_values 和 fielddata 设置成
false。 - 对于keyword 类型的字段,如果更新与聚合比较频繁,推荐将 eager_global_ordinals 设置为
true(可以达到利用缓冲的目的,提高性能)。
4,额外存储
将 store 设置为 true(默认为 false),可以存储字段的原始内容;一般在 _source 的 enabled 为 false 时使用。
5,示例
如果需要对一些图书信息进行建模,需求如下:
- 书名:支持全文本及精确匹配
- 简介:支持全文本
- 作者:支持精确匹配
- 出版日期:日期类型
- 图书封面:不需要支持搜索
示例数据如下:
{
"title":"Mastering ElasticSearch 5.0",
"description":"Master the searching, indexing, and aggregation features in ElasticSearch Improve users’ search experience with Elasticsearch’s functionalities and develop your own Elasticsearch plugins",
"author":"Bharvi Dixit",
"public_date":"2017",
"cover_url":"https://images-na.ssl-images-amazon.com/images/I/51OeaMFxcML.jpg"
}
如果不手动设置 mapping,那么每个字段将被 ES 设置为如下类型:
{
"type" : "text", # text 类型
"fields" : { # 并添加一个 keyword 子字段
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
5.1,手动设置 mapping
下面根据需求,手动设置 mapping:
PUT books
{
"mappings": {
"properties": {
"author": {
"type": "keyword"
},
"cover_url": {
"type": "keyword",
"index": false # 不需要支持搜索
},
"description": {
"type": "text"
},
"public_date": {
"type": "date"
},
"title": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 100
}
}
}
}
}
}
5.2,增加需求
如果现在需要添加一个字段 content,用于存储图书的内容,因此该字段的信息量将非常大,这将导致 _source 的内容过大,导致过大的网络开销。
为了优化,可以将 _source 的 enabled 设置为 false,然后将每个字段的 store 设置为 true(打开额外存储)。
如下:
PUT books
{
"mappings": {
"_source": {
"enabled": false # enabled 为 false
},
"properties": {
"author": {
"type": "keyword",
"store": true # store 为 true
},
"cover_url": {
"type": "keyword",
"index": false,
"store": true # store 为 true
},
"description": {
"type": "text",
"store": true # store 为 true
},
"content": {
"type": "text",
"store": true # store 为 true
},
"public_date": {
"type": "date",
"store": true # store 为 true
},
"title": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 100
}
},
"store": true # store 为 true
}
}
}
}
将 _source 禁止掉之后,查询的结果中就没有了 _source 字段;如果需要哪些字段的内容,则需要设置 stored_fields,如下:
POST books/_search
{
"stored_fields": ["title","author","public_date"],
"query": {
"match": {
"content": "searching"
}
}
}
(本节完。)
推荐阅读:
欢迎关注作者公众号,获取更多技术干货。

ElasticSearch 数据建模的更多相关文章
- [转] [Elasticsearch] 数据建模 - 处理关联关系(1)
[Elasticsearch] 数据建模 - 处理关联关系(1) 标签: 建模elasticsearch搜索搜索引擎 2015-08-16 23:55 6958人阅读 评论(0) 收藏 举报 分类: ...
- Elasticsearch 数据建模指南
文章转载自:https://mp.weixin.qq.com/s/vSh6w3eL_oQvU1mxnxsArA 0.题记 我在做 Elasticsearch 相关咨询和培训过程中,发现大家普遍更关注实 ...
- ES 32 - Elasticsearch 数据建模的探索与实践
目录 1 什么是数据建模? 2 如何对 ES 中的数据进行建模 2.1 字段类型的建模方案 2.2 检索.聚合及排序的建模方案 2.3 额外存储的建模方案 3 ES 数据建模实例演示 3.1 动态创建 ...
- Elasticsearch数据建模笔记
数据建模 数据建模是创建数据模型的过程 数据模型是对真实世界进行抽象描述的一种工具和方法,实现对现实世界的映射 三个过程:概念模型=>逻辑模型=>数据模型 数据模型:结合具体的数据库,在满 ...
- ElasticSearch——数据建模最佳实践
如何建模 mapping 设计非常重要,需要从两个维度进行考虑: 功能:搜索.排序.聚合 性能:存储的开锁.内存的开销.搜索的性能 mapping 注意事项: 加入新字段很容易(必要时需要 updat ...
- 论Elasticsearch数据建模的重要性
文章转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484159&idx=1&sn=731562a ...
- Elasticsearch 6.x版本全文检索学习之数据建模
1.什么是数据建模. 答:数据建模,英文为Data Modeling,为创建数据模型的过程.数据模型Data Mdel,对现实世界进行抽象描述的一种工具和方法,通过抽象的实体及实体之间联系的形式去描述 ...
- Cassandra数据建模
1. 概述 Apache Cassandra将数据存储在表中,每个表都由行和列组成.CQL(Cassandra查询语言)用于查询存储在表中的数据.Apache Cassandra数据模型基于查询并针 ...
- 《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型
第二章 实体数据建模基础 很有可能,你才开始探索实体框架,你可能会问“我们怎么开始?”,如果你真是这样的话,那么本章就是一个很好的开始.如果不是,你已经建模,并在实体分裂和继承方面感觉良好,那么你可以 ...
随机推荐
- 2019牛客暑期多校训练营(第四场)A-meeting(树的直径)
>传送门< 题意:n给城市有n-1条路相连,每两个城市之间的道路花费为1,有k个人在k个城市,问这k个人聚集在同一个城市的最小花费 思路:(官方给的题解写的挺好理解的) 考虑距离最远的两个 ...
- Educational Codeforces Round 90 (Rated for Div. 2) A. Donut Shops(数学)
题目链接:https://codeforces.com/contest/1373/problem/A 题意 有两种包装的甜甜圈,第一种 $1$ 个 $a$ 元,第二种 $b$ 个 $c$ 元,问买多少 ...
- [CodeForces-629A 用阶乘会爆掉
题意: 给你一个n*n的蛋糕,如果某个位置是'C'那就代表这是一个巧克力块,否则就不是.如果某两个巧克力块在同一行或同一列,那么这个家庭的幸福值就会加1,问你这个家庭的幸福值最大是多少 Input 3 ...
- leetcode一些细节
取数组中点时不要写 int mid = (left + right) // 2;,「这么写有一个问题:数值越界,例如left和right都是最大int,这么操作就越界了,在二分法中尤其需要注意!」 所 ...
- Python优化机制:常量折叠
英文:https://arpitbhayani.me/blogs/constant-folding-python 作者:arprit 译者:豌豆花下猫("Python猫"公众号作者 ...
- C++ part3
函数和const references: C++中const用于函数重载 有些情况可以重载,有些不行,具体看↑. 隐式类型转换 references: nowcoder 对于内置类型,低精度的变量给高 ...
- Gym 101128J Saint John Festival(凸包 + 二分判点和凸包关系)题解
题意:给你一堆黑点一堆红点,问你有最多几个黑点能找到三个红点,使这个黑点在三角形内? 思路:显然红点组成的凸包内的所有黑点都能做到.但是判断黑点和凸包的关系朴素方法使O(n^2),显然超时.那么我现在 ...
- μC/OS-III---I笔记5---多值信号量
多值信号量 操作系统中利用信号量解决进程间的同步和互斥(互斥信号量)的问题,在多道程序环境下,操作系统如何实现进程之间的同步和互斥显得极为重要.比如对同一部分资源的访问是要互斥,不能在另一个进程A在访 ...
- C++模板沉思录
0 论抽象--前言 故事要从一个看起来非常简单的功能开始: 请计算两个数的和. 如果你对Python很熟悉,你一定会觉得:"哇!这太简单了!",然后写出以下代码: def Plus ...
- js console 性能测试 & don't-use-array-foreach-use-for-instead
don't-use-array-foreach-use-for-instead slower https://coderwall.com/p/kvzbpa/don-t-use-array-foreac ...