Comment rechercher des objets imbriqués avec elastic-search

OK, je n'ai pas été capable de comprendre cela jusqu'à présent. En espérant que quelqu'un peut offrir un aperçu.

Compte tenu des documents ci-dessous, comment rechercher tous les documents avec une vidéo qui a "test" dans le titre de la vidéo? Je suis l'aide de l'API HTTP. (fondamentalement, comment recherchez-vous des objets imbriqués avec elastic search? Je sais qu'il doit y avoir des docs là-bas, 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"
    }
}]
31
demandé sur Ricardo 2011-11-15 21:37:47

3 réponses

Vous n'avez pas nécessairement besoin d'imbriquer la vidéo; vous pouvez la Mapper comme un champ normal. Ce qui signifie qu'il va stocker

'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'.

, aussi loin Que je le reçois, des champs imbriqués utile lorsque vous avez plusieurs éléments imbriqués, et vous voulez faire 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, il va vous donner un faux résultat (car test est dans la première vidéo et description2 dans le deuxièmement, mais dans tout le champ vidéo, vous avez les deux).

Dans ce cas, si vous mappez la vidéo comme imbriquée, il se souviendra de chaque vidéo comme une entité distincte et recherchera des vidéos individuelles qui correspondent à ces conditions, donc pour video.title: 'test' and video.description: 'description2' il ne retournera rien, pour video.title: 'example' and video.description: 'description2' il retournera un résultat.

42
répondu dira 2012-02-10 13:54:31

OK, RTFM! J'ai finalement trouvé ces pages (aurait dû prendre plus de temps avec les docs à l'avance) et il semble que nous définissions la propriété qui contient la vidéo à type:imbriqué, 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 aidera quelqu'un sur la route.

24
répondu swatkins 2015-04-07 17:59:45

Si vous voulez le mettre au format D'URL de L'API Rest

/ _search?jolie & Q = vidéo.titre:*test*

1
répondu Dinesh Kumar Sahu 2018-05-18 05:35:43