4

ThinkingSphinxプラグインでSphinxを使用してデータを検索しています。MySQLを使用しています。

私のデータにはアクセント付きの文字( "á"、 "é"、 "ã")が含まれており、検索時にアクセントのない文字( "a"、 "e"、 "a"など)と同等にする必要があります。注文。

文字セットテーブル(pastie.org/204316)を使用して検索を機能させ、「AGUA」を検索すると「ÁGUA」が返されますが、結果の順序が正しく機能していません。たとえば、「AGUA」の検索では、「ÁGUA」は「MUITAÁGUA」の後にありますが、「Á」ではなく「A」で書かれたように並べ替えたいと思いました。

私が考えることができる唯一の解決策は、REPLACE( http://dev.mysql.com/doc/refman/5.4/en/string-functions.html)を使用して、アクセントのない文字を含む新しい列にインデックスを付け、それを並べ替えに使用することです。#function_replace)アクセント付き文字を削除するmysql関数ですが、可能なアクセント付き文字ごとにREPLACEを1回呼び出す必要があり(多くあります)、あまり保守しにくい回避策のようです。

誰かがこの問題を処理するためのより良い方法を知っていますか?

ありがとう!

4

3 に答える 3

3

Sphinxは、すべての値をリストに格納し、リストをソートしてから、各文字列のインデックスをint属性として格納することにより、文字列フィールドのソートを処理します。ドキュメントによると、このリストの並べ替えはバイトレベルで行われ、現在は構成できません。

理想的には、文字列は、エンコーディングとロケールに応じて、異なる方法でソートする必要があります。たとえば、文字列がKOI8Rエンコーディングでロシア語のテキストであることがわかっている場合、バイト0xE0、0xE1、および0xE2を並べ替えると、0xE1、0xE2、および0xE0が生成されます。 0xE1および0xE2。残念ながら、Sphinxは現時点ではそれをサポートしておらず、文字列をバイト単位で並べ替えるだけです。

--http://www.sphinxsearch.com/docs/current.htmlから

したがって、Sphinx内でこれを実現する簡単な方法はありません。REPLACE()ベースのアイデアを変更するには、別の列を作成し、モデルのコールバックを使用してその列にデータを入力します。これにより、MySQLの代わりにRubyで置換を処理できるようになります。これは、間違いなくより保守しやすいソリューションです。

# 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
于 2009-06-22T23:49:44.760 に答える
1

データベースに新しい列を追加する必要がない特別なインデックスを使用することもできます

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

その生のSQLなので、replaceメソッドを呼び出すことができます。

于 2011-01-19T22:29:55.000 に答える
0

次の構文を使用して、小文字バージョンでインデックスを作成するだけです。case insensitiveを使用した検索のための非常にシンプルでエレガントなソリューションSphinx

indexes title, as: :title, sortable: :insensitive
于 2016-08-04T06:31:22.300 に答える