我需要比较同一文档中的2个字段,实际值并不重要。考虑以下文档:
_source: {
id: 123,
primary_content_type_id: 12,
content: [
{
id: 4,
content_type_id: 1
assigned: true
},
{
id: 5,
content_type_id: 12,
assigned: false
}
]
}
我需要找到所有未分配主要内容的文档。 我无法找到一种方法来比较primary_content_type_id和嵌套的content.content_type_id以确保它们具有相同的值。 这是我使用脚本尝试过的方法。 我不认为我理解脚本,但这可能是解决此问题的一种方法:
{
"filter": {
"nested": {
"path": "content",
"filter": {
"bool": {
"must": [
{
"term": {
"content.assigned": false
}
},
{
"script": {
"script": "primary_content_type_id==content.content_type_id"
}
}
]
}
}
}
}
}
请注意,如果我删除过滤器部分并将其替换为另一个术语过滤器,则正常工作。其中
content_type_id = 12
,并且添加另一个过滤器,其中primary_content_id = 12
。问题是我不知道(对我的用例也没有影响)primary_content_type_id
或content.content_type_id
的值是什么,只有在content_type_id
与primary_content_type_id
匹配的内容中分配了假内容才很重要。Elasticsearch是否支持此检查?
it
是 GroovyClosure
的隐含第一个参数。因此,在通过find
循环遍历content
对象(在本例中)时,it
是实际的元素。 - pickypgit
是一种类似对象的东西,我可以在其上调用参数。顺便说一下,我有点困扰于这个问题https://dev59.com/IZLea4cB1Zd3GeqP1Fp8,你有什么指导吗? - brupmit
是传递到函数中的字段。想象一下Closure
(大括号内的所有内容)是 for 循环的一部分。它将是for (int i = 0; i < _source.content.size(); ++i) { def it = _source.content[i]; callClosure(it); }
。这就是实际发生的事情。现在,显然它必须与响应等一起工作,但这是特定于函数(find
)的。 - pickypg