ElasticSearch引擎适配器
这个扩展是一个类ActiveRecord的包装,将ElasticSearch全文搜索引擎集成到Yii2框架中。它允许你使用任何模型数据,并使用ActiveRecord模式在ElasticSearch数据集中获取和存储数据。
准备
- 按照官方指南http://www.yiiframework.com/doc-2.0/guide-start-installation.html的描述,使用Composer包管理器创建一个新的应用。
- 从https://www.elastic.co/downloads/elasticsearch安装
ElasticSearch服务。 - 使用如下命令安装扩展:
composer require yiisoft/yii2-elasticsearch
如何做…
在你的应用配置中设置新的ElasticSearch连接。
return [//....'components' => ['elasticsearch' => ['class' => 'yii\elasticsearch\Connection','nodes' => [['http_address' => '127.0.0.1:9200'],// configure more hosts if you have a cluster],],]];
使用查询类
你可以使用Query类,用于在任何数据集中进行低级查询:
use \yii\elasticsearch\Query;$query = new Query;$query->fields('id, name')->from('myindex', 'users')->limit(10);$query->search();
你也可以创建一个命令,直接运行:
$command = $query->createCommand();$rows = $command->search();
使用ActiveRecord
使用ActiveRecord是一种常用的方法来访问你的数据。只需要扩展yii\elasticsearch\ActiveRecord类,并继承attributes()方法,来定义你文档的属性。
例如,你可以写Customer模型:
class Buyer extends \yii\elasticsearch\ActiveRecord{public function attributes(){return ['id', 'name', 'address', 'registration_date'];}public function getOrders(){return $this->hasMany(Order::className(), ['buyer_id' => 'id'])->orderBy('id');}}
然后写Order模型:
class Order extends \yii\elasticsearch\ActiveRecord{public function attributes(){return ['id', 'user_id', 'date'];}public function getBuyer(){return $this->hasOne(Customer::className(), ['id' => 'buyer_id']);}}
你可以复写index()和type()来定义这个记录的index和type。
下边是一个使用例子:
$buyer = new Buyer();$buyer>primaryKey = 1; // it equivalent to $customer->id = 1;$buyer>name = 'test';$buyer>save();$buyer = Buyer::get(1);$buyer = Buyer::mget([1,2,3]);$buyer = Buyer::find()->where(['name' => 'test'])->one();
你可以使用Query DSL做指定查询:
$result = Article::find()->query(["match" => ["title" => "yii"]])->all();$query = Article::find()->query(["fuzzy_like_this" => ["fields" => ["title", "description"],"like_text" => "Some search text","max_query_terms" => 12]]);$query->all();
你可以添加facets到你的搜索中:
$query->addStatisticalFacet('click_stats', ['field' => 'visit_count']);$query->search();
使用ElasticSearch调试板
这个扩展包含了一个特殊的面板,用于yii2-debug模块。它允许你查看所有执行的查询。你可以在你的配置文件中包含这个面板:
if (YII_ENV_DEV) {// configuration adjustments for 'dev' environment$config['bootstrap'][] = 'debug';$config['modules']['debug'] = ['class' => 'yii\debug\Module','panels' => ['elasticsearch' => ['class' => 'yii\elasticsearch\DebugPanel',],],];$config['bootstrap'][] = 'gii';$config['modules']['gii'] = 'yii\gii\Module';}
工作原理…
这个扩展提供了一个低级命令构建器,以及高级ActiveRecord实现,用于从ElasticSearch中查询记录。
这个扩展的ActiveRecord的用法和数据库的ActiveRecord非常类似,后者可以参考第三章,ActiveRecord,模型和数据库,此外还有join()、groupBy()、having()、union()ActiveQuery操作。
注意:ElasticSearch默认限制返回的记录数量,如果你使用via()选项来使用关系,注意这个限制。
参考
- 欲了解更多关于这个扩展的信息,参考
- 你也可以访问官方扩展网站https://www.elastic.co/products/elasticsearch
- 欲了解更多关于Query DSL的信息,你可以访问:
- ActiveRecord的用法参考第三章,ActiveRecord,模型和数据库
