Подтвердить что ты не робот

Как искать вложенные объекты с помощью эластичного поиска

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

Учитывая приведенные ниже документы, как мне искать все документы с видео, которое имеет "тест" в заголовке видео? Я использую 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"
    }
}]
4b9b3361

Ответ 1

Хорошо, я наконец-то нашел эти страницы (должно быть, раньше было потрачено больше времени с документами), и, похоже, мы установили свойство, содержащее видео, в 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

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

Ответ 2

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

'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' он будет верните один результат.

Ответ 3

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

/_search?pretty&q=video.title:*test*

Ответ 4

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

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

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