#elasticsearch #elasticsearch-query #elasticsearch-nested
#elasticsearch #elasticsearch-запрос #elasticsearch-вложенный
Вопрос:
Я борюсь с проблемой запроса в ElasticSearch. У меня записаны такие объекты :
{
"obj_id": 1,
"label": "label obj 1",
"array_of_nested": [{
"nested_id": 1,
"label": "label nested obj1"
}, {
"nested_id": 2,
"label": "label nested obj2"
}
]
}, {
"obj_id": 2,
"label": "label obj 2",
"array_of_nested": [{
"nested_id": 3,
"label": "label nested obj1"
}, {
"nested_id": 4,
"label": "label nested obj2"
}
]
}
Я пытаюсь написать запрос, чтобы найти все объекты с nested_id равным 2 в свойстве array_of_nested, но пока не смог заставить его работать. :/
Спасибо!
Ответ №1:
Можете ли вы попробовать это?
{
"query": {
"match": {
"array_of_nested.nested_id": 2
}
}
}
Комментарии:
1. Удивительно: это работает!! Я не могу в это поверить, но в конце концов не было необходимости выполнять слишком сложный запрос. Спасибо!
Ответ №2:
Во вложенных типах вам нужно определить path
в своем запросе, и ваш запрос будет выглядеть примерно так:
{
"query": {
"nested": {
"path": "array_of_nested",
"query": {
"term": {
"array_of_nested.nested_id": {
"value": "2"
}
}
}
}
}
}
Комментарии:
1. К сожалению, мое свойство с массивом не было помечено как вложенное в сопоставлении.
Ответ №3:
Добавление рабочего примера с mapping
помощью , example docs
, и working
поискового запроса. вам нужно использовать параметр path вложенного поля
Отображение
{
"mappings": {
"properties": {
"array_of_nested": {
"type": "nested"
},
"obj_id" :{
"type" : "text"
},
"label" :{
"type" : "text"
}
}
}
}
Примеры документов
{
"obj_id": 1,
"label": "label obj 1",
"array_of_nested": [
{
"nested_id": 1,
"label": "label nested obj1"
},
{
"nested_id": 2,
"label": "label nested obj2"
}
]
}
И второй документ
{
"obj_id": 2,
"label": "label obj 2",
"array_of_nested": [
{
"nested_id": 3,
"label": "label nested obj1"
},
{
"nested_id": 4,
"label": "label nested obj2"
}
]
}
Поисковый запрос
{
"query": {
"nested": {
"path": "array_of_nested",
"query": {
"term": {
"array_of_nested.nested_id": {
"value": "2"
}
}
}
}
}
}
И ваш ожидаемый результат поиска
"hits": [
{
"_index": "nestedobj",
"_type": "_doc",
"_id": "1",
"_score": 1.0,
"_source": {
"obj_id": 1,
"label": "label obj 1",
"array_of_nested": [
{
"nested_id": 1,
"label": "label nested obj1"
},
{
"nested_id": 2,
"label": "label nested obj2"
}
]
}
}
]
Комментарии:
1. Спасибо, но на самом деле мой внутренний объект не имеет вложенного свойства в его отображении, и я не горю желанием переиндексировать все это. 😉
2. @user3379897 о, в любом случае рад, что это сработало, и hv предоставил бы рабочее решение, если бы вы предоставили сопоставление 🙂