Domanda

Sto usando Sphinx con il plugin Thinking Sphinx per cercare i miei dati. Sto usando MySQL.

I miei dati contengono caratteri accentati (" & # 225; " ;, " & # 233; " ;, " & # 227; ") e voglio che siano equivalenti alle loro controparti non accentate ( "ad" a "ad esempio" durante la ricerca e l'ordinazione.

Ho fatto funzionare la ricerca usando una tabella charset (pastie.org/204316) e una ricerca di " AGUA " restituisce " & # 193; GUA " ;, ma l'ordinamento dei risultati non funziona correttamente. Nella ricerca di " AGUA " ;, " & # 193; GUA " arriva dopo "MUITA", ad esempio, ma volevo che fosse ordinato come se fosse scritto con un "A", non un "" & # 193;".

L'unica soluzione che posso pensare è indicizzare una nuova colonna contenente i caratteri non accentati e usarla per il sortering, usando REPLACE ( http://dev.mysql.com/doc/refman/5.4/en/string-functions.html#function_replace ) funzione mysql per eliminare i caratteri accentati, ma avrei bisogno di una chiamata a SOSTITUISCI per ogni possibile carattere accentato (e ce ne sono molti) e mi sembra una soluzione non molto significativa.

Qualcuno conosce un modo migliore per gestire questo problema?

Grazie!

È stato utile?

Soluzione

Sphinx gestisce l'ordinamento sui campi stringa archiviando tutti i valori in un elenco, ordinando l'elenco e quindi memorizzando l'indice di ogni stringa come attributo int. Secondo i documenti, l'ordinamento di questo elenco viene eseguito a livello di byte e attualmente non è configurabile.

Idealmente, le stringhe dovrebbero essere ordinate in modo diverso, a seconda della codifica e delle impostazioni locali. Ad esempio, se si sa che le stringhe sono testo russo nella codifica KOI8R, l'ordinamento dei byte 0xE0, 0xE1 e 0xE2 dovrebbe produrre 0xE1, 0xE2 e 0xE0, perché in KOI8R il valore 0xE0 codifica un carattere che è (notevolmente) dopo i caratteri codificati da 0xE1 e 0xE2. Sfortunatamente, Sphinx al momento non lo supporta e ordinerà semplicemente le stringhe per byte.

- da http://www.sphinxsearch.com/docs/current.html

Quindi, nessun modo semplice per raggiungere questo obiettivo in Sphinx. Una modifica alla tua idea basata su REPLACE () sarebbe quella di avere una colonna separata e popolarla usando un callback nel tuo modello. Ciò ti consentirebbe di gestire la sostituzione in Ruby anziché in MySQL, una soluzione probabilmente più gestibile.

# save an unaccented copy of your title. Normalise method borrowed from
# http://stackoverflow.com/questions/522715/removing-accents-diacritics-from-string-while-preserving-other-special-chars-tri
class MyModel < ActiveRecord::Base
  before_validation :update_sort_col

  private

  def update_sort_col
    sort_col = self.title.to_s.mb_chars.normalize(:kd).gsub(/[^-x00-\x7F]/n, '').to_s
  end
end

Altri suggerimenti

puoi anche usare un indice speciale per cui non hai nemmeno bisogno di una nuova colonna sul tuo db

indexes "LOWER(title)", :as => :title,  :sortable => true

è il sql grezzo in modo da poter chiamare il metodo di sostituzione.

Basta compilare l'indice sulla versione in minuscolo con la seguente sintassi. La sua soluzione molto semplice ed elegante per la ricerca senza distinzione tra maiuscole e minuscole utilizzando Sphinx .

indexes title, as: :title, sortable: :insensitive
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top