Я относительно новичок в эластичном поиске, и у меня есть вопрос о доступе к элементу внутри элемента внутри списка. Структура следующая:
{
'TestA':'1',
'TestB':{
'TestC':'2',
'TestD':[
{
'TestE':'3',
'TestF':'4'
},
{
'TestE':'5',
'TestF':'6'
}
]
}
}
С помощью этой следующей структуры я хочу вернуть все результаты запроса, в котором TestF имеет значение 6. Мне было интересно, возможно ли это со следующим шаблоном.
{
"query":{
"bool":{
"must":[
{
"match":{
"TestB.TestD.TestF":'6'
}
}
]
}
}
}
Сможет ли {"match" : { "TestB.TestD.TestF": '6'}} выполнить поиск по каждому элементу TestD, или мне нужно будет использовать какую-то другую команду для итерации по списку? Это с эластичным поиском 5.0. Заранее спасибо!
Да, ваш запрос match должен найти те результаты, которые вы ищете. Elasticsearch сглаживает массивы, когда помещает их в инвертированный индекс. Для получения дополнительной информации ознакомьтесь с документацией:
https://www.elastic.co/guide/en/elasticsearch/reference/current/nested.html#_how_arrays_of_objects_are_flattened
Arrays of inner
objectfields do not work the way you may expect. Lucene has no concept of inner objects, so Elasticsearch flattens object hierarchies into a simple list of field names and values.
Да, этого достаточно. Убедитесь, что вы используете
double quotesдля значений, если это строка, илиno quotes, если это число. Стандарт JSON требует, чтобы вы использовали двойные кавычки, а не одинарные. Таким образом, это либо{ "TestB.TestD.TestF": "6"}для строкового значения, либо{ "TestB.TestD.TestF": 6 }, если его числовое значение