OK, je n'ai pas été en mesure de comprendre cela jusqu'à présent. En espérant que quelqu'un puisse offrir un aperçu.
Compte tenu des documents ci-dessous, comment pourrais-je rechercher tous les documents avec une vidéo qui a "test" dans le titre de la vidéo? J'utilise l'API HTTP. (Fondamentalement, comment recherchez-vous des objets imbriqués avec une recherche élastique? Je sais qu'il doit y avoir des documents, mais je n'ai pas vraiment pu en trouver.)
[{
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"
}
}]
OK, j'ai finalement trouvé ces pages (cela aurait dû prendre plus de temps avec les documents au préalable) et il semble que nous ayons défini la propriété qui contient la vidéo pour taper: nested, puis utiliser des requêtes imbriquées.
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
J'espère que cela aide quelqu'un sur la route.
Vous n'avez pas nécessairement besoin d'imbriquer une vidéo; vous pouvez le mapper comme un champ normal. Ce qui signifie qu'il stockera
'video:title': "This is a test title for a video3",
'video:description':"This is my video description3",
'video:url':"/url_of_video3"
Et vous pouvez rechercher video.title:'test'
.
Pour autant que je sache, les champs imbriqués sont utiles lorsque vous avez plusieurs éléments imbriqués et que vous souhaitez effectuer une requête uniquement pour les éléments imbriqués. Par exemple, avoir ces données
[{
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"
}
]
}]
Si vous recherchez video.title: 'test' and video.description: 'description2'
, et la vidéo n'a pas été imbriquée, cela vous donnera un faux résultat (car test
est dans la première vidéo et description2
dans le second, mais dans tout le champ vidéo vous avez les deux).
Dans ce cas, si vous mappez une vidéo comme imbriquée, elle se souviendra de chaque vidéo en tant qu'entité distincte et recherchera des vidéos individuelles répondant à ces conditions, donc pour video.title: 'test' and video.description: 'description2'
il ne retournera rien, car video.title: 'example' and video.description: 'description2'
il renverra un résultat.
Si vous souhaitez le mettre au format URL de l'API Rest
/_search?pretty&q=video.title:*test*
Vous pouvez utiliser le .keyword
suffixe si le nom de l'objet imbriqué est unique:
{
'query': {
'term': {
'title.keyword': "This is a test title for a video"
}
}
}
Qui devrait correspondre à votre premier exemple d'exemple. Notez que le nom d'objet video
n'est spécifié nulle part; cela correspond à tous les objets qui ont un sous-objet title
.