TL; DR. Как проверить, соответствуют ли одному из и всем вложенным массивом определенные критерии?
У меня есть document
. Каждый document
имеет массив вложенных outer
объектов, которые сами имеют список вложенных объектов inner
. Мне нужно выполнить фильтр для всех документов, где соответствует хотя бы один из документов outer
вложенных объектов. Когда я говорю совпадение, я имею в виду, что все объекты <вложенные объекты outer
outer
совпадают. Вот пример отображения для ссылки;
{ "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
в виде условной логики (например, CASE
в SQL). Например, если type
был термином "Country"
, то объект inner
считался бы соответствующим, если match
был указанным кодом страны, например ES
. Документ может иметь inner
объекты переменной type
, и нет гарантии, что будут существовать определенные типы.
Исходя из императивного (Java) программирования, у меня возникают невероятные проблемы с тем, как реализовать такую фильтрацию. Ничто, о котором я не могу думать, даже смутно соответствует этому поведению. До сих пор все, что у меня есть, - это отфильтрованный запрос;
"filtered" : {
"query" : {
"match_all" : { }
},
"filter" : {
"bool" : {
"should" : {
"missing" : {
"field" : "outer.inner.type"
}
}}}}
}
Итак, вопрос в том, что...
Как фильтровать документы, у которых есть хотя бы один outer
объект, который имеет все inner
объекты, соответствующие на основе type
inner
объект?
Подробнее по запросу -
Пример документа 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"
market и страну "GRB"
, потому что второй из двух объектов outer
будет считаться совпадением, поскольку оба inner
соответствуют объекты. Если бы мы предоставили стране страны "GRB"
и на рынке "Elite"
, то мы бы не вернули этот документ, потому что ни один из объектов outer
не беспокоился бы о своих объектах inner
в целом. Если бы мы хотели, чтобы второй объект outer
соответствовал, то все три inner
должны были бы совпадать. Обратите внимание, что в третьем inner
есть дополнительный type
. Это приводит к ситуации, когда , если существует тип , тогда он должен иметь соответствие для него else, он не должен совпадать, потому что он отсутствует.