2016-04-26 34 views
6

Tôi gặp sự cố với tìm kiếm có liên quan. Kết quả của yêu cầu sau đây rất lạ:Kết quả tìm kiếm không phù hợp

Candidate.search('martin', fields: [:first_name, :last_name], 
          match: :word_start, misspellings: false).map(&:name) 


["Kautzer Martina", 
"Funk Martin", 
"Jaskolski Martin", 
"Gutmann Martine", 
"Wiegand Martina", 
"Schueller Martin", 
"Dooley Martin", 
"Stiedemann Martine", 
"Bartell Martina", 
"Gerlach Martine", 
"Green Martina", 
"Lang Martine", 
"Legros Martine", 
"Ernser Martina", 
"Boehm Martina", 
"Green Martine", 
"Nolan Martin", 
"Schmidt Martin", 
"Hoppe Martin", 
"Macejkovic Martine", 
"Emard Martine"] 

Tại sao Martina sẽ sớm hơn Martin?

Searckick config:

searchkick language: %w(German English), word_start: [:first_name, :last_name] 
+0

bạn đã bao giờ nhận được giải pháp cho điều này chưa? Tôi gặp vấn đề tương tự với searchkick – rmcsharry

Trả lời

1

Searchkick 1.4 khắc phục sự cố này. Thậm chí còn có một số test case dành riêng cho câu hỏi này :)

1

Khi sử dụng word_start, những gì searchkick thực sự không có gì để tokenize các lĩnh vực được lựa chọn (:first_name:last_name) sử dụng searchkick_word_start_index analyzer. phân tích đó là một tùy chỉnh trong đó sử dụng các edgeNGram lọc mã thông báo sau:

  searchkick_edge_ngram: { 
      type: "edgeNGram", 
      min_gram: 1, 
      max_gram: 50 
      }, 

Vì vậy, khi Kautzer Martina được lập chỉ mục, các thẻ sau đây đang thực sự sản xuất và lập chỉ mục:

  • :first_name: m, ma, mar , mart, marti, martin, martina
  • :last_name: k, ka, kau, kaut, kautz, kautze, kautzer

Tương tự như vậy, đối với Funk Martin:

  • :first_name: m, ma, mar, mart, marti, martin
  • :last_name: f, fu, fun, funk

Như bạn có thể thấy, khi tìm kiếm martin, cả hai sẽ phù hợp vì cả hai đều chứa token martin và họ sẽ được sắp xếp theo giảm dần số điểm (mặc định). Nếu bạn muốn đặt hàng các kết quả khác nhau, bạn có thể sử dụng phân loại và gọi bạn search với

order: [{last_name: :asc},{first_name: :asc}] 
+0

Ok, nhưng tôi nên sử dụng thông tin gì nếu tôi muốn nhận kết quả có liên quan? Trong trường hợp này, tôi cần phải có tất cả hồ sơ với Martin first_name ngay từ đầu. Nếu tôi sắp xếp, tôi sẽ nhận được kết quả hoàn toàn khác: Candidate.search ('martin', các trường: [: first_name,: last_name], match:: word_start, lỗi chính tả: false, order: [{last_name:: asc}, {first_name:: asc}]).bản đồ (&: tên) [ "Bartell Martina", "Boehm Martina", "Dooley Martin", "Emard Martine", "Ernser Martina", "Funk Martin", "Gerlach Martine", "Green Martina", "Green Martine", "Gutmann Martine", "Hoppe Martin", "Jaskolski Martin", ...] – rkotov93

+0

Sau đó, bạn nên đặt hàng qua first_name đầu tiên. Hãy dùng thử. – Val

+0

Bạn đã cố thay đổi thứ tự sắp xếp thành 'thứ tự: [{first_name:: asc}, {last_name:: asc}]'? – Val

0

Hãy thử điều này lỗi chính tả: {edit_distance: 0}

Vấn đề với trận đấu: là bạn phải phù hợp với chính xác từ và mũ. Tôi hy vọng điều này hoạt động.

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