Запрос Elasticsearch на массивы вложенных объектов

#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 предоставил бы рабочее решение, если бы вы предоставили сопоставление 🙂