es是通过符合条件的json记录找出来,本身并不是将数据中的记录filter过滤。es nestedQuery不是过滤的结果,是匹配的这条es记录,所以数组中的其他的记录也会查询出来
1.方法1:可以在程序中对数组中的记录过滤。
2.方法2:在数据初始化的时候,将数据严格查询符合条件的才初始化。

需求背景:收益的记录,根据订单号和会员号来初始化,理论上而不是仅仅根据订单号来查询收益列表,有一种情况是一个订单号存在多个不同的会员号的收益。

1.order_info_v1/_mapping GET

"settleIncomeExamineList": {
"type": "nested",
"properties": {
"amt": {
"type": "long"
},
"detail": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"id": {
"type": "long"
},
"memNo": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"opName": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"orderNo": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"remark": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"status": {
"type": "long"
},
"time": {
"type": "date"
},
"type": {
"type": "long"
}
}
},

2.data格式

"settleIncomeExamineList": [{
"orderNo": "997393306032abc",
"memNo": "159057421",
"amt": -169,
"remark": "违约金罚金",
"id": 1194,
"detail": "违约金罚金",
"type": 1,
"status": 1
},
{
"orderNo": "997393306032abc",
"memNo": "690182074",
"amt": 352,
"remark": "结算收益",
"id": 1195,
"detail": "结算收益",
"type": 1,
"status": 1
}
],

3. rest api验证

{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "settleIncomeExamineList",
"score_mode":"max",
"query": {
"bool": {
"must": [
{
"term": {
"settleIncomeExamineList.memNo": "159057421"
}
},
{
"term": {
"settleIncomeExamineList.orderNo": "997393306032abc"
}
}
]
}
}
}
}
]
}}} {
"query": {
"bool": {
"must": [
{
"nested": {
"path": "settleIncomeExamineList",
"score_mode":"max",
"query": {
"bool": {
"must": [
{
"term": {
"settleIncomeExamineList.memNo": "690182074"
}
},
{
"term": {
"settleIncomeExamineList.orderNo": "997393306032abc"
}
}
]
}
}
}
}
]
}}} 反例:随便更改会员号,则搜索不出来。
{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "settleIncomeExamineList",
"score_mode":"max",
"query": {
"bool": {
"must": [
{
"term": {
"settleIncomeExamineList.memNo": "111222333"
}
},
{
"term": {
"settleIncomeExamineList.orderNo": "997393306032abc"
}
}
]
}
}
}
}
]
}}}

4.Java代码

boolQueryBuilder.must(QueryBuilders.nestedQuery("settleIncomeExamineList", QueryBuilders.termQuery("settleIncomeExamineList.orderNo.keyword", reqVO.getOrderNo()), ScoreMode.None));
boolQueryBuilder.must(QueryBuilders.nestedQuery("settleIncomeExamineList", QueryBuilders.termQuery("settleIncomeExamineList.type", 3), ScoreMode.None));
boolQueryBuilder.must(QueryBuilders.nestedQuery("settleIncomeExamineList",QueryBuilders.existsQuery("settleIncomeExamineList"), ScoreMode.None)); int[] statusArray = reqVO.getStatusList().stream().mapToInt(Integer::intValue).toArray();
boolQueryBuilder.must(QueryBuilders.nestedQuery("settleIncomeExamineList", QueryBuilders.termsQuery("settleIncomeExamineList.status", statusArray),ScoreMode.None));

