Sphinx搜索精确匹配和中缀匹配

3

我正在使用Sphinx为网站提供搜索功能,但在返回相关结果时遇到了一些问题。

为了让我的问题简单明了,假设我有两个字段@title和@body,它们的权重分别为100和15。当我搜索像“in”这样的小词时,我希望它能更高地排列该搜索术语的精确匹配项,然后检查与“in*|*in|*in*”匹配的项并略微降低它们的排名。是否有任何方法可以实现这种搜索的特定性?

in”的示例结果:

  1. 印度食品
  2. 中间的
  3. 拉丁文档

一些相关的设置是:

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没有出现在结果中。我还搜索了CowbCowbo,直到我输入Cowboy才得到预期的结果。有什么想法吗?

这个问题与之前的SO问题类似,但我希望能更详细地说明我的问题以及我尝试过的事情,以便得出解决方案。


有什么其他的项目可以添加以帮助人们回答这个问题吗? - ServAce85
2个回答

3
看起来形态上的牛与牛仔无关。
你可以有两种解决方法:
1. 使用包含Cow > Cowboy的wordforms文件 2. 由于启用了星号,你可以将查询从“Cow”更改为“Cow*”,以查找所有以“Cow”开头的单词。
针对"in"和"in"不同的排名问题,我建议在索引中拥有两个body字段,比如:body和body_star,并且这两个字段的内容相同。
在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");

这应该能解决问题。

我喜欢阅读看起来优雅的解决方案。我需要花点时间研究一下“牛仔”问题,但我真的很喜欢你提出的解决“in”问题的建议。非常好的建议!(也就是说...直到有人告诉我不同为止;) 如果它能正常工作,我测试后会接受它作为正确答案。 - ServAce85

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接