我正在使用Sphinx为网站提供搜索功能,而且在返回相关结果时遇到了一些麻烦。
为了让我的问题变得简单,让我们假设我有两个字段,@ title和@body,它们的权重为100&分别为15。当我搜索“ ”这样的小词时,我想让它对该搜索词的匹配排名更高,然后检查匹配到“在* | * in | * in * '中,并将它们排在略低的位置。有没有办法让你的搜索具有这种特殊性?
在中的示例结果:
一些相关设置是:
在 sphinx.conf :
morphology = stem_en
charset_type = utf-8
min_word_len = 2
min_prefix_len = 0
min_infix_len = 2
enable_star = 1
在 search.php
中$sp->SetMatchMode( SPH_MATCH_EXTENDED2 );
$sp->SetRankingMode( SPH_RANK_PROXIMITY_BM25 );
$sp->SetFieldWeights ( array('title' => 100, 'body' => 15) );
此外,作为旁注:我也有一些情况,即部分匹配甚至不会显示在搜索结果中。例如,我搜索了 Cow ,但 Cowboy 没有显示结果。我还搜索了 Cowb 和 Cowbo ,直到我输入 Cowboy 才收到预期的结果。有什么想法吗?
这个问题和this previous SO question一样,但我希望我已经提供了一些关于我的问题以及我试图保证解决方案的更多细节。
答案 0 :(得分:3)
貌似形态牛与牛仔无关。
你可以用两种方式解决它:
考虑到“in”和“ in ”的不同排名,我可以建议索引中有两个正文字段,比方说:body和body_star与body字段中的内容相同。
在search.php中
$sp->SetRankingMode( SPH_RANK_PROXIMITY_BM25 );
$sp->SetMatchingMode( SPH_MATCH_EXTENDED2 );
$sp->SetFieldWeights ( array('title' => 20, 'body' => 15, 'body_start' => 5) );
$sp->Query("@body in @body_star *in* @title in");
这应该可以解决问题。
答案 1 :(得分:2)
您也可以在配置中设置expand_keywords选项 http://sphinxsearch.com/docs/1.10/conf-expand-keywords.html 并将排名模式设置为SPH_RANK_SPH04 http://sphinxsearch.com/blog/2010/08/17/how-sphinx-relevance-ranking-works/