Elasticsearch之Nested Query nestedQuery查询数组的更多相关文章

  1. Elasticsearch Query DSL查询入门

    本篇为学习DSL时做的笔记,适合ES新手,大佬请略过~ Query DSL又叫查询表达式,是一种非常灵活又富有表现力的查询语言,采用JSON接口的方式实现丰富的查询,并使你的查询语句更灵活.更精确.更 ...

  2. Elasticsearch Span Query跨度查询

    ES基于Lucene开发,因此也继承了Lucene的一些多样化的查询,比如本篇说的Span Query跨度查询,就是基于Lucene中的SpanTermQuery以及其他的Query封装出的DSL,接 ...

  3. [ElasticSearch]Java API 之 词条查询(Term Level Query)

    1. 词条查询(Term Query)  词条查询是ElasticSearch的一个简单查询.它仅匹配在给定字段中含有该词条的文档,而且是确切的.未经分析的词条.term 查询 会查找我们设定的准确值 ...

  4. 使用ElasticSearch完成百万级数据查询附近的人功能

    上一篇文章介绍了ElasticSearch使用Repository和ElasticSearchTemplate完成构建复杂查询条件,简单介绍了ElasticSearch使用地理位置的功能. 这一篇我们 ...

  5. NHibernate系列文章二十五:NHibernate查询之Query Over查询(附程序下载)

    摘要 这一篇文章介绍在NHibernate 3.2里引入的Query Over查询,Query Over查询跟Criteria查询类似.首先创建IQueryOver对象,然后通过调用该对象的API函数 ...

  6. Elasticsearch DSL中Query与Filter的不同

    Elasticsearch支持很多查询方式,其中一种就是DSL,它是把请求写在JSON里面,然后进行相关的查询. 举个DSL例子 GET _search { "query": { ...

  7. ElasticSearch 学习记录之ES查询添加排序字段和使用missing或existing字段查询

    ES添加排序 在默认的情况下,ES 是根据文档的得分score来进行文档额排序的.但是自己可以根据自己的针对一些字段进行排序.就像下面的查询脚本一样.下面的这个查询是根据productid这个值进行排 ...

  8. Lucene 06 - 使用Lucene的Query API查询数据

    目录 1 Query对象的创建(方式一): 使用子类对象 1.1 常用的Query子类对象 1.2 常用的Query子类对象使用 1.2.1 使用TermQuery 1.2.2 使用NumericRa ...

  9. 第三百六十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的bool组合查询

    第三百六十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的bool组合查询 bool查询说明 filter:[],字段的过滤,不参与打分must:[] ...

  10. Elasticsearch入门CRUD(新增、查询、修改、删除)

    1. 项目中引用 Elasticsearch.NET         Elasticsearch 其他版本可在: http://www.nuget.org/  找到对应的项目以源码 ! 本文以 2.4 ...

随机推荐

  1. AI圈内卷?天池团聚请来专家集体“问诊”

    ​简介: 近期杭州云栖大会上出现了一个"数据博物馆",最吸引眼球的"展品",竟是行业大规模开源数据集.不仅数量多达上百个,还覆盖零售.文娱.工业.医疗.自然科学 ...

  2. 顺丰科技 Hudi on Flink 实时数仓实践

    ​简介: 介绍了顺丰科技数仓的架构,趟过的一些问题.使用 Hudi 来优化整个 job 状态的实践细节,以及未来的一些规划. 本文作者为刘杰,介绍了顺丰科技数仓的架构,趟过的一些问题.使用 Hudi ...

  3. Flink Forward #Asia2020 流批一体及数仓资料整理

    阿里云实时计算负责人 - 王峰(莫问)/ FFA_2020-Flink as a Unified Engine - Now and Next-V4 2020年Flink 基于Flink 的流批一体数仓 ...

  4. 圈子社交系统--在线了解前后端,APP小程序H5,三端源码交付-多重玩法,新奇有趣。

    圈子论坛社区系统,含完整的后台PHP系统.功能:小程序授权登陆,H5和APP,手机号登陆,发帖,建圈子.发活动.圈主可置顶推荐帖子,关注.点赞.评论.交流等.可作为圈子贴吧等自媒体. 一款全开源支持免 ...

  5. DNS(4) -- dns功能实现-配置正向解析和反向解析以及DNS递归查询示例

    目录 1 DNS配置示例 1.1 DNS解析类型 1.2 配置正向解析 1.3 配置反向解析 1.4 DNS递归查询 1.4.1 开启递归查询 1.4.2 关闭递归查询 1 DNS配置示例 1.1 D ...

  6. cesium教程3-加载3dtile模型,并调整位置

    直接上示例代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  7. Lua热更学习--使用toLua中的协程

    [6] C#访问调table类中的成员变量和函数 访问table中的变量和函数 lua中可以使用table作为class,因此对table中的函数访问调用是必要的根据前面对table访问和functi ...

  8. 80x86汇编—分支循环程序设计

    文章目录 查表法: 实现16进制数转ASCII码显示 计算AX的绝对值 判断有无实根 地址表形成多分支 从100,99,...,2,1倒序累加 输入一个字符,然后输出它的二进制数 大小写转换 大写转小 ...

  9. USRP B210 软件定义的无线网络(SDR)支撑设备

    目录 文章目录 目录 蜂窝网络 蜂窝网络的组成 USRP B210 USRP B210 的功能清单与相关参数 USRP B210 的系统结构与运行原理 相关知识储备 SDR RFIC RF 发展历程 ...

  10. 记录freeswitch的一个2833问题

    概述 freeswitch是一款简单好用的VOIP开源软交换平台. 运营商内部新老系统混用,互联互通的问题较多,其中以DTMF码的问题最多,花样也多. 环境 CentOS 7.9 freeswitch ...