gpt4 book ai didi

elasticsearch - ES查询以匹配数组中的所有元素

转载 作者:行者123 更新时间:2023-12-03 02:13:20 24 4
gpt4 key购买 nike

所以我拿到了这份文件
我想用此查询过滤的嵌套数组。
我希望ES退回所有项目的所有文档,其中所有项目的更改都为0,仅此而已。
如果文档甚至在列表中只有一个更改= 1的项目,则将其丢弃。
从已经编写的查询开始,有什么方法可以实现?还是应该改用脚本?
文件:

{
"id": "abc",
"_source" : {
"trips" : [
{
"type" : "home",
"changes" : 0
},
{
"type" : "home",
"changes" : 1
}
]
}
},
{
"id": "def",
"_source" : {
"trips" : [
{
"type" : "home",
"changes" : 0
},
{
"type" : "home",
"changes" : 0
}
]
}
}
查询:
GET trips_solutions/_search

{
"query": {
"bool": {
"must": [
{
"term": {
"id": {
"value": "abc"
}
}
},
{
"nested": {
"path": "trips",
"query": {
"range": {
"trips.changes": {
"gt": -1,
"lt": 1
}
}
}
}
}
]
}
}
}
预期结果:
{
"id": "def",
"_source" : {
"trips" : [
{
"type" : "home",
"changes" : 0
},
{
"type" : "home",
"changes" : 0
}
]
}
}
Elasticsearch版本:7.6.2
已经阅读了此答案,但他们并没有帮助我:
https://discuss.elastic.co/t/how-to-match-all-item-in-nested-array/163873
ElasticSearch: How to query exact nested array

最佳答案

首先,如果您通过id: abc进行过滤,显然您将无法取回id: def
其次,由于nested字段的性质被视为单独的子文档,因此您无法查询trips等于0的所有changes-各个行程之间的连接丢失并且它们“彼此不知道” 。
您可以做的就是使用inner_hits仅返回与嵌套查询匹配的行程:

GET trips_solutions/_search
{
"_source": "false",
"query": {
"bool": {
"must": [
{
"nested": {
"inner_hits": {},
"path": "trips",
"query": {
"term": {
"trips.changes": {
"value": 0
}
}
}
}
}
]
}
}
}
然后,最简单的解决方案是将该嵌套信息动态保存在父对象 like discussed here上,并在结果数组上使用范围/项查询。

编辑:
在文档的顶层使用 copy_to 的方法如下:
PUT trips_solutions
{
"mappings": {
"properties": {
"trips_changes": {
"type": "integer"
},
"trips": {
"type": "nested",
"properties": {
"changes": {
"type": "integer",
"copy_to": "trips_changes"
}
}
}
}
}
}
trips_changes将是一个数字数组-我假设它们是整数,但是 more types are available
然后同步一些文档:
POST trips_solutions/_doc
{"trips":[{"type":"home","changes":0},{"type":"home","changes":1}]}

POST trips_solutions/_doc
{"trips":[{"type":"home","changes":0},{"type":"home","changes":0}]}
最后查询:
GET trips_solutions/_search
{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "trips",
"query": {
"term": {
"trips.changes": {
"value": 0
}
}
}
}
},
{
"script": {
"script": {
"source": "doc.trips_changes.stream().filter(val -> val != 0).count() == 0"
}
}
}
]
}
}
}
请注意,我们通常首先使用嵌套的词查询进行过滤以缩小搜索范围(脚本很慢,因此很有用)。然后,我们检查累积的顶级更改中是否有任何非零的 changes并拒绝那些适用的更改。

关于elasticsearch - ES查询以匹配数组中的所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64120458/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com