如何根据使用Sphinx PHP API的排名获得Sphinx结果?

时间:2012-02-03 08:01:40

标签: php sphinx

是否可以使用sphinx PHP API显示基于排名的Sphinx结果

For example,
----------------------------------------------
Searched_Query  |  Result        |  Ranks 
----------------------------------------------
Sony Ericsson     Sony Ericsson     Best Match
                  Ericsson          Good Match
                  Sony DVD          Fair Match
                  DVD               Poor Match
----------------------------------------------

如果是这样,那么请附上我的样本或参考URL。

非常感谢帮助!

谢谢, 拉加

3 个答案:

答案 0 :(得分:3)

require_once ( "sphinxapi.php" );
$cl = new SphinxClient ();
$cl->SetServer ("localhost", 9312); 
$cl->SetMatchMode ( SPH_RANK_SPH04 );  /*use this*/
$cl->SetMatchMode ( SPH_MATCH_EXTENDED2 );
$cl->SetSortMode ( SPH_SORT_EXTENDED, "@weight DESC" );
$res = $cl->Query ( "Sony Ericsson", "your_sphinx_index_name" );
if ( $res===false ){
    print "ERROR: Query failed: " . $cl->GetLastError() . ".\n";
}else {
    if ( $cl->GetLastWarning() ){
    print "WARNING: ".$cl->GetLastWarning() . "\n\n";
    }
    // result processing is here
}

答案 1 :(得分:1)

是和否。默认情况下,Sphinx会进行排名 - 并且结果会先排序。 (但这可以改变)

但这里一个重要的考虑因素是匹配' - 记录是否与查询匹配。 (这与排名'的任务略有不同,后者为每场比赛提供分数,通常按顺序排列)

要靠近,你需要使用" MATCH ANY"风格匹配。这意味着只需要其中一个词。默认情况下匹配" ALL" - 需要所有的话。也可以使用扩展匹配模式模拟任何匹配,使用仲裁或“或”查询。

...在sphinx文档中阅读有关这些术语的更多信息。

我说'关闭'因为sphinx在你的例子中不会给你最后的结果。因为它没有共同的话。前三个都有一个共同的词。

也许你正在考虑" WITH EXPANSION" mysql全文搜索中的选项。这样做会。 Sphinx没有直接可比的功能,所以它必须自己实现。 (例如,运行一个'任何qyery'抓取,前100个结果,计算常用词(在你的代码中)),并形成对sphinx的第二个查询。使用第二个查询作为向用户显示的结果)

[已经说过有另一个选项,可以形成一个匹配所有文档的查询,然后只依靠排名来获得'匹配'显示在顶部附近。我不推荐这个用于一般搜索]

答案 2 :(得分:0)

require_once ( "sphinxapi.php" );

$cl = new SphinxClient ();

$cl->SetServer ("localhost", 9312);
$cl->SetMatchMode ( SPH_MATCH_EXTENDED2 );
$cl->SetSortMode ( SPH_SORT_EXTENDED, "@weight DESC" );
$res = $cl->Query ( "Sony Ericsson", "your_sphinx_index_name" );
if ( $res===false )
{
        print "ERROR: Query failed: " . $cl->GetLastError() . ".\n";
} else {
        if ( $cl->GetLastWarning() ) print "WARNING: " . $cl->GetLastWarning() . "\n\n";

        // result processing is here
}