2015-06-10 19 views
7

Tôi đã tạo chỉ mục elasticsearch và ánh xạ hiện tại của tôi lưu trữ số tiền đô la của một mục dưới dạng một chuỗi. Điều này chứng minh là khó khăn vì tôi không thể tìm kiếm/lọc chính xác giá trị này.Cách lưu trữ tiền trong elasticsearch

GET catalog/product/_search 
{ 
    "filter": { 
    "range": { 
     "price": { 
     "from": 230.0, 
     "to": 300.0 
     } 
    } 
    } 
} 

Giá giá được ánh xạ dưới dạng chuỗi. Tôi sử dụng một chuỗi bởi vì đi từ một giá trị thập phân python, tôi đã có vấn đề mà giá trị này đột nhiên nhận được giá trị tại một cái gì đó như 17.989999999999999999998789. Điều này chỉ xảy ra đôi khi nhưng tôi không muốn nhận được vào vấn đề đi từ một số thập phân python đến một java đôi/float (vì vậy tôi chỉ str() điều).

Bất kỳ suy nghĩ nào về cách tiếp cận tốt hơn? Tôi có nên cắn viên đạn và bản đồ giá thành một đôi hoặc một phao?

+5

Vấn đề là ElasticSearch không có loại 'thập phân' để nó có thể được chuyển đổi thành' float'. Nhân với 100 và lưu trữ dưới dạng xu, sau đó chuyển đổi phía ứng dụng? Tạm biệt các vấn đề chính xác. –

+0

Đó là một ý tưởng tuyệt vời. Nếu bạn trả lời, tôi có thể đánh dấu nó như vậy. Vấn đề duy nhất là trả lại rất nhiều dữ liệu, lặp lại tất cả các mục đó có thể là mặt ứng dụng tốn kém (chậm). Tôi có thể sử dụng một tập lệnh ES nhưng cũng chậm quá. – stincity

+1

Bạn cũng có thể muốn xem câu trả lời đầu tiên của câu hỏi này http://stackoverflow.com/questions/1458633/how-to-deal-with-floating-point-number-precision-in-javascript – Val

Trả lời

7

Điều này xảy ra do ElasticSearch không có loại được tạo sẵn cho số thập phân hoặc tiền tệ, vì vậy giá trị của bạn có thể được chuyển đổi thành float và bị các vấn đề về độ chính xác của dấu phẩy động.

Bạn sẽ có thể thực hiện việc này bằng cách lưu trữ giá trị dưới dạng long (ví dụ: số xu hơn là đô la) và chuyển đổi đến và từ decimal mặt ứng dụng của bạn.

Vì bạn sẽ chỉ thực hiện chuyển đổi này cho các giá trị bạn đã liệt kê, tác động hiệu suất sẽ không đáng kể.

6

Trong phiên bản mới hơn (kiểm tra 5.0), có lẽ là lựa chọn tốt nhất là sử dụng scaled_float với scaling_factor = 100 như trong ví dụ của họ:

PUT my_index 
{ 
    "mappings": { 
    "my_type": { 
     "properties": { 
     "number_of_bytes": { 
      "type": "integer" 
     }, 
     "time_in_seconds": { 
      "type": "float" 
     }, 
     "price": { 
      "type": "scaled_float", 
      "scaling_factor": 100 
     } 
     } 
    } 
    } 
} 

Bạn có thể tìm doc của họ vào đây.

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