Как получить результаты Sphinx на основе ранжирования, используя Sphinx PHP API? - PullRequest
0 голосов
/ 03 февраля 2012

Можно ли отображать результаты Sphinx на основе ранжирования с помощью sphinx PHP API,

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

Если это так, пожалуйста, приложите мне образец или ссылку URL.

Помощь с благодарностью!

Спасибо, Радж

Ответы [ 3 ]

3 голосов
/ 26 декабря 2018
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 голос
/ 03 февраля 2012

Да и нет. Сфинкс по умолчанию делает ранжирование - и результаты располагаются лучше всего сначала. (но это можно изменить)

Но важным моментом здесь является «сопоставление» - соответствует ли запись запросу. (что немного отличается от задачи «ранжирования», которая дает оценку каждому матчу и обычно заказывает по ней)

Чтобы приблизиться, вам нужно использовать совпадение стилей "MATCH ANY". Что значит только одно слово. По умолчанию соответствует «ВСЕ» - нужны все слова. Также может эмулировать совпадение с любым с расширенным режимом совпадения, используя Quorum или запрос «ИЛИ».

... подробнее об этих терминах читайте в документации по sphinx.

Я сказал «закрыть», потому что сфинкс не даст вам последний результат в вашем примере. Потому что у него нет общих слов. Первые три имеют общее слово.

Возможно, вы думаете об опции "WITH EXPANSION" в полнотекстовом поиске mysql. Это сделает это. Сфинкс не имеет напрямую сопоставимой функции, поэтому его нужно было бы реализовать самостоятельно. (например, запустите захват «any qyery», 100 лучших результатов, определите общие слова (в вашем коде)) и сформируйте второй запрос к sphinx. использовать этот второй запрос в качестве результатов, показанных пользователю)

[сказав, что есть другой вариант, можно сформировать запрос, который соответствует всем документам, а затем просто полагаться на ранжирование, чтобы «совпадения» отображались в верхней части. Я не рекомендую это для общего поиска]

0 голосов
/ 03 февраля 2012
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
}
...