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. Flagger on ASM·基于Mixerless Telemetry实现渐进式灰度发布系列 1 遥测数据

    简介: 服务网格ASM的Mixerless Telemetry技术,为业务容器提供了无侵入式的遥测数据.遥测数据一方面作为监控指标被ARMPS/prometheus采集,用于服务网格可观测性:另一方面 ...

  2. ASP.NET Core 将文件夹内容输出为压缩包文件方法

    本文主要是告诉大家一个省内存的方法,将整个文件夹的内容作为一个压缩包输出,但是实际上没有申请那么多的内存,也不需要升级创建一个压缩包文件.原理是通过逐个读文件然后按照压缩包格式输出 在每个请求的方法可 ...

  3. SpringBoot中几种好用的代码生成器(基于Mybatis-plus生成entity、mapper、xml等)

    前言 熟悉Spring框架的同学一定都知道MVC开发模式吧,控制器(Controller).业务类(Service).持久层(Repository).数据库映射(Mapper).各种DO类构成了我们服 ...

  4. C#开发的CPU使用率小应用 - 开源研究系列文章 - 个人小作品

    这次用C#编写一个CPU使用率的小应用.想了一下,大概需要两个内容:一个是获取CPU使用率:一个是托盘图标的动画效果.这两个内容在上次的博文中有介绍了,此博文为具体的应用的例子. 对于要实现的应用,首 ...

  5. 五:大数据架构回顾-LambdaPlus架构

    Blink是阿里云在 Apache Flink 基础上深度改进的实时计算平台,Blink旨在将流处理和批处理统一,实现了全新的 Flink SQL 技术栈,在功能上,Blink支持现在标准 SQL 几 ...

  6. 02 go-zero入门--微服务demo

    参考文档: https://go-zero.dev/cn/docs/advance/rpc-call 视频地址: https://space.bilibili.com/387126464/channe ...

  7. FTP主动模式和被动模式(2)

    防火墙对FTP的影响 ASPF 多通道协议 应用层程序有些使用的是单通道协议,有些使用的是多通道协议. 单通道协议 例如http协议,整个协议交互过程中,服务端和客户端只建立一个连接,并且服务端固定使 ...

  8. WPF 纯xaml实现控件运动动画

    1.Image控件加载后上下运动 2.Image控件可以放在Grid等布局控件中 3.指定加载时触发动画: EventTrigger RoutedEvent="Image.Loaded&qu ...

  9. C#的关于窗体的类库方案 - 开源研究系列文章

    这次想到了以前编写的关于应用的那个类库,不过当时的只是定义了显示接口,然后调用窗体显示.现在想到要把这个关于窗体的类库进行集合,统一调用,于是就把原来的代码进行了修改完善,终于得到了这次这个例子. 这 ...

  10. 密码学—Kasiski测试法Python程序

    Kasiski Kasiski是辅助破解Vigenere的前提工作,Kasiski是猜测加密者使用Vigenere密码体系的密钥的长度,Kasiski只是猜测长度而已,所以说是辅助破解Vigenere ...