让狮身人面像过滤搜索结果

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

表列包含一个id (数字), namedescription (这些都是全文索引;实际上还有一些,但为了简化问题...)和lang (语言标识符)。

索引无任何问题,我获得了简单搜索的正确结果。

然而,当我尝试查询指定单词的namedescription的同时,通过语言( 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:

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 ,使用不同的匹配模式等等,都是徒劳的。

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


为了方便起见,我建议将语言从字符串字段更改为整数属性。

所以,你的查询将如下所示:

$s->SetFilter('lang', array(1)); //1 - eng
$s->Query('yerba');

你有这个...

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

然后...

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

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

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

链接地址: http://www.djcxy.com/p/75263.html

上一篇: Getting Sphinx to filter search results

下一篇: can these mysql fulltext queries be optimized/changed to run faster?