Как искать вложенные объекты с помощью эластичного поиска
Хорошо, я пока не смог понять это. Надеясь, кто-то может предложить некоторое понимание.
Учитывая приведенные ниже документы, как мне искать все документы с видео, которое имеет "тест" в заголовке видео? Я использую 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"
}
}]
Ответы
Ответ 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
.