Frage

Ich verwende Sphinx mit dem Denken Sphinx-Plugin meiner Daten zu suchen. Ich verwende MySQL.

Meine Daten enthält akzentuierte Zeichen ( „A“, „E“, „A“) und ich möchte, dass sie ihre nicht-akzentuiert Kollegen gleichwertig sein ( „a“, „e“, „a“, zum Beispiel) bei der Suche und Bestellung.

habe ich die Suche eine charset Tabelle arbeitet mit (pastie.org/204316) und einer Suche nach „agua“ returns „agua“, aber die Reihenfolge der Ergebnisse nicht richtig funktioniert. Bei der Suche nach „agua“, „agua“ Cames nach „muita ÁGUA“, zum Beispiel, aber ich wollte es sortiert werden, als ob sie mit einem „A“ geschrieben wurden, nicht ein „A“.

Die einzige Lösung, die ich denken kann, ist Index eine neue Spalte, die nicht-akzentuierte Zeichen und deren Verwendung für Sortering enthält, mit der REPLACE ( http://dev.mysql.com/doc/refman/5.4/en/string-functions.html#function_replace ) mysql-Funktion akzentuierten Zeichen abzustreifen, aber ich würde ein Anruf benötigen für jede mögliche akzentuierte Zeichen REPLACE (und es gibt viele), und es scheint mir nicht sehr maintanable Abhilfe.

Jeder weiß etwas besseren Weg, um dieses Problem zu umgehen?

Danke!

War es hilfreich?

Lösung

Sphinx Griffe an String-Felder Sortieren durch alle Werte in eine Liste zu speichern, um die Liste sortiert und dann den Index jedes Strings als int-Attribut speichert. Nach der Dokumentation wird die Sortierung dieser Liste in einer Byte-Ebene und ist derzeit nicht konfiguriert werden.

Im Idealfall sollte die Saiten unterschiedlich sortiert werden, abhängig von der Codierung und locale. Zum Beispiel sind bekannt, wenn die Saiten russischer Text in Koi8-R-Codierung sein, Sortieren des Bytes 0xE0, 0xE1 und 0xE2 sollte 0xE1, 0xE2 und 0xE0, weil in Koi8-R-Wert 0xE0 ein Zeichen codiert, das (merklich) wird, nachdem Zeichen produzieren, kodiert durch 0xE1 und 0xE2. Leider Sphinx nicht unterstützt, dass der Moment an und wird einfach sortieren die Saiten byteweise.

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

Also, keine einfache Möglichkeit, diese innerhalb Sphinx zu erreichen. Eine Änderung Ihrer REPLACE () auf der Basis Idee wäre, eine eigene Spalte zu haben, und füllt es einen Rückruf in Ihrem Modell. Dies würden Sie die ersetzen in Ruby anstelle von MySQL behandeln, eine wohl besser verwaltbar Lösung.

# 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

Andere Tipps

Sie können auch einen speziellen Index für das verwenden Sie nicht brauchen auch eine neue Spalte auf Ihrer db

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

seine rohe SQL so können Sie rufen Sie ersetzen Methode.

Just bauen Index für Kleinbuchstaben Version mit Syntax folgt. Seine sehr einfache und elegante Lösung für case insensitive Suche mit Sphinx.

indexes title, as: :title, sortable: :insensitive
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top