Elasticsearch:flattened 数据类型 (7.3 发行版新功能)
【腾讯云 Elasticsearch Service】高可用,可伸缩,云端全托管。集成X-Pack高级特性,适用日志分析/企业搜索/BI分析等场景
默认情况下,对象中的每个子字段都需要分别进行映射和索引。如果事先不知道子字段的名称或类型,则将动态映射它们。
flattened 数据类型提供了一种替代方法,其中将整个对象映射为单个字段。对于给定的对象,flatten 类型映射将解析出其 leaf 值并将它们作为关键字索引到一个字段中。然后可以通过简单的查询和汇总来搜索对象的内容。
此数据类型对于索引具有大量或未知数量的唯一键的对象很有用。仅为整个 JSON 对象创建一个字段映射,这可以帮助防止由于大量不同的字段映射而导致映射爆炸。
另一方面,flatten的对象字段在搜索功能方面存在折衷。仅允许基本查询,不支持数字范围查询或突出显示(highlighting)。
在使用 flattened 数据类型时,必须注意的是:
flattened 的映射类型不应用于索引所有文档内容,因为它将所有值都视为关键字,并且不提供完整的搜索功能。 在大多数情况下,默认方法(每个子字段在映射中都有其自己相对应的项)有效。
下面我们来用一个例子来展示如何使用 flattened 数据类型的用法。我们首先来创建一个叫做 bug_reports 的索引及它的 mapping:
PUT bug_reports{ "mappings": { "properties": { "title": { "type": "text" }, "labels": { "type": "flattened" } } }}
在上面,我们定义labels的数据类型为flattened,意味着这个字段可以用来保持一个对象。我们用一下的方法来创建一个文档:
POST bug_reports/_doc/1{ "title": "Results are not sorted correctly.", "labels": { "priority": "urgent", "release": [ "v1.2.5", "v1.3.0" ], "timestamp": { "created": 1541458026, "closed": 1541457010 } }}
在上面我们可以看出来: labels是一个对象,它包含 priority, release 及 timestamp leaf 项。在建立索引的时候,Elasticsearch 为JSON 对象的每一个 leaf 值建立 token,这些值被索引为字符串关键字,无需对数字或日期进行特殊处理。针对我们的情况,Elasticsearch 在建立索引时,会对 urgent,v1.2.5, v1.3.0, 1541458026及1541457010建立 token, 并供我们进行搜索。
我们可以通过如下的方式来进行查询:
POST bug_reports/_search{ "query": { "term": { "labels": "urgent" } }}
查询的结果是:
"hits" : { "total" : { "value" : 1, "relation" : "eq" }, "max_score" : 0.42763555, "hits" : [ { "_index" : "bug_reports", "_type" : "_doc", "_id" : "1", "_score" : 0.42763555, "_source" : { "title" : "Results are not sorted correctly.", "labels" : { "priority" : "urgent", "release" : [ "v1.2.5", "v1.3.0" ], "timestamp" : { "created" : 1541458026, "closed" : 1541457010 } } } } ] }
同样,我们可以对数值进行查询:
POST bug_reports/_search{ "query": { "term": { "labels": 1541458026 } }}
返回结果:
"hits" : { "total" : { "value" : 1, "relation" : "eq" }, "max_score" : 0.42763555, "hits" : [ { "_index" : "bug_reports", "_type" : "_doc", "_id" : "1", "_score" : 0.42763555, "_source" : { "title" : "Results are not sorted correctly.", "labels" : { "priority" : "urgent", "release" : [ "v1.2.5", "v1.3.0" ], "timestamp" : { "created" : 1541458026, "closed" : 1541457010 } } } } ] }
要查询flattened对象中的特定键,请使用“."来表示:
POST bug_reports/_search{ "query": { "term": { "labels.release": "v1.3.0" } }}
返回结果:
"hits" : { "total" : { "value" : 1, "relation" : "eq" }, "max_score" : 0.42763555, "hits" : [ { "_index" : "bug_reports", "_type" : "_doc", "_id" : "1", "_score" : 0.42763555, "_source" : { "title" : "Results are not sorted correctly.", "labels" : { "priority" : "urgent", "release" : [ "v1.2.5", "v1.3.0" ], "timestamp" : { "created" : 1541458026, "closed" : 1541457010 } } } } ] }
支持的操作
由于索引值的方式相似,flattened 字段与 keyword 字段共享许多相同的映射和搜索功能,这是因为它们在建立索引时的方式非常相似。
目前,flattened的对象字段可以与以下查询类型一起使用:
-
term
,terms
, andterms_set
prefix
range
-
match
andmulti_match
-
query_string
andsimple_query_string
exists
查询时,不可能使用通配符来引用字段关键字,例如 {“ term”:{“ labels.time *”:1541457010}}。 请注意,所有查询(包括范围)都将值视为字符串关键字。 拼合的字段不支持突出显示(highlighting)。
可以对 flattened 的对象字段进行排序,以及执行简单的关键字样式聚合(例如terms aggregation)。 与查询一样,对数字没有特殊支持-将 JSON 对象中的所有值都视为关键字。 排序时,这意味着按字典顺序对值进行比较。
展平的对象字段当前无法存储。 无法在映射中指定store参数。
参考:
【1】https://www.elastic.co/guide/en/elasticsearch/reference/master/flattened.html
最新活动
包含文章发布时段最新活动,前往ES产品介绍页,可查找ES当前活动统一入口
Elasticsearch Service自建迁移特惠政策>>
Elasticsearch Service 新用户特惠狂欢,最低4折首购优惠 >>
Elasticsearch Service 企业首购特惠,助力企业复工复产>>
关注“腾讯云大数据”公众号,技术交流、最新活动、服务专享一站Get~
- 半自动化运维之动态添加数据文件(一) (r5笔记第55天)
- 半自动化运维之动态添加数据文件(二) (r5笔记第56天)
- 11g Active DataGuard初探(r5笔记第54天)
- Github 项目推荐 | 用于构建端对端对话系统和训练聊天机器人的开源库 —— DeepPavlov
- 我身边的一些数据库事故 (r5笔记第52天)
- 一个清理脚本的改进思路(r5笔记第51天)
- 【专业技术】Python爬虫:抓取手机APP的传输数据
- 海量数据迁移之传输表空间(一) (r5笔记第71天)
- 一条sql语句的改进探索(r5笔记第70天)
- 【专业技术】Node.js 究竟是什么?
- Github 项目推荐 | 用 Pytorch 实现的 WaveNet-Vocoder
- 重启数据库的一场闹剧(r5笔记第68天)
- 【C语言系列】基础语法案例分析(初级篇)
- 一次ORA-00600问题的排查和分析(r5笔记第64、65天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android中AlertDialog四种对话框的最科学编写用法(实例代码)
- Android判断手机是否联网及自动跳转功能(收藏版)
- 使用Flutter实现一个走马灯布局的示例代码
- Android按钮美化样式的实现代码
- android自定义组件实现仪表计数盘
- Android10填坑适配指南(实际经验代码)
- Android中外接键盘的检测的实现
- Android Q适配之IMEI替换为Android_id
- Android实现折线走势图
- Android Selector 按下修改背景和文本颜色的实现代码
- Android使用RecyclerView实现投票系统
- Android Selector获取焦点后文本背景修改的实现代码
- 基于SceneForm实现子弹射击(绘制子弹运行轨迹)
- android实现清理缓存功能
- Android实现 Shape属性gradient 渐变效果