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;

根据他们的文档,类似的语法@(field_1,field_2) query应该返回与 or 中的字符串匹配queryfield_1文档field_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 数组现在只是告诉您有多少文档以及该单词在 ANY(和所有)字段中出现的次数。(不考虑您的具体查询)

Sphinx 缓存了这些词的统计信息,这有助于它对查询进行快速的健全性检查。当查询运行时,它最终可能不匹配任何文档(因为只有这样它才会应用字段级过滤器),即使找到了单个单词。


这解释了你对结果的误解,但不能解释为什么要得到你得到的结果。

您正在输入扩展模式查询(由 sphinx 文档的链接证明),但 sphinx API 默认为 ALL 查询模式。另请注意,标题和内容在 words 数组中,因此被视为普通关键字而不是语法。

所以你需要包括一个

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

顺便说一句, @* test, 因为@*在 ALL 查询模式下被简单地忽略了。

于 2013-08-13T13:03:43.407 回答