我使用Sphinx提供搜索到一个网站,我在返回相关结果时遇到了一些障碍.
为了让我的问题变得简单,我们假设我有两个字段,@ title和@body,它们的权重为100&分别为15.当我搜索像’in’这样的单词时,我希望它将该搜索词的完全匹配排名更高,然后检查匹配’* in * | in in * * 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) );
此外,作为旁注:我还有一些情况,即部分匹配甚至不会显示在搜索结果中.例如,我搜索了牛,但牛仔没有显示结果.我也搜索了Cowb和Cowbo,直到我输入Cowboy才收到预期的结果.有什么想法吗?
这个问题和this previous SO question一样,但我希望我已经提供了一些关于我的问题以及我试图保证解决方案的更多细节.
解决方法:
貌似形态牛与牛仔无关.
你可以用两种方式解决它:
>使用带有Cow>的wordforms文件牛仔
>当启用星标时,您可以将查询从“Cow”更改为“Cow *”,这将查找以“Cow”开头的所有单词.
对于“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");
这应该可以解决问题.