Если документы не имеют вложенного типа , я не думаю, что это возможно с простыми типами массивов из-за того, что Elasticsearch выравнивает объекты и сохраняет их.
Запрос чего-либо к этим плоским объектам даст вам совершенно неожиданные результаты.
Теперь я пришел к следующему запросу, использующему Агрегирование терминов с использованием скрипта отлично работает для документа, который вы упомянули в вопросе
POST so/_search
{
"size": 0,
"aggs": {
"xxx": {
"filter": {
"term": {
"Type.field": "valid"
}
},
"aggs": {
"yyy": {
"terms": {
"script": {
"source": """
int size = doc['Type.string.keyword'].values.length;
for(int i=0; i<size; i++){
String myString = doc['Type.string.keyword'][i];
if(myString.equals("B") && doc['Type.field.keyword'][i].equals("valid")){
return myString;
}
}""",
"lang": "painless"
}
}
}
}
}
}
}
Однако, если вы проглотите приведенный ниже документ, вы увидите, что ответ агрегации будет совершенно другим.Это связано с тем, что типы массивов не хранят каждое значение Type.field
и Type.string
в расположении ith
в своих соответствующих массивах.
POST so/question/2
{
"Type": [
[
{
"field": "valid",
"string": "A"
}
],
[
{
"field": "invalid",
"string": "B"
}
]
]
}
Обратите внимание, что даже приведенный ниже простой запрос Bool не будет работать должным образом и в результате отобразятся оба документа.
POST so/_search
{
"query": {
"bool": {
"must": [
{ "match": { "Type.field.keyword": "valid" }},
{ "match": { "Type.string.keyword": "B" }}
]
}
}
}
Надеюсь, это поможет!