2011-12-06 7 views
0

Rails 3.1環境でthink-sphinx 2.0.10を実行していて、インデックス作成と検索がうまく機能します。 私のユーザーモデルで検索しているときに、ユーザーの名前にワイルドカード検索を行いたいが、メールではなく、特定の検索文字列がユーザーの電子メールと完全に一致する場合にのみユーザーに返す必要がある。 私はいくつかの研究を行なったし、これはSphinxの考え方 - 特定のインデックスのみのワイルドカード検索

set_property :enable_star => true 
set_property :min_infix_len => 1 

でdefine_indexブロック内のワイルドカード検索を可能にし、これは

define_index do 

 indexes "CONCAT(first_name, ' ', last_name)", :as => :user_name,  :infixes => true 
 indexes email 

   has :id, :as => :user_id 
    
   set_property :enable_star => true 
   set_property :min_infix_len => 1 
end 

をワイルドカード検索をサポートしなければならないインデックスに:infixes => trueを追加することによって行うことができることが分かりました自動生成されたdevelopment.sphinx.confから

index user_core 
{ 
 source = user_core_0 
 path = /../../../../db/sphinx/development/user_core 
 charset_type = utf-8 
 min_infix_len = 1 
 infix_fields = user_name 
 enable_star = 1 
} 

infix_fieldsはcorre宣言されていますctly私は推測する。

問題は、「.com」を検索しても、.com電子メールアドレスを持つすべてのユーザーが取得できることです。 その理由は何ですか?

ありがとうございました!

答えて

3

スフィンクスは入力内の単語を索引付けします。通常、単語全体のみですが、中置/接頭辞付きの部分語を使用可能にすることができます。

とにかく、charset_tableで定義されていないもの(デフォルトのものはありません)は、セパレータです。

だから "。"セパレータです。あなたの電子メールは単語として索引付けされます。 "com"はそれ自身の言葉です。

".com"を検索すると、単に "com"を検索するだけです。つまり、まだ完全な単語一致です。

"。"これを解決するために文字セットテーブルに追加します。 (ただし、データのセパレータとして使用されているかどうかは注意してください。インデックス名と電子メールだけでは問題にならないかもしれません)。 @を追加して、電子メール全体を1つの「単語」として索引付けすることもできます。私はそれをあなたのルビーの設定を置く方法を知らない


、私はちょうどそれがスフィンクスconfファイルで終わる必要がある知っています。

+0

ありがとうございました! @とを含むデフォルトの文字セットを定義することができました。 config/sphinx.ymlの中にあり、すべては現在動作しています:) – alex

関連する問題