2013-09-23 58 views
11

Tôi có một số tài liệu mà tôi muốn sắp xếp theo trường ngày. Đối với các tài liệu có ngày bằng một ngày cụ thể, ví dụ ngày hôm nay và tất cả các ngày sau đó tôi muốn sắp xếp tăng dần. Đối với những ngày trước ngày được chỉ định, tôi muốn sắp xếp theo thứ tự giảm dần.Phân loại có điều kiện trong ElasticSearch

Điều này có thể thực hiện trong ElasticSearch không? Nếu vậy, bạn có thể đề nghị bất kỳ tài liệu hay cách tiếp cận nào.

ngày là loại "ngày" và định dạng "dateOptionalTime".

Cảm ơn

Trả lời

14

Có thể thực hiện điều này trong ElasticSearch sử dụng tập lệnh để phân loại hoặc ghi điểm.

Tùy chọn của tôi sẽ dành cho kịch bản chấm điểm vì 'điểm dựa trên tập lệnh' sẽ nhanh hơn (theo tài liệu).

Sử dụng tập lệnh điểm, bạn có thể sử dụng dấu thời gian Unix cho trường ngày loại int/long và tập lệnh sắp xếp mvel trong truy vấn custom_score. Bạn có thể cần phải lập chỉ mục lại tài liệu của mình. Bạn cũng sẽ cần phải có khả năng chuyển đổi thời gian tìm kiếm thành một dấu thời gian Unix để bơm nó tại ElasticSearch.

Tập lệnh sắp xếp sau đó sẽ khấu trừ dấu thời gian được yêu cầu từ dấu thời gian của từng tài liệu và tạo một giá trị tuyệt đối. Sau đó, kết quả được sắp xếp theo thứ tự tăng dần - khoảng cách 'thấp nhất' thấp nhất là tốt nhất.

Vì vậy, khi tìm kiếm tài liệu ngày khoảng một năm trước, nó sẽ giống như thế:

"query": { 
    "custom_score" : { 
     "query" : { 
      .... 
     }, 
     "params" : { 
      "req_date_stamp" : 1348438345, 
     }, 
     "script" : "abs(doc['timestamp'].value - req_date_timestamp)" 
    } 
}, 
"sort": { 
    "_score": { 
     'order': 'asc' 
    } 
} 

(Xin lỗi cho bất kỳ sai lầm trong JSON của tôi - Tôi đã thử nghiệm ý tưởng này trong pyes)

Bạn có thể đặt cần phải tinh chỉnh điều này để có được quyền làm tròn - ví dụ câu hỏi của bạn đề cập đến các ngày phù hợp, vì vậy bạn có thể muốn làm tròn bộ tạo dấu thời gian cho ngày gần nhất.

Để biết thông tin "đầy đủ", bạn có thể xem Custom Score Query docs và làm theo liên kết đến tập lệnh MVEL.

+2

bạn rock man !!! – sunshinekitty

3

Đối với loại này trường hợp sử dụng cụ thể, bạn nên sử dụng một kịch bản sắp xếp.

Xem phần "sắp xếp dựa trên tập lệnh" trong trang Sort documentation.