у меня так, работает нормально
Код: Выделить всё
public function search()
{
return self::find()->with([
'relations.companies',
'relations.categories',
'relations.posts',
'users',
])
->select(['id', 'post_title', 'post_content', 'post_status', 'post_author', 'user_weight' => "WEIGHT()"])
->match(new Expression(':match', [
':match' => TextHelper::prepareSearchText($this->keywords, $this->pattern) .
TextHelper::prepareStopWordsText($this->stop_keywords),
]))
->andFilterWhere(['post_author' => $this->author])
//->match(TextHelper::prepareSearchText($this->keywords, $this->pattern))
->addOptions([
'ranker' => new Expression("expr('" . \Yii::$app->config->get('SEARCH.RANKER') . "')"),
])
/*->snippetOptions([
'limit' => 1024,
'before_match' => '<kbd>',
'after_match' => '</kbd>'
])*/
->snippetByModel();
}
Код: Выделить всё
/**
* @param null $text
* @param null $pattern
* @return null|string
*/
public static function prepareSearchText($text = null, $pattern = null)
{
if (empty($text) || empty($pattern))
return '';
return implode(' | ', array_map(function ($value) use ($pattern) {
$value = trim($value);
return '(' . str_replace('{{KEYWORD}}', $value, $pattern) . ')';
}, array_diff(array_map('trim', explode(PHP_EOL, $text)), ['', 'null'])));
}
/**
* Исключаемые слова
* @param $text
* @return string
*/
public static function prepareStopWordsText($text)
{
if (empty($text))
return null;
return '_dummy -' . implode(' | ', array_map(function ($value) {
$value = trim($value);
return '(' . $value . ')';
}, array_diff(array_map('trim', explode(PHP_EOL, $text)), ['', 'null'])));
}
$this->pattern собсно сам шаблон