2016-04-26 83 views
6

我遇到相關搜索存在問題。下面的請求的結果是很奇怪:Searchkick結果不相關

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"] 

爲什麼瑪蒂娜比馬丁早點去?

Searckick配置:

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

你有沒有得到解決這個問題?我與searchkick有同樣的問題 – rmcsharry

回答

1

Searchkick 1.4修復了這個問題。甚至有一個test case致力於這個問題:)

1

當使用word_start,什麼searchkick實際上做的是使用searchkick_word_start_index analyzer來標記選擇的領域(:first_name:last_name)。即分析器是使用以下edgeNGram令牌濾波器的自定義之一:

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

所以,當Kautzer Martina被編入索引,下面的令牌被實際產生和索引:

  • :first_namemmamarmartmartimartinmartina
  • :last_namekkakaukautkautzkautzekautzer

類似地,對於Funk Martin

  • :first_namemmamarmartmartimartin
  • :last_nameffufunfunk

正如你所看到的,對於martin搜索時,都將匹配,因爲兩者都包含令牌martin,他們將通過降分(默認值)進行排序。如果你想以不同的排序結果,你可以使用排序,並致電search

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

好的,但如果我想獲得相關結果,我應該使用什麼? 在這種情況下,我需要在開頭使用Martin first_name的所有記錄。如果我排序它,我會得到絕對的另一個結果: Candidate.search('martin',fields:[:first_name,:last_name],match :::word_start,拼寫錯誤:false,順序:[{last_name :: asc}, {first_name::asc}])。地圖(:名稱) [ 「巴特爾馬丁娜」, 「伯姆馬丁娜」, 「杜利馬丁」, 「Emard馬丁」, 「Ernser馬丁娜」, 「芬克馬丁」, 「Gerlach的馬丁」, 「綠色瑪蒂娜」, 「綠色馬丁」, 「古特曼馬丁」, 「霍普·馬丁」, 「Jaskolski馬丁」, ...] – rkotov93

+0

那麼你應該通過FIRST_NAME首份訂單。試試看。 – Val

+0

您是否嘗試將排序順序更改爲'order:[{first_name :: asc},{last_name :: asc}]'? – Val

0

試試這個 拼寫錯誤:{edit_distance:0}

與匹配的問題:是你必須匹配確切的詞,和帽子。 我希望這可以工作。