Всем привет.
Создал модель индекса и хочу выполнить полнотекстовый поиск. Но не получается реализовать свой ранкер.
В индексе существует атрибут : 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 - зарезервированное слово, изменил название атрибута и все заработало!