2013-06-11 28 views
69

Elasticsearch ném một số SearchParseException trong khi phân tích cú pháp truy vấn nếu có một số tài liệu được tìm thấy không chứa trường được sử dụng trong tiêu chí sắp xếp.Không tìm thấy bản đồ nào cho trường để sắp xếp trong ElasticSearch

SearchParseException: Phân tích Failure [Không có ánh xạ tìm thấy cho [giá] để sắp xếp trên]

Làm thế nào tôi có thể tìm kiếm thành công các tài liệu này, ngay cả khi một số đang thiếu lĩnh vực price?

+1

Câu hỏi/câu trả lời của bạn đã giải quyết được vấn đề của tôi - cảm ơn bạn. Tôi đã chỉnh sửa để khái quát nó một chút, cảm thấy tự do để khôi phục nếu điều đó không phù hợp với bạn. –

+0

Tham khảo để xử lý vấn đề này [Liên kết Elasticsearch] (https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-sort.html) – Ajeesh

Trả lời

78

Sau khi tìm hiểu thêm, tôi đã tìm ra giải pháp như được đưa ra dưới đây. ignore_unmapped phải được đặt rõ ràng thành true trong mệnh đề sắp xếp.

"sort" : [ 
     { "rating": {"order" : "desc" , "ignore_unmapped" : true} }, 
     { "price": {"order" : "asc" , "missing" : "_last" , "ignore_unmapped" : true} } 
] 

Để biết thêm thông tin có một cái nhìn tại các tài liệu tham khảo Elasticsearch cho:

+0

Xin chào, tôi có cùng một vấn đề và tôi không 't hiểu cách thức hoạt động ... Các thuộc tính bị thiếu và ignore_unmapped nên làm việc cùng nhau phải không? Nếu ví dụ tôi đặt thiếu "_last" và ignore_unmapped thành "false", tôi vẫn gặp sự cố nhưng tôi muốn tài liệu nằm trong kết quả trong mọi trường hợp ngay cả khi chúng không có thuộc tính. – c4k

+0

Tôi gặp sự cố này và "ignore_unmapped" không hoạt động nếu _type của bạn trống (nghĩa là không có bất kỳ tài liệu nào được lập chỉ mục). – reinaldoluckman

+2

Có vẻ như chiến lược mới là sử dụng [unmapped_type] (https://www.elastic.co/guide/en/elasticsearch/reference/1.x/search-request-sort.html#_ignoring_unmapped_fields) – lukmdo

0

tôi có kinh nghiệm cùng một vấn đề (sorta; sẽ nhận được một số lỗi, nhưng một số kết quả), nhưng trong trường hợp của tôi, tìm kiếm của tôi đã được phát hành ở gốc (không có chỉ mục nào được chỉ định), và các lỗi tôi nhận được là vì biển rch/order cũng đang tìm kiếm chỉ số Kibana.

Lỗi ngu ngốc, nhưng có thể điều này sẽ giúp người khác kết thúc ở đây.

+0

tôi có cùng một vấn đề .. nhưng khi tôi chỉ định bỏ qua unmapped tôi không nhận được bất kỳ phân loại ở tất cả khi tìm kiếm gốc ... điều này giới hạn khả năng tìm kiếm cho tôi nếu tôi phải xác định chỉ mục ... tôi sẽ chỉ đơn giản muốn tất cả các kết quả phù hợp sẽ được sắp xếp theo một trường nếu nó tồn tại và điền vào mặc định cho những trường không .. EDIT: – mgoetzke

2

Rõ ràng ElasticSearch sẽ không sắp xếp theo giá trị null. Tôi đã giả định nó sẽ xử lý null như là lúc bắt đầu hoặc kết thúc (như với thứ tự SQL) nhưng tôi tin rằng nó cũng gây ra lỗi này.

Vì vậy, nếu bạn thấy lỗi này, bạn có thể cần phải đảm bảo thuộc tính sắp xếp có giá trị mặc định khi được gửi đến ElasticSearch.

Tôi gặp lỗi này với Rails + ElasticSearch + Tyre vì cột sắp xếp không có giá trị mặc định, vì vậy đã được gửi tới ES dưới dạng null.

This issue cho biết giá trị null đang xử lý, nhưng đó không phải là trải nghiệm của tôi. Đó là một cái gì đó đáng thử anyway.

28

Đối với những người tìm kiếm một ví dụ về cả ignore_unmappedunmapped_type xin vui lòng xem my response here.

Lưu ý rằng "ignore_unmapped" hiện không còn được dùng để ủng hộ "unmapped_type". Điều này được thực hiện như một phần của #7039

From documentation: Trước khi 1.4.0 có tham số boolean bỏ qua, không đủ thông tin để quyết định giá trị sắp xếp phát ra và không hoạt động cho tìm kiếm chỉ mục chéo. Nó vẫn được hỗ trợ nhưng thay vào đó, người dùng được khuyến khích di chuyển sang unmapped_type mới.

Theo mặc định, yêu cầu tìm kiếm sẽ thất bại nếu không có ánh xạ được liên kết với trường. Tùy chọn unmapped_type cho phép bỏ qua các trường không có ánh xạ và không sắp xếp chúng. Giá trị của tham số này được sử dụng để xác định giá trị sắp xếp nào phát ra.Dưới đây là một ví dụ về cách nó có thể được sử dụng:

{ 
    "sort" : [ 
     { "price" : {"unmapped_type" : "long"} }, 
    ], 
    "query" : { 
     "term" : { "user" : "kimchy" } 
    } 
} 

Nếu bất kỳ của các chỉ số được truy vấn không có một bản đồ cho giá sau đó Elasticsearch sẽ xử lý nó như thể có một ánh xạ của loại dài, với tất cả các tài liệu trong chỉ mục này không có giá trị cho trường này.