Эластичный поиск - доступ к члену элемента внутри списка

Я относительно новичок в эластичном поиске, и у меня есть вопрос о доступе к элементу внутри элемента внутри списка. Структура следующая:

{  
   '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. Заранее спасибо!

Да, этого достаточно. Убедитесь, что вы используете double quotes для значений, если это строка, или no quotes, если это число. Стандарт JSON требует, чтобы вы использовали двойные кавычки, а не одинарные. Таким образом, это либо { "TestB.TestD.TestF": "6"} для строкового значения, либо { "TestB.TestD.TestF": 6 }, если его числовое значение

Opster ES Ninja - Kamal 23.10.2018 08:14
1
1
26
1

Ответы 1

Да, ваш запрос match должен найти те результаты, которые вы ищете. Elasticsearch сглаживает массивы, когда помещает их в инвертированный индекс. Для получения дополнительной информации ознакомьтесь с документацией: https://www.elastic.co/guide/en/elasticsearch/reference/current/nested.html#_how_arrays_of_objects_are_flattened

Arrays of inner object fields 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.

Другие вопросы по теме