我有以下代码:
$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
之类的语法应返回与query
或field_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
。不是我想要的,导致在所有领域进行搜索。
答案 0 :(得分:1)
[total_found] => 0
说没有匹配。
单词数组,现在告诉您许多文档以及该单词出现在任何(和所有)字段中的次数。 (不考虑您的具体查询)
Sphinx会缓存这些单词统计信息,这有助于对查询进行快速的健全性检查。当查询运行时,它最终可能不匹配任何文档(因为只有这样才应用字段级别过滤器),即使找到了单个单词。
这解释了你对结果的错误解释,但不是为什么得到你得到的结果。
您正在输入扩展模式查询(由sphinx文档的链接证明),但sphinx API默认为所有查询模式。另请注意,标题和内容都在单词array中,因此被视为普通关键字而不是语法。
所以你需要包含一个
$this->api->SetMatchMode(SPH_MATCH_EXTENDED);
btw,@* test
,因为@*
在所有查询模式下都被忽略了。