SphinxSearch完全匹配排名

时间:2015-03-16 09:37:40

标签: search sphinx

我注意到在使用Sphinx 2.2.8的排序顺序中有一个奇怪的行为(与v2.3.1-beta相同)。

我希望精确匹配出现在第一个位置(我为此设置了index_exact_words和expan_keywords)。

这对我下面的第一个例子有两行效果很好。但是如果我添加更多行,权重会更改,我的完全匹配结果(id = 1)会比其他近似值更低!

例如,索引这两个单词(一些带有形态学libstemmer_fr的法语单词):

source nptest
{
        type                    = pgsql
        sql_host                = localhost
        sql_user                = myuser
        sql_pass                = mypassword
        sql_db                  = mydb
        sql_port                = 5432

        sql_query               = \
                                  SELECT 1, 'chien' AS val \
                                  UNION \
                                  SELECT 2, 'chienne'

        sql_field_string = val
}

index nptest
{
        type                    = plain
        mlock                   = 1
        source                  = nptest
        path                    = /var/lib/sphinx/data/nptest
        morphology              = libstemmer_fr
        index_exact_words       = 1
        expand_keywords         = 1
}

索引后(indexer --rotate nptest):

mysql> SELECT id, val, weight() FROM nptest WHERE match('chien');
+------+---------+----------+
| id   | val     | weight() |
+------+---------+----------+
|    1 | chien   |     1500 |
|    2 | chienne |     1428 |
+------+---------+----------+
2 rows in set (0.00 sec)

“chien”一词的排名高于“chienne”=>这就是我的预期。

现在我向db添加更多行:

source nptest
{
        type                    = pgsql
        sql_host                = localhost
        sql_user                = myuser
        sql_pass                = mypassword
        sql_db                  = mydb
        sql_port                = 5432

        sql_query               = \
                SELECT 1, 'chien' AS val \
                UNION \
                SELECT 2, 'chienne' \
                UNION \
                SELECT 3, 'un beau chien' \
                UNION \
                SELECT 4, 'chien-loup'

        sql_field_string = val
}


mysql> SELECT id, val, weight() FROM nptest WHERE match('chien');
+------+---------------+----------+
| id   | val           | weight() |
+------+---------------+----------+
|    2 | chienne       |     1402 |
|    1 | chien         |     1373 |
|    3 | un beau chien |     1373 |
|    4 | chien-loup    |     1373 |
+------+---------------+----------+
4 rows in set (0.00 sec)

重新编制索引后,最高级别现在是“chienne”!

这是正常的行为(如果是这样的原因?)或者它是一个错误? 如果它不是错误,我怎样才能确保精确匹配将获得最高排名?

2 个答案:

答案 0 :(得分:1)

您可能需要检查默认排名程序对您的版本执行的操作,并确定是否应使用其他版本。 检查" So how do I rank exact field matches higher? "问题

答案 1 :(得分:0)

这是预期的行为。

事实上,基于BM25的算法会考虑关键字的稀缺性。

在上面的示例中,单词" chienne"比“" chien"这个词更为罕见所以它排名更高。

在实际数据集上,它可能比示例中更好。

sphinxsearch.com上的这篇文章可以进一步阅读:http://sphinxsearch.com/forum/view.html?id=13348