首页 > 其他分享 >elasticsearch中的数据类型:flattened和join

elasticsearch中的数据类型:flattened和join

时间:2023-08-16 11:24:23浏览次数:40  
标签:parent star name relationship 数据类型 detail flattened elasticsearch 文档

flattened:比如你有一个字段的值是一个json,这个json里面又有很多字段,你又不想一个一个的定义这些字段到mapping,就可以用flattened

直接动手:创建索引:

PUT person
{
  "mappings": {
    "properties": {
      "patient_name": {
        "type": "text"
      },
      "detail": {
        "type": "flattened"
      }
    }
  }
}

注意这里detail字段类型为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 [super_star] 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]

也就是说这里要指定的是子文档的关联类型

 

 

   

标签:parent,star,name,relationship,数据类型,detail,flattened,elasticsearch,文档
From: https://www.cnblogs.com/gong2021/p/17633547.html

相关文章

  • Elasticsearch 保姆级入门篇
    Elasticsearch是一个分布式的、面向生产规模工作负载优化的搜索引擎。Kibana可以将Elasticsearch中的数据转化为直观的图表、图形和仪表盘。这篇文章,您将学习本地安装Elasticsearch和Kibana,以及使用开发工具/JavaSDK创建索引和搜索数据。1本地安装1.1创建网络我......
  • linux shell变量和数据类型
    变量是在编程中用于存储和操作数据的容器。在Shell脚本中,变量不需要事先声明数据类型,可以存储不同类型的值。以下是一些常见的变量和数据类型的示例:1.**字符串变量**:字符串是文本数据,在Shell脚本中用双引号或单引号括起来。NAME="Alice"MESSAGE='Hello,World!'2.**整数......
  • JavaSE--基本数据类型的包装类
    一、八种包装类1、为什么需要基本数据类型的包装类  有以下需求:方法参数为Objectobj,但是有需要传进去一个数字或者字符,publicclassIntegerTest01{publicstaticvoidmain(String[]args){//有没有这种需求:调用doSome()方法的时候需要传一个数字进去......
  • Linux的ElasticSearch安装部署
    简介全文搜索属于最常见的需求,开源的Elasticsearch(以下简称es)是目前全文搜索引擎的首选。它可以快速地储存、搜索和分析海量数据。维基百科、StackOverflow、Github都采用它。Elasticsearch简称es,在企业内同样是一款应用非常广泛的搜索引擎服务。很多服务中的搜索功能,都......
  • ElasticSearch置顶方案
    最近系统有个需求,希望工作流的审批人被催办后就要置顶在最前面,工作流列表我是用es的,一开始想用pinned实现,但用pinned的话,每页都会置顶在前面,我的需求只是想让他优先排在前面,翻页后正常显示后面找到这个,通过把匹配到数据的分数提高,然后用sort进行排序,就能实现我的需求了GETwf......
  • 学好Elasticsearch系列-索引的批量操作
    本文已收录至Github,推荐阅读......
  • 学好Elasticsearch系列-脚本查询
    本文已收录至Github,推荐阅读......
  • Elasticsearch在项目中的使用
    一.mysql和es的比较1.mysql适合存储海量的数据,但是某些情况下的查询效率过低。正常可以通过添加索引等加快查询速度,但是模糊查询的时候效率很低,会触发全局扫描SELECT * FROM product WHERE title like '%优惠券%' 2.基于Lucene引擎构建的开源分布式搜索分析引擎,可......
  • Mysql - BIGINT 数据类型
    1、bigint默认是有符号,即取值范围是正负范围比如:bigint(20),就是-1234567890123456789~+12345678901234567892、bigintunsigned无符号,即取值范围就是正值范围比如:bigint(20),就是+12345678901234567890BIGINTUNSIGNED是MySQL中一种无符号的整数数据类型,使用8个字节(64位)......
  • ElasticSearch批量重建索引
    ElasticSearch批量重建索引ver7.16.2ES的设计目标是针对检索的,对修改的支持不够好,特别是对数据结构的修改,和关系数据库不一样,修改数据结构后,索引的历史数据不会改变,如果需要历史数据也应用修改后的结构和设置,需要重建索引(Reindex).重建索引的一般流程为:基......