ElasticSearch join连接查询「建议收藏」

ElasticSearch join连接查询「建议收藏」ElasticSearchjoin连接查询特别说明:文章所有内容基于ElasticSerch5.5.3版本ElasticSerch的连接查询有两种方式实现nestedparent和child关联查询nested存储结构nested的方式和其他字段一样,在同一个type里面存储,以数组的方式存储在type里,格式如下:PUTindex…

大家好,又见面了,我是你们的朋友全栈君。

ElasticSearch join连接查询

特别说明:文章所有内容基于ElasticSerch 5.5.3版本

ElasticSerch 的连接查询有两种方式实现

  • nested
  • parent和child关联查询

nested

  • 存储结构
    nested的方式和其他字段一样,在同一个type里面存储,以数组的方式存储在
    type里,格式如下:
PUT index_test/type_info/1000
{ 
   
  "userId": 1000,
  "mobile": "13301020202",
  "nick": "梅西",
  "vipType": 1,
  "vipPoints": 1200,
  "regTime": "2018-06-18 12:00:31",
  "order": [
    { 
   
      "status": 1,
      "payMethod": 2,
      "amount": 100,
      "productCount": 3
    },
    { 
   
      "status": 2,
      "payMethod": 2,
      "amount": 230,
      "productCount": 1
    }
  ]
}

order 则为 nested

  • API查询方式
    直接用.连接对象的属性,如要要查找订单中状态=2的用户,直接使用order.status
GET index_test/type_info/_search
{ 
   
  "query": { 
   
    "term": { 
   
      "order.status": 2
    }
  }
}

parent / child 关联的方式

  • 存储结构
    parent / child 的存储结果跟nested不一样,是存储在不同的type里,通过parent来关联父子type关系
PUT index_test
{ 
   
 "mappings": { 
   
   "type_info": { 
   
     "properties": { 
   
       "userId": { 
   
         "type": "integer"
       },
       "mobile": { 
   
         "type": "keyword"
       },
       "nick": { 
   
         "type": "keyword"
       },
       "vipType": { 
   
         "type": "integer"
       },
       "vipPoints": { 
   
         "type": "integer"
       },
       "regTime": { 
   
         "type": "date",
         "format": "yyyy-MM-dd HH:mm:ss"
       }
     }
   },
   "type_order": { 
   
     "_parent": { 
   
       "type": "type_info"
     },
     "properties": { 
   
       "amount": { 
   
         "type": "scaled_float",
         "scaling_factor": 100
       },
       "payMethod": { 
   
         "type": "integer"
       },
       "status": { 
   
         "type": "integer"
       },
       "productCount": { 
   
         "type": "integer"
       }
     }
   }
 }
}

通过 _parent 来指定父type

  • 造点数据
    添加几条用户数据,和普通的type一样,没有任何区别
PUT index_test/type_info/1000
{ 
   
 "userId": 1000,
 "mobile": "13301020202",
 "nick": "梅西",
 "vipType": 1,
 "vipPoints": 1200,
 "regTime": "2018-06-18 12:00:31"
}
PUT index_test/type_info/1001
{ 
   
 "userId": 1001,
 "mobile": "151232223",
 "nick": "C罗",
 "vipType": 1,
 "vipPoints": 300,
 "regTime": "2018-05-18 12:00:00"
}
PUT index_test/type_info/1002
{ 
   
 "userId": 1002,
 "mobile": "181829282",
 "nick": "内马尔",
 "vipType": 2,
 "vipPoints": 1300,
 "regTime": "2018-09-09 12:00:00"
}

添加几条订单数据,通过parent来指定type_info

PUT index_test/type_order/100?parent=1000
{ 
   
"userId": 1000,
"amount": 300,
"payMethod": 2,
"status": 3,
"productCount": 2
}
```javascript

PUT index_test/type_order/101?parent=1000
{

“userId”: 1000,
“amount”: 250,
“payMethod”: 1,
“status”: 2,
“productCount”: 1
}

  ```javascript
