Pregunta

Estoy usando Sphinx con el complemento Thinking Sphinx para buscar mis datos. Estoy usando MySQL.

Mis datos contienen caracteres acentuados (" & # 225; " ;, " & # 233; " ;, " & # 227; ") y quiero que sean equivalentes a sus homólogos no acentuados ( " a " ;, " e " ;, " a " ;, por ejemplo) al buscar y ordenar.

Comencé la búsqueda usando una tabla de juego de caracteres (pastie.org/204316), y una búsqueda de "AGUA" devuelve " & # 193; GUA " ;, pero el orden de los resultados no funciona correctamente. En una búsqueda de " AGUA " ;, " & # 193; GUA " viene después de '' MUITA '' GUA '', por ejemplo, pero quería que se clasificara como si estuviera escrito con una '' A '', no una '' ''. ''

La única solución que puedo pensar es indexar una nueva columna que contenga los caracteres no acentuados y usarla para la clasificación, usando REPLACE ( http://dev.mysql.com/doc/refman/5.4/en/string-functions.html#function_replace ) mysql function para quitar los caracteres acentuados, pero necesitaría una llamada para REEMPLAZAR por cada posible carácter acentuado (y hay muchos) y me parece una solución no muy fácil de mantener.

¿Alguien sabe alguna forma mejor de manejar este problema?

¡Gracias!

¿Fue útil?

Solución

Sphinx maneja la clasificación en campos de cadena almacenando todos los valores en una lista, ordenando la lista y luego almacenando el índice de cada cadena como un atributo int. Según los documentos, la clasificación de esta lista se realiza a nivel de byte y actualmente no es configurable.

Idealmente, las cadenas deben clasificarse de manera diferente, dependiendo de la codificación y la configuración regional. Por ejemplo, si se sabe que las cadenas son texto ruso en la codificación KOI8R, la ordenación de los bytes 0xE0, 0xE1 y 0xE2 debería producir 0xE1, 0xE2 y 0xE0, porque en el valor KOI8R 0xE0 codifica un carácter que está (notablemente) después de los caracteres codificados por 0xE1 y 0xE2. Desafortunadamente, Sphinx no lo admite en este momento y simplemente ordenará las cadenas por byte.

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

Entonces, no hay una manera fácil de lograr esto dentro de Sphinx. Una modificación a su idea basada en REPLACE () sería tener una columna separada y completarla utilizando una devolución de llamada en su modelo. Esto le permitiría manejar el reemplazo en Ruby en lugar de MySQL, una solución posiblemente más sostenible.

# 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

Otros consejos

también puede usar un índice especial para el que ni siquiera necesita una nueva columna en su base de datos

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

es sql sin procesar para que pueda llamar a su método de reemplazo.

Simplemente cree el índice en la versión en minúscula con la siguiente sintaxis. Es una solución muy simple y elegante para la búsqueda de mayúsculas y minúsculas utilizando Sphinx .

indexes title, as: :title, sortable: :insensitive
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top