2016-04-26 4 views
6

У меня есть проблема с соответствующим поиском. Результаты следующего запроса очень странно:Результаты поиска не актуальны

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

Почему Martina происходит раньше, чем Мартин?

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 на самом деле делает это разметить выбранные поля (:first_name и :last_name) с помощью searchkick_word_start_index analyzer. Этот анализатор является обычаем один, который использует следующий edgeNGram токенов фильтр:

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

Так что, когда Kautzer Martina индексируются следующие маркера фактически производятся и индексированные:

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

Аналогично, для Funk Martin:

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

Как вы можете видеть, при поиске martin, как будет соответствовать, потому что оба содержат маркер martin и они будут отсортированы по убыванию оценки (по умолчанию). Если вы хотите заказать результаты по-разному, вы можете использовать сортировку и звоните search с

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

Хорошо, но что я должен использовать, если хочу получить соответствующие результаты? В этом случае мне нужно иметь все записи с первым именем Martin в начале. Если я его сортирую, я получу совсем другой результат: Candidate.search ('martin', поля: [: first_name,: last_name], match:: word_start, misspellings: false, order: [{last_name:: asc}, {first_name:: asc}]).карта (&: название) [ "Бартелл Martina", "Бой Martina", "Дул Мартин", "Emard Martine", "Ernser Martina", "Funk Мартин", "Герла Martine", "Зеленый Martina", "Зеленый Martine", "Гутман Martine", "Hoppe Мартин", "Jaskolski Мартин", ...] – rkotov93

+0

Тогда вы должны заказать по first_name первым. Попробуйте. – Val

+0

Вы пытались изменить порядок сортировки на 'order: [{first_name:: asc}, {last_name:: asc}]'? – Val

0

Попробуйте это опечаток: {edit_distance: 0}

Проблемы с матчем: это вы должны соответствовать точное слово и шапки. Надеюсь, это сработает.