Как искать во вложенных объектах с помощьюastic-search - PullRequest
36 голосов
/ 15 ноября 2011

Хорошо, я до сих пор не смог понять это. Надеясь, что кто-то может предложить некоторое понимание.

Учитывая приведенные ниже документы, как мне искать все документы с видео, которое имеет "тест" в заголовке видео? Я использую HTTP API. (В основном, как вам искать во вложенных объектах с помощью упругого поиска? Я знаю, что там должны быть документы, но я не смог их найти).

[{
    id:4635,
    description:"This is a test description",
    author:"John",
    author_id:51421,
    video: {
        title:"This is a test title for a video",
        description:"This is my video description",
        url:"/url_of_video"
    }
},
{
    id:4636,
    description:"This is a test description 2",
    author:"John",
    author_id:51421,
    video: {
        title:"This is an example title for a video",
        description:"This is my video description2",
        url:"/url_of_video2"
    }
},
{
    id:4637,
    description:"This is a test description3",
    author:"John",
    author_id:51421,
    video: {
        title:"This is a test title for a video3",
        description:"This is my video description3",
        url:"/url_of_video3"
    }
}]

Ответы [ 4 ]

47 голосов
/ 10 февраля 2012

Вам не обязательно вкладывать видео; Вы можете отобразить это как нормальное поле. Что означает, что он будет хранить

'video:title': "This is a test title for a video3",
'video:description':"This is my video description3",
'video:url':"/url_of_video3"

И вы можете искать video.title:'test'.

Насколько я понимаю, вложенные поля полезны, когда у вас есть несколько вложенных элементов, и вы хотите сделать запрос только для вложенных элементов. Например, имея эти данные

[{
    id:4635,
    description:"This is a test description",
    author:"John",
    author_id:51421,
    video: [
      {
        title:"This is a test title for a video",
        description:"This is my video description",
        url:"/url_of_video"
      },
      {
        title:"This is an example title for a video",
        description:"This is my video description2",
        url:"/url_of_video2"
      }
    ]
},
{
    id:4637,
    description:"This is a test description3",
    author:"John",
    author_id:51421,
    video: [
      {
        title:"This is a test title for a video3",
        description:"This is my video description3",
        url:"/url_of_video3"
      }
    ]
}]

Если вы будете искать video.title: 'test' and video.description: 'description2', а видео не было вложенным, оно даст вам поддельный результат (потому что test находится в первом видео и description2 во втором, но во всем видео поле, которое вы есть оба).

В этом случае, если вы отобразите видео как вложенное, оно будет помнить каждое видео как отдельную сущность и будет искать отдельные видео, которые соответствуют этим условиям, поэтому для video.title: 'test' and video.description: 'description2' оно ничего не вернет, для video.title: 'example' and video.description: 'description2' это будет вернуть один результат.

31 голосов
/ 15 ноября 2011

ОК, RTFM! Я наконец-то нашел эти страницы (должно быть, раньше было потрачено больше времени с документами), и, похоже, мы установили свойство, содержащее видео, в type: nested, а затем использовали вложенные запросы.

http://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-nested-query.html

http://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-nested-filter.html

Надеюсь, это поможет кому-то в будущем.

3 голосов
/ 18 мая 2018

Если вы хотите поместить его в формате URL API отдыха

/ _ search? Pretty & q = video.title: * test *

1 голос
/ 25 марта 2019

Вы можете использовать суффикс .keyword, если имя вложенного объекта уникально:

{
        'query': {
            'term': {
                'title.keyword': "This is a test title for a video"               
            }
        }
}

, которое должно соответствовать вашей записи первого примера.Обратите внимание, что имя объекта video нигде не указано;это соответствует всем объектам, имеющим подобъект title.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...