0

次のコードがあります。

$this->api = new App_Other_SphinxSearch();
$this->api->SetServer($host, $port);
$this->api->SetConnectTimeout(1);
$this->api->SetArrayResult(true);
$results = $this->api->Query("@(title,content) test", 'members');

echo "<pre>";print_r($results);die;

ドキュメントによると、構文 likeは、 またはのいずれかの文字列に一致@(field_1,field_2) queryするドキュメントを返す必要があります。queryfield_1field_2

PHP SDK は、まったく異なるものを返します。

Array
(
    [error] => 
    [warning] => 
    [status] => 0
    [fields] => Array
        (
            [0] => title
            [1] => content
        )

    [attrs] => Array
        (
            [created] => 2
            [content] => 7
        )

    [total] => 0
    [total_found] => 0
    [time] => 0.000
    [words] => Array
        (
            [title] => Array
                (
                    [docs] => 10
                    [hits] => 34
                )

            [content] => Array
                (
                    [docs] => 34
                    [hits] => 139
                )

            [test] => Array
                (
                    [docs] => 26
                    [hits] => 34
                )

        )

)

配列にキーはありませんmatchesが、いくつかヒットしました。なぜこれが起こっているのかよくわかりません。特に、コマンド ラインから同じクエリを実行すると、すべてが正しく機能するためです。

何か助けはありますか?

編集:このようなクエリは機能します: @* test. 私が望むものではありませんが、すべてのフィールドを検索します。

4

1 に答える 1

1

[total_found] => 0一致しない場所があると言います。

words 配列は、多くのドキュメントと、その単語が任意の (およびすべての) フィールドに出現する回数を示すだけです。(特定のクエリに関係なく)

Sphinx はこれらの単語の統計をキャッシュするため、クエリのサニティ チェックを迅速に行うことができます。クエリを実行すると、個々の単語が見つかったとしても、最終的にどのドキュメントとも一致しない可能性があります (フィールド レベルのフィルターが適用されるのはそのときだけであるため)。


これは、結果の誤解を説明していますが、なぜ結果が得られるのかは説明していません。

拡張モード クエリを入力しています (sphinx ドキュメントへのリンクで証明されているように) が、sphinx API はデフォルトで ALL クエリ モードに設定されています。また、タイトルとコンテンツは単語配列に含まれているため、構文ではなく単純なキーワードと見なされていることにも注意してください。

したがって、含める必要があります

$this->api->SetMatchMode(SPH_MATCH_EXTENDED);

ところで、すべてのクエリモードでは単純に無視される@* testため、機能します。@*

于 2013-08-13T13:03:43.407 に答える