elasticsearch中的数据类型:flattened和join
flattened:比如你有一个字段的值是一个json,这个json里面又有很多字段,你又不想一个一个的定义这些字段到mapping,就可以用flattened
直接动手:创建索引:
PUT person
{
"mappings": {
"properties": {
"patient_name": {
"type": "text"
},
"detail": {
"type": "flattened"
}
}
}
}
注意这里details字段类型为flattened, 然后插入文档:
PUT person/_doc/1
{
"patient_name": "John Doe",
"detail": {
"age": 143,
"skills": [
"java",
"python",
"ai"
],
"history": "none",
"friends": [
"Neo",
"James",
"Tony Stark"
]
}
}
然后搜索:
GET person/_search
{
"query": {
"match": {
"detail": "java"
}
}
}
注意这里直接搜索detail,可以搜索到我们刚刚插入的那个文档,但是我们也可以搜索detail.skills,比如
"detail.skills": "java"
也能搜索到那个文档,但是如果我们这样搜索就搜索不到:
"detail.friends": "java"
还有一点,这里的每个字段会被定义成keyword类型,所以你如果这样搜索就搜索不到:
"detail.friends": "Tony"
你必须完全匹配才能搜索的到:
"detail.friends": "Tony Stark"
再来看看join类型,说的是一个索引里面一个文档和其他几个文档有关联,比如几个文档的父文档都是那一个文档,动手:
先创建索引:
PUT person2
{
"mappings": {
"properties": {
"relationship": {
"type": "join",
"relations": {
"star": "fans"
}
}
}
}
}
这里relationship是一个字段名,类型是join,指的明星和粉丝的关系,所以里面有一个类型的参数relations,它的取值star:fans分别表示父和子的关联类型,后面会用到。
插入文档,首先入场的当然是我们的坤坤:
PUT person2/_doc/1
{
"name": "August Kun",
"relationship": {
"name": "star"
}
}
这里的relationship.name是star,这个值是在前面mapping里面定义的,前面提到过,如果你写个super_star,就会报错:
unknown join name [doctor2] for field [relationship]
然后来个小黑子:
PUT person2/_doc/2?routing=tony
{
"name":"小黑子",
"relationship":{
"name":"fans",
"parent":1
}
}
注意这里有个routing参数,如果插入子文档的时候没有指定routing是会报错的,这是为了将相关的文档分配到相同的分片,比如后面插入第二个子文档真爱粉的时候也指定相同的路由参数值。
[routing] is missing for join field [relationship]
还有这里的relationship.name是fans,也是在前面mapping里面定义的。
指定parent是1,就确定了父子文档的关系。
最后就是真爱粉了,插入第二个子文档:
PUT person2/_doc/3?routing=tony
{
"name":"爱坤",
"relationship":{
"name":"fans",
"parent":1
}
}
路由参数一样,下面查询:
GET person2/_search
{
"query": {
"parent_id": {
"type": "fans",
"id": 1
}
}
}
可以查到两个子文档,两个粉丝,但是不包括父文档坤坤:
"hits" : [
{
..."_routing" : "tony",
"_source" : {
"name" : "小黑子",
"relationship" : {
"name" : "fans",
"parent" : 1
}
}
},
{
..."_routing" : "tony",
"_source" : {
"name" : "爱坤",
"relationship" : {
"name" : "fans",
"parent" : 1
}
}
}
如果插入第二个子文档的时候指定路由参数是neo,也可以搜索到两个子文档,不影响搜索,但不建议这样做。
PUT person2/_doc/3?routing=neo
还有要注意的是如果查询的时候,指定parent_id.type为star会报错:
GET person2/_search
{
"query": {
"parent_id": {
"type": "star",
"id": 1
}
}
}
报错如下:
[parent_id] no relation found for child [star]
也就是说这里要指定的是子文档的关联类型
elasticsearch中的数据类型:flattened和join的更多相关文章
- ES 15 - Elasticsearch中的数据类型 (text、keyword、date、geo等)
目录 1 核心数据类型 1.1 字符串类型 - string(不再支持) 1.1.1 文本类型 - text 1.1.2 关键字类型 - keyword 1.2 数字类型 - 8种 1.3 日期类型 ...
- 使用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中的数据 ...
- javaScript中的数据类型
一.综述 javaScript中的数据类型分为两类: 简单类型:Boolean,Number,String 引用类型:Object 其他:undefined代表变量没有初始化,null代表引用类型为空 ...
- 批量替换数据库中所有用户数据表中字段数据类型为char和varchar到nvarchar的脚本
解决问题:字段类型为char的总是占用指定字节长度(末尾好多空白符号),varchar数据类型长度一个汉字占2个字节,内容存储为中文的字段个人建议全部使用nvarchar. 操作说明:打开SQL Se ...
- python学习第九讲,python中的数据类型,字符串的使用与介绍
目录 python学习第九讲,python中的数据类型,字符串的使用与介绍 一丶字符串 1.字符串的定义 2.字符串的常见操作 3.字符串操作 len count index操作 4.判断空白字符,判 ...
- 【分布式搜索引擎】Elasticsearch中的基本概念
一.Elasticsearch中的基本概念 以下概念基于这个例子:存储员工数据,每个文档代表一个员工 1)索引(index) 在Elasticsearch中存储数据的行为就叫做索引(indexing ...
- 使用Hive读取ElasticSearch中的数据
本文将介绍如何通过Hive来读取ElasticSearch中的数据,然后我们可以像操作其他正常Hive表一样,使用Hive来直接操作ElasticSearch中的数据,将极大的方便开发人员.本文使用的 ...
- 第三百六十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)scrapy写入数据到elasticsearch中
第三百六十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)scrapy写入数据到elasticsearch中 前面我们讲到的elasticsearch( ...
- elasticsearch中的mapping简介
默认mapping elasticsearch(以下简称ES)是没有模式(schema)的,当我们执行以下命令: curl -d '{"name":"zach" ...
随机推荐
- 2020-11-22:mysql中,什么是filesort?
福哥答案2020-11-22:[答案来自此链接:](http://bbs.xiangxueketang.cn/question/412)如果mysql在排序的时候没有使用到索引那么就会输出 using ...
- 2022-04-09:给你两个长度分别 n 和 m 的整数数组 nums 和 multipliers ,其中 n >= m , 数组下标 从 1 开始 计数。 初始时,你的分数为 0 。 你需要执行恰
2022-04-09:给你两个长度分别 n 和 m 的整数数组 nums 和 multipliers ,其中 n >= m , 数组下标 从 1 开始 计数. 初始时,你的分数为 0 . 你需要 ...
- Pytest - 概述&入门
Pytest - 概述&入门 概述 简介 Pytest是一款强大的python自动化测试工具,可以胜任各种类型或者级别的软件测试工作: pytest提供了丰富的功能,包括assert重写,第三 ...
- 【RocketMQ】NameServer总结
NameServer是一个注册中心,提供服务注册和服务发现的功能.NameServer可以集群部署,集群中每个节点都是对等的关系(没有像ZooKeeper那样在集群中选举出一个Master节点),节点 ...
- 大幅提升前端工作效率!Numeral.js数值格式化库来了!
我们日常开发中,时常会碰到数值格式化操作的场景,今天了不起就为大家分享一款相对比较全面的数值格式化的JS库:Numeral.js Numeral.js Numeral.js 是一个用来对数值进行操作和 ...
- GPT大模型下,如何实现网络自主防御
GPT大模型下,如何实现网络自主防御 本期解读专家 李智华 华为安全AI算法专家 近年来,随着GPT大模型的出现,安全领域的攻防对抗变得更加激烈.RSAC2023人工智能安全议题重点探讨了人工 ...
- “AI Earth”人工智能创新挑战赛:助力精准气象和海洋预测Baseline[1]、NetCDF4使用教学、Xarray 使用教学,针对气象领域.nc文件读取处理
1."AI Earth"人工智能创新挑战赛:助力精准气象和海洋预测Baseline[1].NetCDF4使用教学.Xarray 使用教学,针对气象领域.nc文件读取处理 比赛官网: ...
- DevOps|中式土味OKR与绩效考核落地与实践
昨天一个小伙伴和我讨论了一下OKR和绩效管理,所以这次想简单明了地说下在中国怎么做比较合适,很多高大上的理论无法落地也是空中楼阁. 首先说一些,我个人的理解 道德品质和能力素质决定了一个人的职位行为 ...
- 2 大数据实战系列-spark shell wordcount
1 启动spark shell cd /home/data/app/hadoop/spark-2.1.1-bin-hadoop2.7/bin ./spark-shell --master spark: ...
- Rust 过程宏 proc-macro 是个啥
定义一个 procedural macro 新建一个 lib 类型的 crate: cargo new hello-macro --lib procedural macros 只能在 proc-mac ...