2011-11-15 18 views
27

OK, no he podido resolver esto hasta ahora. Esperando que alguien pueda ofrecer alguna idea.Cómo buscar objetos anidados con elástico-search

Teniendo en cuenta los siguientes documentos, ¿cómo buscaría todos los documentos con un video que tenga "prueba" en el título del video? Estoy usando la API HTTP. (Básicamente, ¿cómo buscar objetos anidados con elasticsearch? Sé que tiene que ser docs por ahí, pero realmente no han podido encontrar ninguna.)

[{ 
    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" 
    } 
}] 

Respuesta

24

OK, RTFM! Finalmente encontré estas páginas (debería haber llevado más tiempo con los documentos de antemano) y parece que establecemos la propiedad que contiene el video para que escriba: anidado, luego use consultas anidadas.

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

Espero que esto ayude a alguien por el camino.

+1

No necesita necesariamente anidar el vide. Ver http://www.elasticsearch.org/blog/2010/02/12/yourdatayoursearch.html y mi respuesta a continuación. – dira

+0

Aquí está el enlace actualizado: http://www.elasticsearch.org/blog/your-data-your-search/ – swatkins

+1

Esta publicación del blog me pareció realmente útil también: http://www.elasticsearch.org/blog/managing -relations-inside-elasticsearch/ – Quin

42

No necesita necesariamente anidar video; puedes mapearlo como un campo normal. Lo que significa que almacenará

'video:title': "This is a test title for a video3", 
'video:description':"This is my video description3", 
'video:url':"/url_of_video3" 

Y usted puede buscar video.title:'test'.

Por lo que yo entiendo, los campos anidados son útiles cuando tiene múltiples elementos anidados, y desea realizar una consulta solo para los elementos anidados. Por ejemplo, tener estos datos

[{ 
    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 desea buscar video.title: 'test' and video.description: 'description2', y el vídeo no se anida, se le dará un resultado falso (porque test es en el primer vídeo y description2 en la segunda, pero en todos el campo de video tiene ambos).

En este caso, si asigna video anidado, recordará cada video como una entidad separada y buscará videos individuales que cumplan esas condiciones, por lo que video.title: 'test' and video.description: 'description2' no devolverá nada, video.title: 'example' and video.description: 'description2' devolverá un resultado .

+6

Esta respuesta proporciona una distinción importante entre anidar y simplemente almacenar una matriz secundaria u objeto. Nesting crea documentos adicionales en el índice y complica innecesariamente las cosas en el caso @swatkins. –

+0

¿Qué tal un campo con una lista de cadenas? cómo recuperar solo los elementos de la lista y los documentos con al menos una coincidencia en la lista de ese campo? –

Cuestiones relacionadas