2011-07-19 12 views
0

私は、ユーザーの検索を行うsphinx(php)対応の自動補完フィールドに取り組んでいます。私はいくつかの奇妙な状況に遭遇しています。Sphinx + php、予期しないクエリ結果で問題が発生する

私のユーザーがインデックスのフィールドは以下のとおりです。

'fullname', 
'username', 
'address', 
'phone', 
'email' 

いくつかの一般的な設定情報:次のように

charset_type = utf-8 
enable_star = 1 
min_infix_len = 3 
ignore_chars = U+20 

が私の現在のクエリが設定されています

$search = preg_replace('/([^\s]{3,})/', '*$1*', preg_replace('/[^a-z ]/i', '', $search)); 
$sphinx->SetMatchMode(SPH_MATCH_EXTENDED2); 
$sphinx->SetSortMode(SPH_SORT_RELEVANCE); 
$matches = $sphinx->Query($search . ' @email company.com', 'users'); 

問題が来ます次の検索パラメータを使用します。

John -> returns list of all Johns (GOOD!) 
John S -> returns nothing (BAD!) 
John St -> returns all John St*'s (GOOD!) 

同様に:

Ben -> returns all Ben's (GOOD!) 
Ben M -> returns nothing (BAD!) 
Ben Ma -> returns nothing (BAD!) 
Ben Mar -> returns user with Ben Mar*'s (GOOD!) 

は、もともと私は、姓と名がインデックスの異なる分野にあったので問題だったと思ったが、私はフルネームフィールドにそれらをマージしてきた今ことを、私はまだ正確に取得します同じ結果。

現在(上記のpreg_replace経由で)*に入力された各単語をラッピングしています。また、文字列全体を*、

$search = '*' . $search . '*'; 

とラップしてみましたが、あまり正確ではありません。私は幸運のないextended2以外の検索モードを試みました。 (それはちょっと悪化する)私は設定のスペースを無視するオプションを追加し、 "John S"のようなものを選ぶことを望みましたが、まだ運がありません。

ほとんどの人は、名前を入力して最後の頭文字を入力してユーザーを検索できるようにしたいと思っています。これは、ユーザーがユーザー名を検索しようとする一般的な方法ですが、現在はできません。

ご協力いただきありがとうございます。ありがとう!

EDIT:多くの検索で

私はこれが見つかりました:http://sphinxsearch.com/forum/view.html?id=5757

をスペースで検索する際にいくつかのバグ/矛盾があるかもしれないようです。しかし、もし誰かがアイデアを持っていればコメントしてください。ありがとう!

答えて

0

部分インデックスを有効にします。周り

ルック: min_infix_len min_prefix_len

+0

私はすでに「min_infix_len = 3」を使用しています「ジョン・セント」&「ジョン」仕事「はジョン・スターンズ」のようなものを探していたときにどのようにです。しかし、 "John S"は動作しません... – Johnzo

+0

min_infix_len = 1に設定してください – Jauzsika

関連する問題