web-dev-qa-db-fra.com

Comment rechercher des objets imbriqués avec élastique-recherche

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"
    }
}]
36
swatkins

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.

32
swatkins

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.

49
dira

Si vous souhaitez le mettre au format URL de l'API Rest

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

3

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.

1
tsorn