在SphinxSearch(PHP)中搜索多个字段

时间:2013-08-13 12:37:15

标签: php indexing sphinx

我有以下代码:

$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;

根据their documentation@(field_1,field_2) query之类的语法应返回与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。不是我想要的,导致在所有领域进行搜索。

1 个答案:

答案 0 :(得分:1)

[total_found] => 0没有匹配。

单词数组,现在告诉您许多文档以及该单词出现在任何(和所有)字段中的次数。 (不考虑您的具体查询)

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


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

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

所以你需要包含一个

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

btw,@* test,因为@*在所有查询模式下都被忽略了。