2011-09-15 13 views
8

Considere un modelo muy simple donde tenemos ubicaciones y cada ubicación puede tener cero o más eventos. Una ubicación tendría propiedades como el nombre, la descripción y los datos del punto geográfico (lon/lat). Un evento debe adjuntarse a una ubicación (su principal) y debe tener un nombre y una descripción.¿Cómo puedo recuperar solo los niños que coinciden?

{ 
    "location" : { 
     "properties": { 
      "name": { "type": "string", "boost": 2.0, "analyzer": "snowball" }, 
      "description": { "type": "string", "analyzer": "snowball" }, 
      "geo": { "type": "geo_point" }, 
      "exhibits": { 
       "type": "nested", 
       "properties": { 
        "name": { "type": "string", "boost": 2.0, "analyzer": "snowball" }, 
        "description": { "type": "string", "analyzer": "snowball" } 
       } 
      } 
     } 
    } 
} 

Lo que yo quiero ser capaz de hacer, es para consultar los documentos hijo (eventos) que realizan una búsqueda de texto completo en sus nombres y descripciones. Me gustaría recuperar los eventos coincidentes y también poder obtener el nombre de su ubicación principal. También me gustaría reducir el resultado establecido por las coordenadas de la ubicación. No quiero recibir ningún evento que no coincida con la consulta. ¿Es eso posible en Elastic Search? ¿Qué tipos de consultas debo usar?

He intentado poner eventos como una propiedad de matriz bajo ubicación (ver arriba) y usando la consulta nested pero no devuelve el tipo de resultados que quiero (creo que devuelve toda la ubicación, incluidos todos los eventos, incluso el los que no coinciden con mi consulta). He intentado poner eventos en un índice separado (¿asignación?) Que proporciona la propiedad _parent y luego realizar la consulta top_children en las ubicaciones, pero no obtengo ningún resultado.

{ 
    "exhibit": { 
     "_parent": { "type": "locations" }, 
     "properties": { 
      "name": { "type": "string", "boost": 2.0, "analyzer": "snowball" }, 
      "description": { "type": "string", "analyzer": "snowball" } 
     } 
    } 
} 

¿Alguien podría arrojar algo de luz? No sé por dónde empezar ...

Respuesta

8

Aquí está la solución de trabajo a mi problema, tal vez sea útil para alguien.

Lugar de asignación:

{ 
    "location" : { 
     "properties": { 
      "name": { "type": "string", "boost": 2.0, "analyzer": "snowball" }, 
      "description": { "type": "string", "analyzer": "snowball" }, 
      "geo": { "type": "geo_point" } 
     } 
    } 
} 

asignación de exposiciones:

{ 
    "exhibit": { 
     "_parent": { "type": "locations" }, 
     "properties": { 
      "name": { "type": "string", "boost": 2.0, "analyzer": "snowball" }, 
      "description": { "type": "string", "analyzer": "snowball" } 
     } 
    } 
} 

Consulta:

{ 
    "fields": [ "_parent", "name", "_source" ], 
    "query": { 
     "bool": { 
      "should": [ 
       { "text": { "name": "candy" } }, 
       { "text": { "description": "candy" } } 
      ] 
     } 
    }, 
    "filter": { 
     "and": [ 
      { 
       "terms" : { 
        "_parent": [ "4e7089a9b97d640b30695b7a", "4e7089eeb97d640b30695b7b" ] 
       } 
      }, 
      { "range": { "start": { "lte": "2011-09-22" } } }, 
      { "range": { "end": { "gte": "2011-09-22" } } } 
     ] 
    } 
} 

Usted debe consultar con el campo _parent y haciéndola pasar una matriz de ID de ubicaciones para cuál quieres limitar las exhibiciones.

+0

Muy útil, gracias por compartir. ¿Qué JSON estás usando para agregar una nueva exhibición a una ubicación? – gjb

+0

Genial, pero ¿cómo recuperas el nombre de los padres? '" fields ": [" _parent "," name "," _source "]' Recuperará el nombre del niño, ¿no? – Yeggeps

+0

@Yeggeps: Sí, la consulta está buscando hijos de algún documento. Lo que estás pidiendo no pertenece a mi escenario. –

Cuestiones relacionadas