2014-12-30 13 views
8

Powiedzmy mam dokumenty z następujących dziedzin: {field1, field2, ... fieldn}elasticsearch porównanie pomiędzy polami

muszę wykonać jakieś pytania, gdzie niektóre z warunków będzie wymagać porównania między dwoma lub więcej pól. jak fieldX = fieldY

W standardzie SQL, przykładem mogą być:

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

I'be czytał jakąś dokumentację, i wygląda na „włączony” może być jedyną drogą do osiągnięcia tego celu? Czy są jakieś inne opcje?

Odpowiedz

17

Można użyć filtru Script -

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

można znaleźć więcej informacji na here i here.

+0

Wielkie dzięki, to działa. Sądzę, że skryptowanie jest wtedy jedynym sposobem porównywania pól między nimi. Czy skrypt ma negatywny wpływ na wydajność? – jdiaz4517

+2

Skrypty zazwyczaj wymagają dużej mocy obliczeniowej. –

+2

Dla ES 5.0+ musisz użyć zapytania zamiast filtrującego na górze urlopu, np .: '" query ": {" bool ": {" must ": {" range ": ...}}," filter ": ...}': https://stackoverflow.com/questions/40519806/no-query-registered-for-filtered – AJP