2014-12-30 15 views
8

Hãy nói rằng tôi có tài liệu với các lĩnh vực sau: {field1, field2, ... fieldn}so elasticsearch giữa các trường

tôi cần phải chạy một số truy vấn mà một số trong những điều kiện đòi hỏi phải có một sự so sánh giữa hai hoặc nhiều lĩnh vực. như fieldX = fieldY

Trong SQL tiêu chuẩn, ví dụ có thể là:

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

I'be được đọc một số tài liệu, và có vẻ "kịch bản" có thể là cách duy nhất để đạt được điều này? Hoặc có bất kỳ lựa chọn nào khác không?

Trả lời

17

Bạn có thể sử dụng bộ lọc kịch bản -

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

Bạn có thể tìm thêm thông tin tại herehere.

+0

Cảm ơn rất nhiều, tính năng này hoạt động. Tôi cho rằng kịch bản là cách duy nhất để so sánh các trường giữa chúng. Có kịch bản tác động tiêu cực đến hiệu suất không? – jdiaz4517

+2

Scripting nói chung là CPU chuyên sâu. –

+2

Đối với ES 5.0+, bạn sẽ cần sử dụng truy vấn thay vì được lọc ở phần trên cùng, ví dụ: "truy vấn": {"bool": {"phải": {"phạm vi": ...}}, "bộ lọc ": ...}': https://stackoverflow.com/questions/40519806/no-query-registered-for-filtered – AJP

Các vấn đề liên quan