Статьи помеченные elasticsearch
Интерфейс для полнотекстового поиска
Использование ElasticSearch во frontend
На создание ElasticSearch
индекса понадобилось совсем не много усилий, как видно из предыдущей статьи. Чтобы сделать индекс доступным конечному пользователю, усилий понадобиться не многим больше.
Теперь нужна форма ввода и нужно немного подправить действие контроллера для ее обработки и получения результатов и представление, чтобы отображать форму.
Как создать индекс ElasticSearch
Полнотекстовый поиск
Один парень написал: "Нужно сделать поиск слов в таблице "articles" по столбцу "content". В результатах поиска сначала выводить те, которые содержат наибольшее количество слов в статье и далее по мере уменьшения."
Мысль летит) Но ясно, что нужен полнотекстовый поиск.
Поиск
Метки
- 1. Как создать индекс ElasticSearch
- 2. Интерфейс для полнотекстового поиска
На создание ElasticSearch
индекса понадобилось совсем не много усилий, как видно из предыдущей статьи. Чтобы сделать индекс доступным конечному пользователю, усилий понадобиться не многим больше.
Теперь нужна форма ввода и нужно немного подправить действие контроллера для ее обработки и получения результатов и представление, чтобы отображать форму.
Форма ввода строки поиска вполне обычная, как и представления для вывода результатов. А вот в модели и контроллере есть пара важных добавлений.
Model
При редактировании Post
, нужно сохранять изменения в индексе.
common/models/Post.php
class Post extends ActiveRecord { public function afterSave($insert, $changedAttributes){ parent::afterSave($insert, $changedAttributes); if($insert) { $elastic = new ElasticPost(); $elastic->fill($this); $elastic->save(false); } else { $elastic = ElasticPost::get($this->id); $elastic->fill($this, false); $elastic->update(false, ['title', 'content']); } }
Controller
В коде контроллера frontend/controllers/PostController.php
оставлены только существенные строки. ElasticSearch
индекс нужен для поиска подходящих статей. Найдя их, сохраняем ID
в массиве и передаем объекту Query
. Таким образом действие контроллера потребует минимум изменений.
namespace frontend\controllers; use Yii; use yii\web\Controller; use yii\db\Query; use yii\data\ActiveDataProvider; use common\models\Post; use common\models\elastic\Post as ElasticPost; use frontend\models\SearchForm; use frontend\components\PostQuery; class PostController extends Controller { public $layout = 'column2'; public function actionIndex() { $query = Post::find() ->where(['status' => Post::STATUS_PUBLISHED]) ->orderBy('created_at DESC'); $search = new SearchForm(); if ($search->load( Yii::$app->request->post()) && $search->validate() && $search->text ) { $query->andWhere([ 'in', 'id', $this->getPostIdByElasticIndex($search->text)]); } $dataProvider = new ActiveDataProvider([ 'query' => $query, ]); // save text $searchText = $search->text; // new search $search = new SearchForm(); return $this->render('index', [ 'dataProvider' => $dataProvider, 'post' => $this->getPostBySlug('post-index'), 'search' => $search, 'searchText' => $searchText, ]); } private function getPostIdByElasticIndex($text) { $query = ElasticPost::find()->query([ 'bool' => [ 'should' => [ PostQuery::match('title', $text), PostQuery::match('excerpt', $text), PostQuery::match('content', $text), ], ], ]); $ids = []; foreach($query->all() as $post) { $ids[] = $post->primaryKey; } return $ids; } }
frontend/componets/PostQuery.php
namespace frontend\components; use yii\db\ActiveQuery; class PostQuery extends ActiveQuery { public static function match($attribute, $text) { return [ 'match' => [ $attribute => [ 'query' => $text, 'operator' => 'and', ], ], ]; } }
Заключение
Как работает полнотекстовый поиск можно проверить на странице post/index#searching. Но это только поиск, причем вспомогательный. Нет, круто конечно - быстро, просто. Но очевидно, что ElasticSearch
может использоваться абсолютно самостоятельно.
Оставьте комментарий
Только зарегистрированные пользователи могут оставлять комментарии. Пожалуйста войдите или пройдите регистрацию.
Можно авторизоваться, используя социальную сеть-
-
-