【发布时间】:2015-12-13 01:29:10
【问题描述】:
TL;DR - 如何检查 one-of 和 all-of 是否为嵌套数组满足指定条件?
我有一个document。每个document 都有一个嵌套的outer 对象数组,这些对象本身有一个嵌套的inner 对象列表。我需要对至少一个文档的outer 嵌套对象匹配的所有文档执行过滤器。当我说匹配时,我的意思是 all outer 嵌套对象的 inner 对象以某种方式匹配。这是一个供参考的示例映射;
{ "document" : {
"properties" : {
"name" : {
"type" : "string"
},
"outer" : {
"type" : "nested",
"properties" : {
"inner" : {
"type" : "nested",
"properties" : {
"match" : {
"type" : "string",
"index" : "not_analyzed"
},
"type" : {
"type" : "string",
"index" : "not_analyzed"
}
}}}}}}
}
如果文档没有 outer/inner 对象,则认为它匹配。但更糟糕的是,内部对象需要考虑以一种条件逻辑方式根据type 进行不同的匹配(例如SQL 中的CASE)。例如,如果type 是术语"Country",那么如果match 是指定的国家/地区代码(例如ES),则inner 对象将被视为匹配。一个文档可能有 inner 不同的 type 对象,并且不保证会存在特定类型。
来自命令式 (Java) 编程背景,我在弄清楚如何实现这种过滤时遇到了难以置信的麻烦。我能想到的任何东西都无法与这种行为相匹配。到目前为止,我所拥有的只是过滤后的查询;
"filtered" : {
"query" : {
"match_all" : { }
},
"filter" : {
"bool" : {
"should" : {
"missing" : {
"field" : "outer.inner.type"
}
}}}}
}
所以,问题是……
如何根据inner 的type 匹配具有所有 inner 对象的至少一个 outer 对象的文档对象?
根据要求提供更多详细信息 -
示例文档 JSON
{
"name":"First",
"outer":[
{
"inner":[
{"match":"ES","type":"Country"},
{"match":"Elite","type":"Market"}
]
},{
"inner":[
{"match":"GBR","type":"Country"},
{"match":"1st Class","type":"Market"},
{"match":"Admin","type":"Role"}
]
}
],
"lockVersion":0,"sourceId":"1"
}
如果我们要提供"1st Class" 市场和国家"GRB",上述示例应该通过过滤器,因为两个outer 对象中的第二个将被视为匹配,因为两者inner 对象匹配。但是,如果我们提供国家/地区"GRB" 和市场"Elite",那么我们将不会返回此文档,因为outer 对象都不会打扰它们的inner 对象完全匹配。如果我们希望第二个outer 对象匹配,那么所有三个inner 都需要匹配。请注意,第三个inner 中有一个额外的type。这会导致 if 一个类型存在 then 它需要匹配它 else 它不需要匹配,因为它缺席。
【问题讨论】:
-
您能否发布一些示例数据,可能是要点或其他内容?它需要包含足够的多样性来涵盖您的各种情况。我想我可能知道如何解决这个问题,但我不想整个上午都在构建虚拟数据来测试它。
-
@SloanAhrens - 我已经发布了一个包含一些详细信息的示例文档,如果这还不够,请告诉我,我会收集更多示例。我实际上并没有在上面的问题中使用生产数据/映射,所以我必须手动转换数据以匹配问题。
-
不,我认为是这样做的。
标签: arrays elasticsearch nested