首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Elasticsearch之Nested Query nestedQuery查询数组

Elasticsearch之Nested Query nestedQuery查询数组

作者头像
oktokeep
发布2024-10-09 10:53:54
发布2024-10-09 10:53:54
23200
代码可运行
举报
文章被收录于专栏:第三方工具第三方工具
运行总次数:0
代码可运行

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

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

1.order_info_v1/_mapping GET

代码语言:javascript
代码运行次数:0
运行
复制
"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格式  

代码语言:javascript
代码运行次数:0
运行
复制
"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验证

代码语言:javascript
代码运行次数:0
运行
复制
{
  "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代码

代码语言:javascript
代码运行次数:0
运行
复制
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));
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-06-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档