我注意到了使用Sphinx2.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
}索引后(索引器--旋转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)“钱”这个词的排名比“=>”要高,这正是我所期望的。
现在,我将更多的行添加到数据库中:
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"!
这是一个正常的行为(如果是的话,为什么?)还是一只虫子?如果不是一个错误,我如何确保准确的匹配将得到最高的排名?
发布于 2015-05-11 14:59:20
这是一种预期的行为。
事实上,基于BM25的算法考虑了关键字的稀缺性。
在上面的例子中,"chienne“这个词比"chien”这个词更少见,所以它的排名更高。
在一个真实的数据集上,它可能比在示例中工作得更好。
可以从sphinxsearch.com:http://sphinxsearch.com/forum/view.html?id=13348上的这篇文章获得进一步的阅读。
发布于 2015-05-11 10:25:21
您可能需要检查默认的刻录机为您的版本做了什么,并确定您是否应该使用不同的版本。检查"http://sphinxsearch.com/blog/2010/08/17/how-sphinx-relevance-ranking-works/“问题。
https://stackoverflow.com/questions/29073517
复制相似问题