我安装Sphinx的目的是使用它在MySQL
表格 ( InnoDB
) 上进行全文搜索。
表列由id
(数字)name
和description
(这些都被全文索引;实际上还有更多,但为了简化问题......)和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
是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
[...]
}
所有其他选项,除了数据库访问数据,正如我所说的(对于非过滤查询)工作正常,都保留为默认值。
一段时间以来,我一直试图破解这个坚果。我尝试声明lang
为sql_attr_string
,使用不同的匹配模式等,唉,一切都是徒劳的。
我的索引设置错误吗?我在哪里搞砸了?