调整Sphinx匹配任何/部分匹配[通过PHP]

时间:2012-03-22 18:43:18

标签: php search full-text-search sphinx

我们使用标准的EXTENDED2 / SPH_RANK_PROXIMITY_BM25方法在中型产品数据库(10 mm记录,2 gb)上运行sphinx。速度很快,相关性很高。

但是,我们正在加大对最终用户的投诉,这些用户使用比我们的数据库更复杂的术语进行搜索,因此没有结果。

例如,我们有产品“KitchenAid Artisan 5-Quart Mixers”,而常见的搜索是“KitchenAid Artisan 5-Quart Stand Mixers brown”。当我们应该能够返回我们拥有的项目时,我们当前设置的结果是不匹配的。

我们尝试使用@weight模式的MATCH_ANY排序,但相关性完全横向[认为玩偶和棋盘游戏出现]因为sphinx选择了其他具有单词的产品。

是否有一种最佳实践方法来构建我们的查询参数,这些参数允许更多的开放匹配,同时仍然排除邻近和字密度?

这是我们当前的PHP API命令,如果有帮助的话

$cl = new SphinxClient();
$cl->SetServer('1.23.4', 456);
$cl->SetMaxQueryTime(15000);
$cl->SetMatchMode(SPH_MATCH_EXTENDED2);
$cl->SetRankingMode(SPH_RANK_PROXIMITY_BM25);
$cl->SetArrayResult(true);
$cl->SetFilter('active', array(1)); 
$cl->SetSortMode(SPH_SORT_RELEVANCE, '@weight DESC, priced ASC');
$cl->SetLimits(intval($try), 1, 20, 500);
$cl->SetFieldWeights(array('ptitle' => 60, 'description' => 40));
$res = $cl->query($searchterm,"products");

1 个答案:

答案 0 :(得分:2)

要探索的一件事是Quorum。这对于长查询非常有用,因为您可能需要一定数量的关键字。虽然ANY只需要一个单词匹配,但仲裁可以要求说出7个中的4个。

这将排除一些非常糟糕的比赛。

因为仲裁只是一种语法作为扩展匹配模式的一部分 - 您可以尝试所有不同的排名模式。使用SPH_RANK_MATCHANY仍然可以尝试 - 因为“部分”匹配应该相当不错。但您也可以尝试其他模式。

如果您正在使用形态学,您还可以启用index_exact_words并为其提供排名提升。

所以会做类似......

//this works as long as the user is not using special syntax, but if using -="() etc, need to be more clever
$bits = preg_split('/\s+/',trim($searchterm));
$quorum = ceil(count($bits)*0.66);
$searchterm2 = '='.implode(' =',$bits);

$searchterm = '"'.$searchterm.'"/'.$quorum.' | "'.$searchterm2.'"/'.$quorum;

另外,我对你的setLimits有疑问。 max_matches为20似乎非常低。截止看起来没必要;它甚至可能导致你的问题。它将找到500个合理的文档,然后停止搜索 - 即使稍后在数据集中有更好的匹配。