0

テーブルの全文検索に使用する目的でSphinxをインストールしました ( )。MySQLInnoDB

テーブル列はid(数値)namedescription(これらは両方とも全文索引付けされます。実際にはもう少しありますが、質問を簡単にするために...) と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が、すべて無駄でした。

インデックス作成の設定が間違っていますか? ここで私はどこを台無しにしましたか?

4

2 に答える 2

0

あなたはこれを持っています...

$result = $s->query("@* yerba @lang eng");

それから...

[words] => Array
       [yerba] => Array
       [pol] => Array

それらが同じクエリ用であることは確かですか? 「pol」はクエリにありません

それ以外の場合は、ワードフォーム/例外を確認してください。おそらく、何らかの方法でテキストを変換しています...?

于 2012-11-20T10:51:21.580 に答える