dimvic / yii-elastic
此包已被废弃且不再维护。未建议替代包。
Yii 1.1 elasticsearch 工具
dev-master
2019-11-21 13:04 UTC
Requires
- php: ^5.4.0|^7.0
- dimvic/composer-installers: dev-master
- ruflin/elastica: 3.2.*
Requires (Dev)
- roave/security-advisories: dev-master
Suggests
- yiisoft/yii: ^1.1.17
This package is not auto-updated.
Last update: 2022-08-06 07:45:19 UTC
README
一组用于在 Yii 1.1 项目中操作 elasticsearch 的工具。包括兼容 CActiveDataProvider
的数据提供程序,一个 CActiveRecordBehavior
以及一个 elasticsearch 查询助手。
除了使应用程序能够通过 elasticsearch 进行快速搜索外,这些工具还能够在几乎零配置的情况下搜索关系中的内容。
特性
- 无需 elasticsearch 背景
- ElasticActiveRecordBehavior
- 自动索引(记录插入/更新/删除时,文档会被添加到或从 elasticsearch 中删除)
- 自动索引关系及其任意深度的关系(所需配置最少)
- ElasticDataProvider
- 与 CGridView、CListView 等兼容。使用
$model->elasticSearch()
代替$model->search()
- 完全兼容于 CActiveDataProvider,所有分页和排序都受支持
- 搜索支持所有预期的操作符(支持
CDbCriteria->compare()
的所有操作符),>、<、>=、<> 等 - 返回 CActiveRecord[],而不是 elasticsearch 文档,以实现最大兼容性
- 与 CGridView、CListView 等兼容。使用
- ElasticQueryHelper
- 构建 elasticsearch 查询(实现 CDbCriteria->compare(),适用于关系)
- 搜索关系字段(例如
category.products.price>10
可以正常工作)
注意事项
- 此工具仅适用于只有一个单一主键(任何类型)的
CActiveRecord
实现,不支持复合主键。 ElasticDataProvider
使用 elasticsearch 进行搜索但返回CActiveRecord[]
,而不是 elasticsearch 文档数组。它获取匹配记录的主键,然后通过主键查询以返回CActiveRecord[]
,以实现与 Yii 1.1 小部件/扩展/组件/插件的最大兼容性。- 在关系字段中进行搜索目前仅支持全匹配("imba" 不会匹配 "imbalanced",如您所期望的那样)
安装
$ composer require dimvic/yii-elastic:dev-master
$ composer update
然后在您的配置中添加
return [ ... 'components' => [ 'elastica' => [ 'class' => 'extensions.yii-elastic.Elastica', 'host' => '127.0.0.1', 'port' => '9200', 'debug' => YII_DEBUG, ], ... ], ... ];
入门指南
将 ElasticActiveRecordBehavior
附接到 CActiveRecord
class Post extends CActiveRecord { ... public function Behaviors() { return array_replace(parent::behaviors(), [ [ 'class'=>'ext.yii-elastic.ElasticActiveRecordBehavior', 'elastic_index'=>null, //defaults to parsing db name from $this->getDbConnection() 'elastic_type'=>null, //defaults to $model->tableName() 'elastic_raw_cols'=>null,//the columns that will be used for aggregations, defaults to ['caption', 'slug', 'label', 'name'] 'elastic_relations'=>[ //the relations you want indexed, can be nested to any depth 'author', 'author.group', ], ], ... ]); } ... ]
在 elasticsearch 中索引模型数据
这将创建 elasticsearch 中的索引和类型,如果它们已经存在,则先删除它们!它还会索引所有数据,因此如果您打算在大型数据集上运行它,请查看该方法参数。
Post::model()->elasticRebuild();
准备就绪
在您的控制器中
public function actionGrid() { $model = new Post('search'); $this->render('grid', [ 'model' => $model, ]); }
在您的视图中
$this->widget('zii.widgets.grid.CGridView', [ 'dataProvider'=>$model->elasticSearch(), 'filter'=>$model, 'columns' => [ ['name'=>'id'], ['name'=>'title'], ['name'=>'author.name', 'filter'=>$model->nestedFilterInput('author.name')], ['name'=>'author.group.name', 'filter'=>$model->nestedFilterInput('author.group.name')], ], 'ajaxUpdate'=>false, ]);
您现在可以通过帖子的作者组名进行搜索。
用法
尽管默认功能应该适用于大多数情况,但您可以通过轻松处理更复杂的场景。
您可能想看看
ElasticActiveRecordBehavior->elasticSearch()
如果您想运行自定义查询ElasticActiveRecordBehavior->createElasticType()
和ElasticActiveRecordBehavior->elasticProperties()
如果您想以特定方式索引数据(您可能需要重写ElasticActiveRecordBehavior->createElasticDocument()
,该函数准备文档)ElasticQueryHelper
以了解查询是如何构建的。调整方法参数对于大多数情况应该足够,重写始终是一个选项。
ElasticActiveDataProvider->getResultSet()
将为您提供对每个查询的 \Elastica\ResultSet
的访问,以便在需要更深入地了解搜索时。
感谢
待办事项
- 默认情况下将
$model->relations()
添加到索引中 ElasticaQueryHelper::compare()
支持日期比较- 为关系字段创建一个模式缓存,因为它们现在总是被搜索以进行精确匹配
- 支持模型和关系字段的聚合
- 文档