2016-04-26 18 views
6

Ho un problema con una ricerca pertinente. I risultati della seguente richiesta sono molto strano:I risultati Searchkick non sono rilevanti

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

Perché Martina sta prima di Martin?

Searckick config:

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

hai mai trovato una soluzione a questo? Ho lo stesso problema con searchkick – rmcsharry

risposta

1

Searchkick 1.4 risolve questo problema. C'è anche un test case dedicato a questa domanda :)

1

Quando si utilizza word_start, ciò searchkick in realtà non è quello di tokenize i campi scelti (:first_name e :last_name) utilizzando il searchkick_word_start_index analyzer. Questo analizzatore è una consuetudine che utilizza la seguente edgeNGram filtro token:

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

Così, quando Kautzer Martina viene indicizzato, i seguenti token sono in realtà prodotte e indicizzati:

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

Analogamente, per Funk Martin:

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

Come si può vedere, durante la ricerca di martin, entrambi saranno abbinare sia perché contengono il token martin e saranno ordinate per decrescente il punteggio (default). Se volete ordinare i risultati in modo diverso, è possibile utilizzare l'ordinamento e chiamare il search con

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

Ok, ma cosa dovrei usare se voglio ottenere risultati rilevanti? In questo caso ho bisogno di avere tutti i record con Martin first_name all'inizio. Se lo ordinerò otterrò assolutamente un altro risultato: Candidate.search ('martin', campi: [: first_name,: last_name], match:: word_start, errori ortografici: false, ordine: [{last_name:: asc}, {first_name:: asc}]).Mappa (&: nome) [ "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

Poi si dovrebbe ordinare per first_name prima. Provalo. – Val

+0

Hai provato a cambiare l'ordinamento in ordine: [{first_name:: asc}, {last_name:: asc}] '? – Val

0

Prova questo errori di ortografia: {edit_distance: 0}

Il problema con la corrispondenza: è che devi abbinare il parola esatta e caps. Spero che funzioni.