让Sphinx过滤搜索结果

时间:2012-11-20 10:03:50

标签: php mysql sphinx full-text-search

我已安装Sphinx,目的是将其用于MySQL表(InnoDB)上的全文搜索。

表格列由id(数字),namedescription组成(这些都是全文索引;实际上还有更多,但是为了简化问题...)和lang(语言标识符)。

索引经过没有问题,我得到了正确的搜索结果。

但是,当我尝试在按语言(name)过滤结果的同时查询descriptionlang指定的字词时,我遇到了麻烦。

我基本上想要达到等效(比如搜索过的短语是' 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
    [...]
}

除了db访问数据之外,所有其他选项都可以正常工作(对于非过滤查询),默认保留。

我一直试图破解这个坚果一段时间。我尝试将lang声明为sql_attr_string,使用不同的匹配模式等等,都是徒劳的。

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

2 个答案:

答案 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”不在您的查询中

否则检查字形/异常,也许你正在以某种方式改变你的文字......?