SphinxSearch 精确匹配排名

SphinxSearch exact match ranking

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

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

这在我下面的第一个两行示例中效果很好。但是,如果我添加更多行,权重会发生变化,并且我的完全匹配结果 (id=1) 的排名低于其他近似结果!

例如,索引这 2 个词(一些具有词法 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" => 这正是我所期望的。

现在我向我的数据库添加更多行:

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"!

这是正常行为(如果是,为什么?)还是错误? 如果不是BUG,如何保证精确匹配得到最高排名?

您可能需要检查默认排名器为您的版本做了什么,并确定您是否应该使用不同的排名器。 检查“So how do I rank exact field matches higher?”问题。

这是预期的行为。

其实基于BM25的算法考虑到了关键词的稀缺性

在上面的示例中,单词 "chienne" 比单词 "chien" 更稀有,因此排名更高。

在真实数据集上,它可能比示例中的效果更好。

sphinxsearch.com 上的 post 可进一步阅读:http://sphinxsearch.com/forum/view.html?id=13348