公号:码农充电站pro

主页:https://codeshellme.github.io

通常在使用 ES 构建数据模型时,需要考虑以下几点:

  • 字段类型
  • 是否需要搜索与分词
  • 是否需要聚合与排序
  • 是否需要额外的存储

1,字段类型

对于不同类型的数据,主要考虑下面几点:

  • 对于 Text 类型:用于全文本字段,数据会被分词器分词。

    • 默认不支持聚合分析及排序,需要设置 fielddatatrue
  • 对于 Keyword 类型:用于不需要分词处理的文本,例如手机号,email 地址,性别等。
    • 适用于精确匹配,支持聚合与排序。
  • 对于多字段类型:默认情况下,ES 会为将文本设置为 text 类型,并添加一个 keyword 子字段。
    • 在处理人类语言时,可以通过增加“英文”,“拼音”和“标准”分词器,来满足搜索需求。
  • 对于数值类型:尽量选择贴近的类型。比如 byte 类型能满足需求,就不要用 long

2,搜索需求

对于搜索需求,主要考虑以下几点:

  • 如果不需要检索,排序和聚合,可将 enabled 设置成 false,以减少不必要的处理(磁盘开销),来提高性能。
  • 如果不需要检索,但需要排序与聚合,可将 index 设置成 false

3,聚合与排序

对于聚合与排序,主要考虑以下几点:

  • 如果不需要检索,排序和聚合,可将 enabled 设置成 false
  • 如果需要检索,但不需要排序与聚合,可将 doc_valuesfielddata 设置成 false
  • 对于keyword 类型的字段,如果更新与聚合比较频繁,推荐将 eager_global_ordinals 设置为 true(可以达到利用缓冲的目的,提高性能)。

4,额外存储

store 设置为 true(默认为 false),可以存储字段的原始内容;一般在 _sourceenabledfalse 时使用。

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 的内容过大,导致过大的网络开销。

为了优化,可以将 _sourceenabled 设置为 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 DSL 查询

ElasticSearch 文档及操作

ElasticSearch 搜索模板与建议

ElasticSearch 聚合分析

ElasticSearch 中的 Mapping


欢迎关注作者公众号,获取更多技术干货。

ElasticSearch 数据建模的更多相关文章

  1. [转] [Elasticsearch] 数据建模 - 处理关联关系(1)

    [Elasticsearch] 数据建模 - 处理关联关系(1) 标签: 建模elasticsearch搜索搜索引擎 2015-08-16 23:55 6958人阅读 评论(0) 收藏 举报 分类: ...

  2. Elasticsearch 数据建模指南

    文章转载自:https://mp.weixin.qq.com/s/vSh6w3eL_oQvU1mxnxsArA 0.题记 我在做 Elasticsearch 相关咨询和培训过程中,发现大家普遍更关注实 ...

  3. ES 32 - Elasticsearch 数据建模的探索与实践

    目录 1 什么是数据建模? 2 如何对 ES 中的数据进行建模 2.1 字段类型的建模方案 2.2 检索.聚合及排序的建模方案 2.3 额外存储的建模方案 3 ES 数据建模实例演示 3.1 动态创建 ...

  4. Elasticsearch数据建模笔记

    数据建模 数据建模是创建数据模型的过程 数据模型是对真实世界进行抽象描述的一种工具和方法,实现对现实世界的映射 三个过程:概念模型=>逻辑模型=>数据模型 数据模型:结合具体的数据库,在满 ...

  5. ElasticSearch——数据建模最佳实践

    如何建模 mapping 设计非常重要,需要从两个维度进行考虑: 功能:搜索.排序.聚合 性能:存储的开锁.内存的开销.搜索的性能 mapping 注意事项: 加入新字段很容易(必要时需要 updat ...

  6. 论Elasticsearch数据建模的重要性

    文章转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484159&idx=1&sn=731562a ...

  7. Elasticsearch 6.x版本全文检索学习之数据建模

    1.什么是数据建模. 答:数据建模,英文为Data Modeling,为创建数据模型的过程.数据模型Data Mdel,对现实世界进行抽象描述的一种工具和方法,通过抽象的实体及实体之间联系的形式去描述 ...

  8. Cassandra数据建模

    1.  概述 Apache Cassandra将数据存储在表中,每个表都由行和列组成.CQL(Cassandra查询语言)用于查询存储在表中的数据.Apache Cassandra数据模型基于查询并针 ...

  9. 《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型

    第二章 实体数据建模基础 很有可能,你才开始探索实体框架,你可能会问“我们怎么开始?”,如果你真是这样的话,那么本章就是一个很好的开始.如果不是,你已经建模,并在实体分裂和继承方面感觉良好,那么你可以 ...

随机推荐

  1. D - D (最短路解决源点到多点,多点到源点的和(有向图))

    问从1号点到各个点的距离+各个点到1号点之间的距离和的最小值 In the age of television, not many people attend theater performances ...

  2. CF-1328 F. Make k Equal

    F. Make k Equal 题目链接 题意 长度为n的序列,每次可以选择一个最大的数字将其减一或者选择一个最小的数字将其加一,问最少操作多少次可以使得序列中至少存在 k 个一样的数字 分析 官方题 ...

  3. codeforces626D . Jerry's Protest (概率)

    Andrew and Jerry are playing a game with Harry as the scorekeeper. The game consists of three rounds ...

  4. HDU 1173 思路题

    题目大意 有n个地点(坐标为实数)需要挖矿,让选择一个地点,使得在这个地方建造基地,到n个地点的距离和最短,输出基地的坐标. 题解+代码: 1 /* 2 把这个二维分开看(即把所有点投影到x轴上,再把 ...

  5. JDK的卸载与安装

    JDK的卸载 删除Java的安装目录 删除JAVA_HOME 删除path下关于Java的目录 DOS命令Java -version查看状态 JDK的安装 百度搜索jdk8,找到下载地址 同意协议 下 ...

  6. 超易懂!原来SOLID原则要这么理解!

    说到 SOLID 原则,相信有过几年工作经验的朋友都有个大概印象,但就是不知道它具体是什么.甚至有些工作了十几年的朋友,它们对 SOLID 原则的理解也停留在表面.今天我们就来聊聊 SOLID 原则以 ...

  7. Gitlab 快速部署及日常维护 (一)

    一.GitLab简介GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务 二.GitLab系统架构git用户的主目录通常是/home/git(~ ...

  8. Leetcode(877)-石子游戏

    亚历克斯和李用几堆石子在做游戏.偶数堆石子排成一行,每堆都有正整数颗石子 piles[i] . 游戏以谁手中的石子最多来决出胜负.石子的总数是奇数,所以没有平局. 亚历克斯和李轮流进行,亚历克斯先开始 ...

  9. LOJ6285 数列分块入门9(分块 区间众数)题解

    题意:给出区间内的最小众数 思路:分块,离散化每个数,开vector记录每个数p出现的位置,这样就能二分出L,R以内p的个数了.众数有一个性质,用mode(a)表示集合a的众数,那么mode(a∪b) ...

  10. μC/OS-III---I笔记4---软件定时器

    软件定时器是在硬件定时器的基础上开发的,通过将一个硬件定时器进行分频及管理就可以的到多个软件定时器.他和时间管理共同组成了系统的时间管理大部分的内容.系统一开始的系统初始化函数OSInit函数内调用了 ...