テーブルの全文検索に使用する目的でSphinxをインストールしました ( )。MySQL
InnoDB
テーブル列はid
(数値)name
とdescription
(これらは両方とも全文索引付けされます。実際にはもう少しありますが、質問を簡単にするために...) とlang
(言語識別子) で構成されます。
インデックス作成は問題なく行われ、単純な検索で正しい結果が得られます。
name
ただし、クエリを実行しようとするとすぐに問題が発生しdescription
、結果を言語でフィルタリングしているときに指定された単語を検索します ( lang
)。
私は基本的に(検索されたフレーズが「yerba」だったと言います)と同等のものを達成したいと思います:
SELECT * FROM products
WHERE MATCH('yerba') AGAINST(name, description)
AND 'lang' == 'eng'
野心的すぎるわけではありませんが、間違った結果を出し続けているので、何かが欠けているに違いありません。Sphinx の PHP API を使用しています。
$s = new SphinxClient();
$db = new DB();
$s->setServer('192.168.2.57', 9312);
$s->setMatchMode(SPH_MATCH_EXTENDED2);
$result = $s->query("@* yerba @lang eng");
print (count($result['matches']));
var_dump($s->GetLastError(),$s->GetLastWarning());
print '<pre>';
print_r($result);
print '</pre>';
20 件の一致が返されます。
20
string '' (length=0) // no error
string '' (length=0) // no warning
Array
(
[error] =>
[warning] =>
[status] => 0
[fields] => Array
(
[0] => lang
[1] => name
[2] => description
// snip...
)
[attrs] => Array
(
[lang] => 7
)
[matches] => Array
(
[568] => Array
(
[weight] => 6640
[attrs] => Array
(
[lang] => spa
)
)
[234] => Array
(
[weight] => 6630
[attrs] => Array
(
[lang] => pol
)
)
// snip
[total] => 44
[total_found] => 44
[time] => 0.000
[words] => Array
(
[yerba] => Array
(
[docs] => 44
[hits] => 238
)
[pol] => Array
(
[docs] => 715
[hits] => 772
)
)
)
lang
見つかった最初のレコードでis がspa
ではないことに気付くのは非常に簡単eng
です。
どうして??
構成ファイル ( sphinx.conf
) は以下のようになります -ソース:
source src1
{
[...]
sql_query = \
SELECT id, lang, name, description // snip! \
FROM my_table
[...]
sql_field_string = lang
[...]
}
索引:
index test1
{
source = src1
[...]
min_word_len = 1
[...]
}
私が言ったように(フィルタリングされていないクエリの場合)正常に機能するdbアクセスデータを除いて、他のすべてのオプションはデフォルトのままです。
私はしばらくの間、このナッツを割ろうとしてきました。lang
残念ながら、さまざまなマッチモードなどを使用して として宣言しようとしましたsql_attr_string
が、すべて無駄でした。
インデックス作成の設定が間違っていますか? ここで私はどこを台無しにしましたか?