【问题标题】:Tuning Sphinx Matching for Any / Partial Matches [via PHP]为任何/部分匹配调整 Sphinx 匹配 [通过 PHP]
【发布时间】:2012-04-07 09:10:39
【问题描述】:

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

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

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

我们尝试使用 MATCH_ANY 按@weight 模式排序,但相关性完全偏离了方向[想想出现的玩偶和棋盘游戏],因为 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");

【问题讨论】:

    标签: php search full-text-search sphinx


    【解决方案1】:

    要探索的一件事是法定人数。这对于长查询很有用,因为您可能需要一定数量的关键字。虽然 ANY 只需要一个单词来匹配,但 quorum 可能需要说 4 out of 7。

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

    而且由于 quorum 只是扩展匹配模式的一部分的语法 - 您可以尝试所有不同的排名模式。仍然可以尝试使用 SPH_RANK_MATCHENY - 因为它应该与“部分”匹配相当好。但您也可以尝试其他模式。

    如果您使用形态学,您还可以启用 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 有疑问。 20 的 max_matches 似乎非常低。截止看起来没有必要;它甚至可能导致您的问题。它会找到 500 个合理的文档,然后停止搜索——即使稍后在数据集中有更好的匹配。

    【讨论】:

    • quorum 和您的代码看起来正是我们需要释放的东西。对于那些也在做这件事的人,我们坚持使用 EXTENDED2 匹配,因为接近确实有帮助。此外,截止日期已被删除,这对您而言可能有所帮助。
    • 注意:提供的代码中有一个小错误。第一个 '.$quorum.' 之后的 "对于遇到问题的任何人,都应该删除该位。
    • 哎呀!编辑了答案来解决这个问题。
    猜你喜欢
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-20
    • 2022-10-13
    相关资源
    最近更新 更多