Không tìm thấy ánh xạ nào cho trường để sắp xếp trong ElasticSearch


117

Elasticsearch ném SearchParseExceptiontruy vấn phân tích cú pháp while nếu tìm thấy một số tài liệu không chứa trường được sử dụng trong tiêu chí sắp xếp.

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

Làm cách 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ố tài liệu bị thiếu pricetrường?


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 để tổng quát hóa nó phần nào, vui lòng quay lại nếu điều đó không phù hợp với bạn.
Paul Bellora,

1
Tham khảo để xử lý vấn đề này Liên kết Elasticsearch
Ajeesh

Câu trả lời:


116

Sau khi đào sâu hơn, tôi tìm thấy giải pháp như dưới đây. ignore_unmappednên được đặt rõ ràng thành truetrong 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, hãy xem các tham chiếu Elasticsearch cho:


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

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 (tức là không có bất kỳ tài liệu nào được lập chỉ mục).
reinaldoluckman

7
Có vẻ như chiến lược mới là sử dụng unmapped_type
lukmdo

2
Các truy vấn của tôi luôn hoạt động cho đến ngày hôm nay mà không cần cập nhật bất kỳ thư viện nào, v.v. nhưng hôm nay tôi bắt đầu gặp lỗi tương tự. Bây giờ tôi đã thêm "ignore_unmapped" : truevà nó bắt đầu hoạt động trở lại nhưng điều kỳ lạ là, những gì đã xảy ra đằng sau hậu trường! Ai biết! Dù sao, nó hoạt động ngay bây giờ. +1
BentCoder

1
Ai đó có thể làm rõ sự khác biệt giữa "mất tích" và "chưa được ánh xạ"? Đối với một trường nhất định, nếu một số tài liệu có nó trong khi những tài liệu khác thì không, trường đó có được coi là "thiếu" hoặc "chưa được ánh xạ" không? Có phải "thiếu" có nghĩa là trường có trong tài liệu nhưng giá trị tương ứng là null?
Sher10ck

43

Đối với những người đang tìm kiếm một ví dụ về cả hai ignore_unmappedunmapped_typevui lòng xem phản hồi của tôi tại đây .

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

Từ tài liệu: Trước 1.4.0 có tham số boolean lờ_unmapped, không đủ thông tin để quyết định các giá trị sắp xếp sẽ 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 người dùng được khuyến khích chuyển sang unmapped_type mới để thay thế.

Theo mặc định, yêu cầu tìm kiếm sẽ không thành công nếu không có ánh xạ nào được liên kết với một 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 theo chúng. Giá trị của tham số này được sử dụng để xác định các giá trị sắp xếp sẽ phát ra. Đâ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ỳ chỉ số nào được truy vấn không có ánh xạ giá thì Elasticsearch sẽ xử lý nó như thể có ánh xạ kiểu long, với tất cả tài liệu trong chỉ mục này không có giá trị cho trường này.


3

Rõ ràng ElasticSearch sẽ không sắp xếp trên các giá trị rỗng. Tôi đã giả định rằng nó sẽ coi là null ở đầu hoặc cuối (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 gặp lỗi này, bạn có thể cần đả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 + Tire vì cột sắp xếp không có giá trị mặc định, vì vậy đã được gửi đến ES dưới dạng null.

Sự cố này cho biết các giá trị null đang được xử lý, nhưng đó không phải là kinh nghiệm của tôi. Đó là một cái gì đó đáng để thử dù sao.


2

Tôi đã gặp vấn đề tương tự (sorta; sẽ gặp 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 đưa ra ở gốc (không chỉ định chỉ mục) và các lỗi tôi gặp phải là do tìm kiếm / thứ tự cũng tìm kiếm chỉ mục Kibana.

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


tôi gặp vấn đề tương tự .. nhưng khi tôi chỉ định bỏ qua không được ánh xạ, tôi không nhận được bất kỳ sắp xếp nào khi tìm kiếm thư mục gốc ... điều này hạn chế khả năng tìm kiếm của tôi nếu tôi phải xác định chỉ mục ... tôi chỉ muốn tất cả kết quả khớp lệnh được sắp xếp theo một lĩnh vực nếu nó tồn tại, và điền vào sử dụng mặc định cho những người dont .. EDIT:
mgoetzke

2

Elasticsearch 6.4

chỉ cần chỉ định chỉ mục và đó là nó trong Kibana

TRƯỚC

GET /_search
{
 
  "query": {
    "exists": {
      "field": "document_id"
    }
  },
  "sort": [
    {
      "document_id": { "order": "asc"  },
      "created_at":  { "order": "desc" }
    }
  ]
}

SAU

GET /document-index/contact/_search  (here)
{

  "query": {
    "exists": {
      "field": "document_id"
    }
  },
  "sort": [
    {
      "document_id": { "order": "asc"  },
      "created_at":  { "order": "desc" }
    }
  ]
}

1

nếu bạn đang sử dụng es 6.7

thử cái này

sort : ["title.keyword:desc"]

Nó đã giúp tôi - đàn hồi 7,3
mirik

0

Bạn cũng có thể sử dụng tập lệnh mang lại cho bạn sự linh hoạt:

"sort" : {
    "_script" : {
        "type" : "number",
        "script" : {
            "lang": "painless",
            "source": "return !doc['price'].empty ? doc['price'].value : 0"
        },
        "order" : "desc"
    }
}

0

Khi chúng ta sử dụng đoạn mã dưới đây, nơi added_on là ngày tháng, điều gì sẽ xảy ra !! văn bản thuộc tính được phân tích, nghĩa là nó được chia thành các từ riêng biệt khi được lưu trữ và cho phép tìm kiếm văn bản tự do trên một hoặc nhiều từ trong trường

vì vậy có "văn bản" và "từ khóa" được liên kết với các trường, vì vậy nếu chúng ta cần sử dụng kết hợp trong truy vấn, chúng ta cần giá trị trường nói chung là từ khóa.

BEFORE

"_source":{....}
"query" : {...}
"sort": [
{
  "added_on": {
    "order": "desc"
  }
}
]

AFTER
"_source":{....}
"query" : {...}
"sort": [
{
  "added_on.keyword": {
    "order": "desc"
  }
}
]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.