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
我注意到使用 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