Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为任何/部分匹配调整Sphinx匹配[通过PHP]_Php_Search_Full Text Search_Sphinx - Fatal编程技术网

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

为任何/部分匹配调整Sphinx匹配[通过PHP],php,search,full-text-search,sphinx,Php,Search,Full Text Search,Sphinx,我们在一个中型产品数据库(10毫米记录,2gb)上运行sphinx,使用标准EXTENDED2/SPH_RANK_Proximition_BM25方法。速度很快,相关性很强 然而,我们遇到越来越多的终端用户投诉,他们使用比我们的数据库更复杂的术语进行搜索,因此没有得到任何结果 例如,我们有产品“KitchenAid Artisan 5夸脱搅拌机”,而常见的搜索是“KitchenAid Artisan 5夸脱立式搅拌机棕色”。当我们应该能够返回我们拥有的物品时,与当前设置的结果不匹配 我们已经尝试

我们在一个中型产品数据库(10毫米记录,2gb)上运行sphinx,使用标准EXTENDED2/SPH_RANK_Proximition_BM25方法。速度很快,相关性很强

然而,我们遇到越来越多的终端用户投诉,他们使用比我们的数据库更复杂的术语进行搜索,因此没有得到任何结果

例如,我们有产品“KitchenAid Artisan 5夸脱搅拌机”,而常见的搜索是“KitchenAid Artisan 5夸脱立式搅拌机棕色”。当我们应该能够返回我们拥有的物品时,与当前设置的结果不匹配

我们已经尝试使用MATCH_按@weight模式进行任何排序,但相关性完全是横向的[想想玩偶和棋盘游戏的出现],因为斯芬克斯用单个单词挑选其他产品

是否有一种最佳实践方法来构建我们的查询参数,以允许更开放的匹配,同时仍然根据接近度和单词密度进行排名

如果有帮助的话,下面是我们当前的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");

需要探讨的一件事是仲裁。这对于长查询很有用,因为您可能需要一定数量的关键字。虽然任何一个单词只需要一个单词就可以匹配,但法定人数可以要求7个单词中的4个匹配

这将立即排除一些非常糟糕的匹配

因为quorum只是扩展匹配模式的一部分,所以您可以尝试所有不同的排名模式。使用SPH_RANK_MATCHANY仍然可以尝试,因为它在“部分”匹配中应该相当好。但您也可以尝试其他模式

如果你正在使用词法,你也可以启用索引精确单词,并提高它们的排名

所以我会做一些像

//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;

另外,我对你设定的限制也有疑问。最多20场比赛似乎很低。而且这种切断看起来是不必要的;它甚至可能会引起你的问题。它将找到500个合理的文档,然后停止搜索-即使数据集中稍后有更好的匹配

quorum和您的代码看起来正是我们所需要的,足以让事情变得自由。对于那些同样致力于此的人,我们坚持使用EXTENDED2比赛,因为接近真的很有帮助。此外,切断被删除,这对您的观点可能有帮助。注意:在提供的代码中有一个小错误。任何遇到问题的人都应删除“在第一个“.$quorum.”位之后。Opps!编辑了答案以解决此问题。