Pergunta

Eu estou usando Esfinge com o pensamento Esfinge plugin para procurar os meus dados. Estou usando o MySQL.

Os meus dados contém caracteres acentuados ( "a", "e", "A") e eu quero que eles sejam equivalentes aos seus homólogos não-acentuada ( "a", "e", "a", por exemplo) na busca e ordenação.

Eu tenho a busca de trabalho usando uma tabela charset (pastie.org/204316), e uma busca por retornos "Água" "Água", mas a ordenação dos resultados não está funcionando corretamente. Em uma busca por "Água", cames "Água" depois "MUITA ÁGUA", por exemplo, mas eu queria que fosse classificado como se fosse escrito com um "A", não um "A".

A única solução que pode pensar é um novo índice de coluna que contém os caracteres não-acentuado e usá-lo para sortering, utilizando o SUBSTITUIR ( http://dev.mysql.com/doc/refman/5.4/en/string-functions.html#function_replace ) função mysql noreferrer nofollow para remover os caracteres acentuados, mas eu precisaria de uma chamada para REPLACE para cada possível caractere acentuado (e são muitos) e parece-me uma solução alternativa não muito maintanable.

Alguém sabe alguma maneira melhor de lidar com esta questão?

Obrigado!

Foi útil?

Solução

alças esfinge de classificação em campos de cordas, armazenando todos os valores em uma lista, ordenar a lista e, em seguida, armazenar o índice de cada cabo, como um atributo int. De acordo com os documentos a classificação desta lista é feito em um nível de byte e, atualmente, não é configurável.

Idealmente as cordas devem ser classificadas de forma diferente, dependendo da codificação e localidade. Por exemplo, se as cordas são conhecidos por serem texto russo em codificação KOI8R, classificando os bytes 0xE0, 0xE1, e 0xE2 deve produzir 0xE1, 0xE2 e 0xE0, porque no valor KOI8R 0xE0 codifica um caracter que é (visivelmente) depois de caracteres codificados pela 0xE1 e 0xE2. Infelizmente, Esfinge não suporta que no momento e simplesmente tipo as cordas Bytewise.

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

Assim, não há maneira fácil de conseguir isso dentro Esfinge. Uma modificação para a sua ideia com base REPLACE () seria ter uma coluna separada e preenchê-lo usando uma chamada de retorno no seu modelo. Isso iria deixá-lo lidar com a substituir em Ruby em vez do MySQL, uma solução comprovadamente mais sustentável.

# 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

Outras dicas

Você também pode usar um índice especial para que você não precisa nem de uma nova coluna em seu db

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

sua sql matéria para que você pode chamar o seu substituir método.

Apenas índice de construção na parte inferior versão caso com seguinte sintaxe. Sua solução muito simples e elegante para pesquisa case insensitive usando Sphinx.

indexes title, as: :title, sortable: :insensitive
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top