0

SphinxQL を使用して Sphinxsearch エンジンにクエリを実行しています。次のようにphp APIに実装されているSPH_MATCH_ANYをシミュレートしたい:

$cl->SetMatchMode(SPH_MATCH_ANY);
$cl->Query("test query", "index");

=> 「test」または「query」に一致するドキュメントを検索

そのため、SphinxQL で使用するために、スペースやその他の特殊文字をパイプ (|) に置き換える関数 (php) を作成しました。

function formatQuery($str) {
   return trim(preg_replace('/[^-_\'a-z0-9]+/', '|', $str), ' |');
}

$str = "test query";
$sql = "SELECT * FROM index WHERE MATCH('" . addslashes(formatQuery($str)) . "')";

=> SELECT * FROM インデックス WHERE MATCH('テスト|クエリ');

問題は、- (マイナス) のような一部の文字の場合、クエリが壊れる可能性があることです。例:

$str = "i-phone is great";
$sql = "SELECT * FROM index WHERE MATCH('" . addslashes(formatQuery($str)) . "')";

=> SELECT * FROM index WHERE MATCH('i-phone|is|great')

=>わかりました

$str = "i - phone is great";
$sql = "SELECT * FROM index WHERE MATCH('" . addslashes(formatQuery($str)) . "')";

=> SELECT * FROM index WHERE MATCH('i|-|phone|is|great')

=> "|-|" が原因でクエリが壊れている

SphinxQL クエリを SPH_MATCH_ANY モードで動作させるためのより良い方法を知っていますか? または、すべてのケースで機能するようにするためのより良い正規表現ですか?

次のようなより制限的な正規表現を使用できることはわかっています。

preg_replace('/[^a-z0-9]+/', '|', $str)

しかし、「i|phone|is|great」で「i-phone is great」のように文字列を分割するので、それはしたくありません...

ありがとう、ニコ

4

2 に答える 2

0

他のオプションは

$query = preg_replace('/(\w+?)[-\'](\w+?)/','$1~$2',$query);
$query = preg_replace('/[^\w\~]+/','|',$query);
$query = preg_replace('/(\w+~\w[\w~]*)/e','"\"".str_replace("~"," ","$1")."\""',$query);

それを句に変える。

于 2012-10-03T13:42:42.267 に答える
0

1つの方法は、quoromを使用することです

$sql = "SELECT * FROM index WHERE MATCH('\"" . addslashes($str) . "\"/1')";

- を charset_table tho に追加する必要があるため、単語の一部になります。

于 2012-10-03T13:32:54.057 に答える