0

我安装Sphinx的目的是使用它在MySQL表格 ( InnoDB) 上进行全文搜索。

表列由id(数字)namedescription(这些都被全文索引;实际上还有更多,但为了简化问题......)和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
                )

        )

)

很容易注意到,在它发现的第一条记录中,langspa,不是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
    [...]
}

所有其他选项,除了数据库访问数据,正如我所说的(对于非过滤查询)工作正常,都保留为默认值。

一段时间以来,我一直试图破解这个坚果。我尝试声明langsql_attr_string,使用不同的匹配模式等,唉,一切都是徒劳的。

我的索引设置错误吗?我在哪里搞砸了?

4

2 回答 2

2

为了使事情更容易,我建议将语言从字符串字段更改为整数属性。

因此,您的查询将如下所示:

$s->SetFilter('lang', array(1)); //1 - eng
$s->Query('yerba');
于 2012-11-21T08:27:52.967 回答
0

你有这个...

$result = $s->query("@* yerba @lang eng");

然后...

[words] => Array
       [yerba] => Array
       [pol] => Array

你确定它们是针对同一个查询的吗?“pol”不在您的查询中

否则检查wordforms/exceptions,也许你正在以某种方式转换你的文本......?

于 2012-11-20T10:51:21.580 回答