首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SphinxSearch精确匹配排序

SphinxSearch精确匹配排序
EN

Stack Overflow用户
提问于 2015-03-16 09:37:40
回答 2查看 1.1K关注 0票数 0

我注意到了使用Sphinx2.2.8排序的奇怪行为(v2.3.1-beta的结果与此相同)。

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

在下面的第一个示例中,这两行操作都很好。但是如果我增加了更多的行,权重的变化和我的精确匹配结果(id=1)得到了一个较低的排名比其他近似的!

例如,对这两个单词(一些法语单词使用词法libstemmer_fr)进行索引:

代码语言:javascript
复制
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):

代码语言:javascript
复制
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)

“钱”这个词的排名比“=>”要高,这正是我所期望的。

现在,我将更多的行添加到数据库中:

代码语言:javascript
复制
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"!

这是一个正常的行为(如果是的话,为什么?)还是一只虫子?如果不是一个错误,我如何确保准确的匹配将得到最高的排名?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-11 14:59:20

这是一种预期的行为。

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

在上面的例子中,"chienne“这个词比"chien”这个词更少见,所以它的排名更高。

在一个真实的数据集上,它可能比在示例中工作得更好。

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

票数 0
EN

Stack Overflow用户

发布于 2015-05-11 10:25:21

您可能需要检查默认的刻录机为您的版本做了什么,并确定您是否应该使用不同的版本。检查"http://sphinxsearch.com/blog/2010/08/17/how-sphinx-relevance-ranking-works/“问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29073517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档