我已安装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
[...]
}
除了db访问数据之外,所有其他选项都可以正常工作(对于非过滤查询),默认保留。
我一直试图破解这个坚果一段时间。我尝试将lang
声明为sql_attr_string
,使用不同的匹配模式等等,都是徒劳的。
我的索引设置是否错误?我在哪里搞砸了?
答案 0 :(得分:2)
为了简化操作,我建议将语言从字符串字段更改为整数属性。
因此,您的查询将如下所示:
$s->SetFilter('lang', array(1)); //1 - eng
$s->Query('yerba');
答案 1 :(得分:0)
你有这个......
$ result = $ s-&gt; query(“@ * yerba @lang eng”);
然后......
[words] => Array [yerba] => Array [pol] => Array
您确定它们是针对同一个查询吗? “pol”不在您的查询中
否则检查字形/异常,也许你正在以某种方式改变你的文字......?