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.
bạn rock man !!! – sunshinekitty