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,模型和数据库