@Leffken
Студент, как студент!

Yii2 sphinx ranker как правильно реализовать?

Всем привет.
Создал модель индекса и хочу выполнить полнотекстовый поиск. Но не получается реализовать свой ранкер.
В индексе существует атрибут : weight, который поправит выдачу как мне нужно. В общем нужно общий рейтинг (собранный из опций) домножить на рейтинг в документе.
Пробовал так :
$result = GeoIndex::find()
            ->select(['item1_id', 'item2_id', 'item3_id', 'item3_name'])
            ->match(new MatchExpression('@(item1_name,item2_name,item3_name) :match /1', [':match' => $data]))
            ->orderBy('weight() DESC')
            ->addOptions(['field_weights'=> ['item1_name' => 3, 'item2_name' => 2, 'item3_name' => 1]])
            ->addOptions(['ranker' => "expr('(sum(lcs*user_weight)*1000+bm25)*weight'" ])
            ->one();

Выдает ошибку:
unknown ranker 'expr(\'(sum(lcs*user_weight)*1000+bm25)*weight\''
Так же пробовал так :
->addOptions(['ranker' => new \yii\db\Expression ("expr('(sum(lcs*user_weight)*1000+bm25)*weight'") ])
Ошибка:
sphinxql: syntax error, unexpected $end, expecting ')' near ''(sum(lcs*user_weight)*1000+bm25)*weight''

->addOptions(['ranker' => new \yii\sphinx\MatchExpression ("expr('(sum(lcs*user_weight)*1000+bm25)*weight'") ])
Ошибка:
Exception 'yii\db\Exception' with message 'Object of class yii\sphinx\MatchExpression could not be converted to string
Failed to prepare SphinxQL: SELECT `item1_id`, `item2_id`, `item3_id`, `item3_name` FROM `index` WHERE MATCH(:qp0) ORDER BY weight() DESC OPTION field_weights = (item1_name = :qp1, item2_name = :qp2, item3_name = :qp3), ranker = :qp4'

in /var/www/project/vendor/yiisoft/yii2-sphinx/Command.php:280


В итоге 2-ой вариант оказался правильным, с поправкой из комментария. Дело было в том что weight - зарезервированное слово, изменил название атрибута и все заработало!
  • Вопрос задан
  • 750 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Leffken Автор вопроса
Студент, как студент!
Второй вариант пока ближе всех к правде, но не получается умножить на атрибут документа.
//Не работает, 
->addOptions(['ranker' => new Expression("expr('(sum(lcs*user_weight)*1000+bm25)*weight')") ])
Ошибка : 
index lite_geo_index_fr: Sphinx expr: syntax error, unexpected $end, expecting '(' near ''

//Работает
->addOptions(['ranker' => new Expression("expr('(sum(lcs*user_weight)*1000+bm25)')") ])
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы