2014-12-30 14 views
8

Diciamo che ho i documenti con i seguenti campi: {field1, field2, ... fieldn}elasticsearch confronto tra i campi

Ho bisogno di eseguire alcune query in cui alcune delle condizioni richiederà un confronto tra due o più campi. come fieldX = fieldY

In SQL standard, un esempio potrebbe essere:

SELECT * FROM Table1 WHERE farePrice>100 AND originRegion = destinationRegion 

I'be leggendo alcuni documenti, e sembra "script" potrebbe essere l'unico modo per raggiungere questo obiettivo? O ci sono altre opzioni?

risposta

17

È possibile utilizzare il filtro di script -

{ 
    "filtered": { 
    "query": { 
     "range": { 
     "farePrice": { 
      "gt": 100 
     } 
     } 
    }, 
    "filter": { 
     "script": { 
     "script": "doc['originRegion'].value == doc['destinationRegion'].value" 
     } 
    } 
    } 
} 

È possibile trovare maggiori informazioni a here e here.

+0

Grazie mille, questo funziona. Suppongo che lo scripting sia l'unico modo per confrontare i campi tra di loro. Lo scripting ha un impatto negativo sulla performance? – jdiaz4517

+2

Lo scripting è in genere intenso per la CPU. –

+2

Per ES 5.0+ è necessario utilizzare la query anziché filtrare all'inizio, ad esempio: '" query ": {" bool ": {" must ": {" intervallo ": ...}}," filtro ": ...}': https://stackoverflow.com/questions/40519806/no-query-registered-for-filtered – AJP

Problemi correlati