2012-05-02 12 views
6

Ho documenti che assomigliano a questo (qui sono due esempi):elasticsearch ordina per singolo tasto documento nidificato in ordine di

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

e

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

Il formato dei sub-documenti nella L'array examples avrà sempre un evidence_source e un source_score ma ci sarà una quantità variabile di questi sotto-documenti, ognuno con valori diversi evidence_source.

Mi chiedo se sia possibile ordinare i documenti con questo formato basato su uno dei valori source_score abbinato a un valore specifico evidence_source. Mi piacerebbe davvero essere in grado di fare questo:

  • documenti Scelta per source_score discendente in cui il relativo evidence_source è friend. L'ordinamento risultante del documento id s sarebbe 1234,6346.
  • Ordinare i documenti per source_score discendente dove il relativo evidence_source è parent. L'ordinamento risultante del documento id s sarebbe 6346,1234.

I risultati più vicini che sto venuta in mente per fare qualcosa come questo sono 1 e 2, ma non credo che ottengono esattamente quello che voglio fare.

Qualche idea su come potrei fare questo? Ho preso in considerazione alcune idee basate sull'indicizzazione di questi sotto-documenti examples separatamente, ma sono abbastanza nuovo per elasticsearch e sono quindi alla ricerca di alcuni consigli su come raggiungere il mio obiettivo nel modo più diretto (che potrebbe essere un sognare ...)

Aggiornamento: Un post sul elasticsearch mailing list sembra indicare che questo non è possibile, ma mi chiedo se qualcun altro ha qui tutte le idee diverse!

+0

Sono documenti secondari mappati come documenti annidati o come oggetti? Quanti record pensi di avere nel tuo indice? – imotov

+0

Al momento, in realtà non li sto mappando proprio per niente, ma sono disposto a provare a sperimentare con mappature diverse per arrivare alla funzionalità che sto cercando. Mi aspetto un ordine di 100 milioni di record totali memorizzati. –

+0

Quanti tipi diversi di evidence_source hai intenzione di avere? – imotov

risposta

18

supporto per l'ordinamento in base ai campi all'interno di documenti nidificati è stato aggiunto al elasticsearch in 0.90:

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

L'ordinamento dal supporto sul campo nidificato ha i seguenti parametri sulla cima del genere già esistente opzioni:

  • nested_path - Definisce il tipo di oggetto annidato da ordinare. Il campo di ordinamento effettivo deve essere un campo diretto all'interno di questo oggetto nidificato. L'impostazione predefinita di consiste nell'utilizzare l'oggetto nidificato ereditato più immediato dal campo di ordinamento .
  • nested_filter - Un filtro per gli oggetti interni all'interno del percorso nidificato di deve corrispondere affinché i suoi valori di campo siano presi in considerazione dall'ordinamento. Il caso comune consiste nel ripetere il filtro query/ all'interno del filtro o della query nidificati. Per impostazione predefinita non è attivo nested_filter .

dato i vostri dati di esempio, la query seguente dovrebbe darvi quello che stai cercando:

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

È possibile utilizzare la query precedente quando esiste una relazione padre figlio? –

+0

@PrasadBhosale Non è possibile perché è solo per Oggetto nidificato. https://www.elastic.co/guide/en/elasticsearch/guide/current/nested-sorting.html – sangheestyle

+0

È possibile utilizzare una query bool all'interno del filtro nidificato? –

Problemi correlati