sphinx, options, ranker

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
vtec
Сообщения: 49
Зарегистрирован: 2010.11.16, 10:28

sphinx, options, ranker

Сообщение vtec »

Кто нибудь настраивал ranker в sphinx? Как правильно? Может есть пример?
Нужно вот такую настройку sphinx скормить: ranker=expr('sum(lcs*user_weight)*1000+bm25')

Вот что сейчас у меня работает точно:

Код: Выделить всё

// Запрос в sphinx
$query = Items::find()->match($text)->with('images','catalog');
$query->options(['field_weights'=> ['item_name' => 10, 'description' => 5], 'max_matches' => 1000, ]) ;
 
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

Re: sphinx, options, ranker

Сообщение vitalik1183 »

у меня так, работает нормально

Код: Выделить всё

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 собсно сам шаблон
Yii2!
vtec
Сообщения: 49
Зарегистрирован: 2010.11.16, 10:28

Re: sphinx, options, ranker

Сообщение vtec »

Спасибо. Разобрался.
Может кому пригодится

Код: Выделить всё

            $query = Items::find()->match($text)->orderby('weight() DESC, parser_date DESC')->with('images','catalog');
            $query->addOptions(['field_weights'=> ['item_name' => 10, 'description' => 5] ]);
            $query->addOptions(['max_matches' => 1000]);
            $query->addOptions(['ranker' => new Expression("expr('sum(lcs*user_weight)*1000+bm25')") ]);
Ответить