Elastic search中使用nested类型的内嵌对象

假设Elastic search中一个index存储了系统中的文章及其赞赏记录,赞赏记录中包括赞赏者姓名和赞赏金额,这种情况下需要在elastic search中使用nested类型的内嵌对象.因为如果使用数组或者object对象的话,赞赏者姓名和赞赏金额不能被正确的关联.

1 建立index语句如下

PUT articles
{
  "mappings": {
    "doc": {
      "properties": {
        "payment": {
          "type": "nested",
          "properties": {
            "amount": {
              "type": "integer"
            },
            "name": {
              "type": "keyword"
            }
          }
        }
      }
    }
  }
}

这样articles就有了payment这个nested类型的字段,payment里面的对象有amount和name,表示金额和姓名

2 产生如下数据,表示jack给文章1赞赏了29元,ross给文章1赞赏30元,ross给文章2赞赏31元

POST articles/doc/1
{
  "payment": [
    {
      "name": "jack",
      "amount": 29
    },
    {
      "name": "ross",
      "amount": 30
    }
  ]
}

POST articles/doc/2
{
  "payment": [
    {
      "name": "ross",
      "amount": 31
    }
  ]
}

3 现在想查询ross赞赏过的文章,需要使用nested query

GET articles/_search
{
  "query": {
    "nested": {
      "path": "payment",
      "query": {
        "term": {
          "payment.name": {
            "value": "ross"
          }
        }
      }
    }
  }
}

path表示了nested字段的名称,需要注意的是,查询语句中要指定查询字段的全名,所以赞赏者姓名要用"payment.name" 如果在多个index上进行nested查询,没有nested字段的index会报错,这时可以将ignore_unmapped设置为true

4 如果想查看赞赏的平均金额,需要用nested aggregation

GET articles/_search
{
  "size": 0, 
  "aggs": {
    "nested": {
      "nested": {
        "path": "payment"
      },
      "aggs": {
        "amount_avg": {
          "avg": {
            "field": "payment.amount"
          }
        }
      }
    }
  }
}

同样注意要用path指定字段名称,返回的数据中,比普通的聚合查询多了一层嵌套 返回结果为

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "nested": {
      "doc_count": 3,
      "amount_avg": {
        "value": 30
      }
    }
  }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT杂记

关于MySQL DNS解析探究之二:unauthenticated user

把这篇没写完的文章写完,2015年的事就不留到2016了 开启DNS解析 mysql> show variables like 'skip_name_resol...

29780
来自专栏张善友的专栏

Silverlight 2 Beta 2的Isolated Storage

Silverlight beta 2 的配置有一个重大变化就是对DRM 和Application Storage的配置 ? Application stora...

212100
来自专栏Java帮帮-微信公众号-技术文章全总结

第三十天-加强2-多表查询&JDBC&连接池&DBUtils&综合案例【悟空教程】

第三十天-加强2-多表查询&JDBC&连接池&DBUtils&综合案例【悟空教程】

17540
来自专栏杨建荣的学习笔记

MySQL中的大小写敏感

今天同事问了一个问题,是关于MySQL大小写敏感的。 如果根据关键字case来搜索,会发现有两个参数。 mysql> show variables like ...

41560
来自专栏Java学习网

Android数据存储实现的5大方式

Android数据存储实现的5大方式 数据存储在开发中是使用最频繁的,在这里主要介绍Android平台中实现数据存储的5种方式,更加系统详细的介绍了5种存储的...

69890
来自专栏逸鹏说道

SQL Server 存储过程的几种常见写法分析

最近发现还有不少做开发的小伙伴,在写存储过程的时候,在参考已有的不同的写法时,往往很迷茫, 不知道各种写法孰优孰劣,该选用那种写法,以及各种写法优缺点,本文以一...

43280
来自专栏后台架构

Sphinx源码学习笔记(一):索引创建

  因为项目开发需要在游戏内部实现玩家名称的模糊查找功能,本身直接使用Sphinx配置mysql可以直接搭建一套模糊匹配的即可支持功能的实现。

52070
来自专栏木头编程 - moTzxx

PHP DB 数据库连接类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

15810
来自专栏编程心路

HBase学习

操作 HBase 所用的 jar 包,使用 Maven 导入,引入依赖 hbase-it,pom.xml 文件依赖部分如下:

29640
来自专栏xingoo, 一个梦想做发明家的程序员

Hbase多版本的读写(Shell&Java API版)

Hbase是基于HDFS的NOsql数据库,它很多地方跟数据库差不多,也有很多不同的地方。这里就不一一列举了,不过Hbase有个版本控制的特性,这个特性在很多...

44690

扫码关注云+社区

领取腾讯云代金券