2012-05-02 9 views
6

tengo documentos que se parecen a esto (aquí son dos ejemplos):Elasticsearch ordenar por sola tecla documento anidada en orden

{ 
    "id": 1234, 
    "title": "the title", 
    "body": "the body", 
    "examples": [ 
     { 
      "evidence_source": "friend", 
      "source_score": 15 
     }, 
     { 
      "evidence_source": "parent", 
      "source_score": 12 
     } 
    ] 
} 

y

{ 
    "id": 6346, 
    "title": "new title", 
    "body": "lots of content", 
    "examples": [ 
     { 
      "evidence_source": "friend", 
      "source_score": 10 
     }, 
     { 
      "evidence_source": "parent", 
      "source_score": 27 
     }, 
     { 
      "evidence_source": "child", 
      "source_score": 4 
     } 
    ] 
} 

El formato de los sub-documentos en el examples matriz siempre tendrá un evidence_source y un source_score pero habrá una cantidad variable de estos subdocumentos, cada uno con valores diferentes evidence_source.

Me pregunto si es posible ordenar documentos con este formato en función de uno de los valores source_score que coincidan con un valor específico de evidence_source. Realmente me gustaría ser capaz de hacer esto:

  • Ordenar documentos por source_score descendente donde el relacionado evidence_source es friend. El orden resultante del documento id s sería 1234,6346.
  • Ordenar documentos por source_score descendiendo donde evidence_source relacionado es parent. El orden resultante del documento id s sería 6346,1234.

Los resultados más próximos que estoy ocurre para hacer algo como esto son 1 y 2 pero no creen que consiguen exactamente lo que yo quiero hacer.

¿Alguna idea sobre cómo podría hacer esto? He contemplado algunas ideas basadas en la indexación de estos subdocumentos examples por separado, pero soy bastante nuevo en elasticsearch y, por lo tanto, estoy buscando algún consejo sobre cómo lograr mi objetivo de la manera más directa (que puede ser una pipeta). soñar ...)

actualización: Un post en el elasticsearch mailing list parece indicar que esto no es posible, pero me pregunto si alguien aquí tiene alguna idea diferente! se añadió

+0

¿Se asignan subdocumentos como documentos anidados o como objetos? ¿Cuántos registros espera tener en su índice? – imotov

+0

En este momento, en realidad no los estoy mapeando en absoluto, pero estoy dispuesto a intentar experimentar con diferentes asignaciones para llegar a la funcionalidad que estoy buscando. Estoy esperando en el orden de 100 millones de registros almacenados. –

+0

¿Cuántos tipos diferentes de evidence_source está planeando tener? – imotov

Respuesta

18

Apoyo para la clasificación basada en los campos dentro de documentos anidados para Elasticsearch en 0.90:

https://github.com/elasticsearch/elasticsearch/issues/2662

La clasificación por apoyo sobre el terreno anidada tiene los siguientes parámetros en parte superior de la clase ya existente opciones:

  • nested_path - Define qué objeto anidado va a ordenar. El campo de clasificación real debe ser un campo directo dentro de este objeto anidado. El valor predeterminado es utilizar el objeto anidado heredado más inmediato del campo de ordenación .
  • nested_filter - Un filtro que los objetos internos dentro de la ruta anidada deben coincidir con para que sus valores de campo sean tomados en cuenta por clasificación. El caso común es repetir el filtro query/ dentro del filtro o consulta anidado. De forma predeterminada, no está activo nested_filter .

Teniendo en cuenta los datos de ejemplo, la siguiente consulta debe darle lo que está buscando:

{ 
    "query": { 
    "match_all": {} 
    }, 
    "sort": [ 
    { 
     "examples.source_score": { 
     "order": "desc", 
     "nested_path": "examples", 
     "nested_filter": { 
      "term": { 
      "examples.evidence_source": "friend" 
      } 
     } 
     } 
    } 
    ] 
} 
+0

¿Es posible utilizar la consulta anterior cuando hay una relación padre-hijo? –

+0

@PrasadBhosale No es posible porque es solo para Objeto anidado. https://www.elastic.co/guide/en/elasticsearch/guide/current/nested-sorting.html – sangheestyle

+0

¿Es posible usar una consulta bool dentro del filtro anidado? –

Cuestiones relacionadas