我注意到在使用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”!
这是正常的行为(如果是这样的原因?)或者它是一个错误? 如果它不是错误,我怎样才能确保精确匹配将获得最高排名?
答案 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