2016-04-26 9 views
6

Ich habe ein Problem mit einer relevanten Suche. Die Ergebnisse der Anfrage folgende sind sehr seltsam:Searchkick Ergebnisse sind nicht relevant

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

Warum Martina wird früher als Martin?

Searckick config:

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

hast du jemals eine Lösung dafür bekommen? Ich habe das gleiche Problem mit searchkick – rmcsharry

Antwort

1

Searchkick 1.4 behebt dieses Problem. Es gibt sogar eine test case, die dieser Frage gewidmet ist :)

1

Wenn word_start verwenden, was searchkick tatsächlich tut, ist die gewählten Felder tokenize (:first_name und :last_name) die searchkick_word_start_index analyzer verwenden. Das Analysegerät ist ein Brauch ein, die die folgenden edgeNGram Token-Filter verwendet:

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

Also, wenn Kautzer Martina indiziert wird, werden die folgenden Token tatsächlich produziert und indiziert:

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

Auch für Funk Martin:

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

Wie Sie können, finden Sie, wenn Sie martin suchen, werden beide überein, da sowohl das Token martin enthalten, und sie werden durch absteigend Punktzahl (Standard) sortiert werden. Wenn Sie die Ergebnisse anders bestellen möchten, können Sie Sortierung verwenden und rufen Sie Ihren search mit

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

Ok, aber was soll ich verwenden, wenn ich relevante Ergebnisse erhalten möchte? In diesem Fall muss ich alle Datensätze mit Martin first_name am Anfang haben. Wenn ich es sortiere, bekomme ich absolut ein anderes Ergebnis: Candidate.search ('martin', Felder: [: first_name,: last_name], Übereinstimmung:: word_start, Rechtschreibfehler: false, Reihenfolge: [{last_name:: asc}, {erster_name:: asc}]).Karte (&: Name) [ "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

Dann sollten Sie von first_name zuerst bestellen. Versuch es. – Val

+0

Haben Sie versucht, die Sortierreihenfolge in 'order: [{first_name:: asc}, {last_name:: asc}]' zu ändern? – Val

0

testen Fehlbuchstabierungen: {edit_distance: 0}

Das Problem mit Spiel: ist, müssen Sie das Match genaues Wort und Großbuchstaben. Ich hoffe, das funktioniert.

Verwandte Themen