MultiQueries в Сфинксе в CakePHP - PullRequest
0 голосов
/ 28 ноября 2011
$query = '@(name,email,bio) ' . '"' . $this->passedArgs['name'] . '"~100';
$query2 = '@(name,email,bio) ' . '"' . $this->passedArgs['name'] . '"~300'
$query3 = '@(name,email,bio) ' . '"' . $this->passedArgs['name'] . '"/3';
$query4 = '@(name,email,biot) ' . '"' . $this->passedArgs['name'] . '"/1';

Я хочу выполнить это в одном запросе!Если я использую «|»ИЛИ оператор, это займет около 2 минут, чтобы отобразить результаты!

Есть ли в любом случае использование multiquery в sphinxapi Я могу объединить все эти запросы в один?

Ответы [ 3 ]

0 голосов
/ 29 ноября 2011

Если я понимаю (из вашего комментария), вы ищете $this->passedArgs['name'] в полях @(name,email,bio), в пределах ~100 символов ИЛИ ~300 символов ИЛИ имея не менее /3 совпадений слов ИЛИ не менее /1 совпадений слов?

Почему бы тогда не разбить его на два разных запроса, самый ограничивающий сначала:

$query = '@(name,email,bio) ' . '"' . $this->passedArgs['name'] . '"~100';
$query4 = '@(name,email,bio) ' . '"' . $this->passedArgs['name'] . '"/1';

выполните эти запросы, | d вместе.Если вы не получили результатов, выполните приведенный ниже запрос, также | d вместе.

$query2 = '@(name,email,bio) ' . '"' . $this->passedArgs['name'] . '"~300'
$query3 = '@(name,email,bio) ' . '"' . $this->passedArgs['name'] . '"/3';
0 голосов
/ 12 июня 2015

Я пробовал один запрос, используя оператор OR (|), Sphinx не давал точных результатов.Позже обнаружил функцию AddQuery, которая помогла мне получить результаты нескольких запросов и объединить их в один.

Я даже могу указать отдельные индексы для каждого запроса.См. Документация Sphinx AddQuery

<code>    $cl->AddQuery('@(name,email,bio) "one two" ~100', 'dist'); 
    $cl->AddQuery('@(name,email,bio) "one two" ~300', 'dist'); 
    $cl->AddQuery('@(name,email,bio) "one two" ~300', 'dist'); 
    $cl->AddQuery('@(name,email,bio) "one two" /3', 'dist'); 
    $cl->AddQuery('@(name,email,bio) "one two" ~/1', 'metaphone dist'); 
    $result = $cl->RunQueries();
    echo "<pre>",print_r($result),"
";

Я сделал вызов SetIndexWeights для определения приоритетов нескольких используемых мной индексов. См. Документ Sphinx SetIndexWeights

0 голосов
/ 28 ноября 2011

Вы можете попробовать

@(name,email,bio) ( "one two"~100 | "one two"~300 | "one two"/3 | "one two"/1 )

Может быть немного быстрее.

...