PUT index_test/type_order/102?parent=1001
{
"userId": 1001,
"amount": 56,
"payMethod": 1,
"status": 2,
"productCount": 1
}
```javascript

PUT index_test/type_order/103?parent=1002
{

“userId”: 1002,
“amount”: 78,
“payMethod”: 2,
“status”: 1,
“productCount”: 2
}

- API查询方式
- 通过子type查询父type,返回父type信息
查询下单金额大于60的用户,通过 `has_child` 查询,返回用户信息

GET index_test/type_info/_search
{

“query”: {

“has_child”: {

“type”: “type_order”,
“query”: {

“range”: {

“amount”: {

“gte”: 60
}
}
}
}
}
}

 - 通过父type查子type,返回子type信息
查询vip等级为1的用户下的订单,通过 `has_parent` 查询,返回订单信息
```javascript
GET index_test/type_order/_search
{
 "query": {
   "has_parent": {
     "parent_type": "type_info",
     "query": {
       "term": {
         "vipType": {
           "value": 1
         }
       }
     }
   }
 }
}

nested 和 parent-child的区别以及使用场景

  • 主要区别:
    由于存储结构的不同,nested和parent-child的方式有不同的应用场景
    nested 所有实体存储在同一个文档,parent-child模式,子type和父type存储在不同的文档里。
    所以查询效率上nested要高于parent-child,但是更新的时候nested模式下,es会删除整个文档再创建,而parent-child只会删除你更新的文档在重新创建,不影响其他文档。所以更新效率上parent-child要高于nested。

  • 使用场景:
    nested:在少量子文档,并且不会经常改变的情况下使用。
    比如:订单里面的产品,一个订单不可能会有成千上万个不同的产品,一般不会很多,并且一旦下单后,下单的产品是不可更新的。
    parent-child:在大量文档,并且会经常发生改变的情况下使用。
    比如:用户的浏览记录,浏览记录会很大,并且会频繁更新

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149068.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C语言中的sizeof()和strlen()的区别[通俗易懂]

    C语言中的sizeof()和strlen()的区别sizeof()和strlen()经常会被初学者混淆,但其中有有很大区别:1.sizeof()【操作数所占空间的字节数大小】是一种c中的基本运算符。可以以类型、指针、数组和函数等作为参数。头文件类型为unsignedint。运算值在编译的时候就出结果,所以可以用来定义数组维数。chara[5]=”123″;intb=sizeof(a);//b=5intc=strlen(a);//c=3sizeof()是一种单目操作符,是用来计算你

    2022年4月8日
    29
  • Java线程池设置名称,看完必会

    点击上方☝,轻松关注!及时获取有趣有料的技术文章本文讲一下Java线程池中创建 ThreadFactory 设置线程名称的三种方式。设置线程名称是很重要的,如果你没有设置过,说明你还“涩…

    2022年2月28日
    140
  • java环境变量 的配置与详解(全网最详细教程)

    java环境变量 的配置与详解(全网最详细教程)笔者这学期开始学习java课程,学习java开发首先需要配置java运行环境变量。虽然上课老师也讲了如何配置java环境变量,可是笔者的同学还是有好多都不会配置,所以笔者最近配置了特别多次java环境变量。如下笔者详细解释从JDK安装到环境变量的装配。目录 JDK的下载与安装 配置java环境变量JAVA_HOME变量Path变量ClassPath变量classpath…

    2022年4月30日
    38
  • Laravel 之搜索引擎elasticsearch扩展Scout

    Laravel 之搜索引擎elasticsearch扩展Scout

    2021年10月24日
    65
  • 广东移动DNS收集[通俗易懂]

    广东移动DNS收集[通俗易懂]有些网站的CDN有问题,使用第三方DNS会有访问不了的情况。多数是因为CDN通过DNS请求来源解析出对应线路的服务器IP,但使用第三方DNS时会出现把移动来源解析为电信来源,而服务器电信线路IP又拒绝非电信来源IP访问时,就会出现无法访问网站的情况。所以,使用移动网络的时候,还是尽量使用移动自己的DNS吧!这里收集了一下广东移动的DNS,非移动用户估计用不了。ns3.gd.

    2022年7月11日
    70
  • java静态代理实现_静态注册和动态注册的优缺点

    java静态代理实现_静态注册和动态注册的优缺点思考:以常见的增删改查为例,在执行增删改的时候我们需要开启事务,执行完成后需要提交事务假如说你Service里有100个增删改的方法,那这100个方法里除了你自己真正需要处理的业务逻辑外,每个方法都还需要去关注开启事务,提交事务这些动作。那有没有稍微好点的办法解决呢?于是就出现了代理模式的概念,那什么是代理模式呢?1、什么是代理模式简单来说:代理就是对目标方法进行增强。什么意思呢?…

    2022年10月17日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号