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的更多相关文章

  1. ES 15 - Elasticsearch中的数据类型 (text、keyword、date、geo等)

    目录 1 核心数据类型 1.1 字符串类型 - string(不再支持) 1.1.1 文本类型 - text 1.1.2 关键字类型 - keyword 1.2 数字类型 - 8种 1.3 日期类型 ...

  2. 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据操作(二)

    CSSDesk body { background-color: #2574b0; } /*! zybuluo */ article,aside,details,figcaption,figure,f ...

  3. 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据操作

    http://www.cnblogs.com/wgp13x/p/4934521.html 内容一样,样式好的版本. 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据 ...

  4. javaScript中的数据类型

    一.综述 javaScript中的数据类型分为两类: 简单类型:Boolean,Number,String 引用类型:Object 其他:undefined代表变量没有初始化,null代表引用类型为空 ...

  5. 批量替换数据库中所有用户数据表中字段数据类型为char和varchar到nvarchar的脚本

    解决问题:字段类型为char的总是占用指定字节长度(末尾好多空白符号),varchar数据类型长度一个汉字占2个字节,内容存储为中文的字段个人建议全部使用nvarchar. 操作说明:打开SQL Se ...

  6. python学习第九讲,python中的数据类型,字符串的使用与介绍

    目录 python学习第九讲,python中的数据类型,字符串的使用与介绍 一丶字符串 1.字符串的定义 2.字符串的常见操作 3.字符串操作 len count index操作 4.判断空白字符,判 ...

  7. 【分布式搜索引擎】Elasticsearch中的基本概念

    一.Elasticsearch中的基本概念 以下概念基于这个例子:存储员工数据,每个文档代表一个员工 1)索引(index)  在Elasticsearch中存储数据的行为就叫做索引(indexing ...

  8. 使用Hive读取ElasticSearch中的数据

    本文将介绍如何通过Hive来读取ElasticSearch中的数据,然后我们可以像操作其他正常Hive表一样,使用Hive来直接操作ElasticSearch中的数据,将极大的方便开发人员.本文使用的 ...

  9. 第三百六十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)scrapy写入数据到elasticsearch中

    第三百六十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)scrapy写入数据到elasticsearch中 前面我们讲到的elasticsearch( ...

  10. elasticsearch中的mapping简介

    默认mapping elasticsearch(以下简称ES)是没有模式(schema)的,当我们执行以下命令: curl -d '{"name":"zach" ...

随机推荐

  1. 2020-09-07:Docker的四种网络类型?

    福哥答案2020-09-07: 敲docker network ps命令,显示三种模式.1.bridge模式:使用–net =bridge指定,默认设置.桥接式网络模式(默认).容器的默认网络模式,d ...

  2. 2021-06-23:给定一个数组arr,代表每个人的能力值。再给定一个非负数k,如果两个人能力差值正好为k,那么可以凑在一起比赛。一局比赛只有两个人,返回最多可以同时有多少场比赛。

    2021-06-23:给定一个数组arr,代表每个人的能力值.再给定一个非负数k,如果两个人能力差值正好为k,那么可以凑在一起比赛.一局比赛只有两个人,返回最多可以同时有多少场比赛. 福大大 答案20 ...

  3. 2021-08-22:定义什么是可整合数组:一个数组排完序之后,除了最左侧的数外,有arr[i] = arr[i-1]+1,则称这个数组为可整合数组,比如{5,1,2,4,3}、{6,2,3,1,5,

    2021-08-22:定义什么是可整合数组:一个数组排完序之后,除了最左侧的数外,有arr[i] = arr[i-1]+1,则称这个数组为可整合数组,比如{5,1,2,4,3}.{6,2,3,1,5, ...

  4. vue核心

    VUE简介 vue--一套用于构建用户界面的渐进式JavaScript框架 vue特点 采用组件化模式--提高代码复用率--让代码更好维护 声明式编程--让编码人员无需直接操作DOM--提高开发效率 ...

  5. var,let,const的区别

    JS中变量的定义方式有四种 不写var,let,const--直接定义变量 a = 10; 使用var关键字定义 var a = 10; 使用let关键字定义 let a = 10; 使用const关 ...

  6. 【GiraKoo】Android Studio控制台乱码

    [GiraKoo]Android Studio控制台乱码 启动Android Studio进行编译时,可能会遇到控制台出现异常的乱码. 本文介绍该情况的解决方案. ����: δ������쳣���� ...

  7. 【实践篇】教你玩转JWT认证---从一个优惠券聊起

    引言 最近面试过程中,无意中跟候选人聊到了JWT相关的东西,也就联想到我自己关于JWT落地过的那些项目. 关于JWT,可以说是分布式系统下的一个利器,我在我的很多项目实践中,认证系统的第一选择都是JW ...

  8. airasia Superapp × HMS Core:便捷出行,悦享全程

    2023年5月9日-5月11日,HUAWEI P60系列及旗舰产品发布会在欧洲德国.中东非阿联酋.亚太马来西亚.拉美墨西哥陆续举办,为消费者带来高端影像旗舰HUAWEI P60 Pro及系列全场景智能 ...

  9. 聊聊Mybatis的实现原理

    使用示例 平时我们使用的一般是集成了Spring或是Spring Boot的Mybatis,封装了一层,看源码不直接:如下,看看原生的Mybatis使用示例 示例解析 通过代码可以清晰地看出,MyBa ...

  10. 最详细的Git命令大全

    Git常用命令及方法大全 下面是我整理的常用 Git 命令清单.几个专用名词的译名如下. Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) R ...