dimvic/yii-elastic

此包已被废弃且不再维护。未建议替代包。

Yii 1.1 elasticsearch 工具

安装: 145

依赖项: 0

建议者: 0

安全性: 0

星级: 7

关注者: 2

分支: 3

开放问题: 1

类型:yii-extension

dev-master 2019-11-21 13:04 UTC

This package is not auto-updated.

Last update: 2022-08-06 07:45:19 UTC


README

Packagist package License

一组用于在 Yii 1.1 项目中操作 elasticsearch 的工具。包括兼容 CActiveDataProvider 的数据提供程序,一个 CActiveRecordBehavior 以及一个 elasticsearch 查询助手。

除了使应用程序能够通过 elasticsearch 进行快速搜索外,这些工具还能够在几乎零配置的情况下搜索关系中的内容。

特性

  • 无需 elasticsearch 背景
  • ElasticActiveRecordBehavior
    • 自动索引(记录插入/更新/删除时,文档会被添加到或从 elasticsearch 中删除)
    • 自动索引关系及其任意深度的关系(所需配置最少)
  • ElasticDataProvider
    • 与 CGridView、CListView 等兼容。使用 $model->elasticSearch() 代替 $model->search()
    • 完全兼容于 CActiveDataProvider,所有分页和排序都受支持
    • 搜索支持所有预期的操作符(支持 CDbCriteria->compare() 的所有操作符),>、<、>=、<> 等
    • 返回 CActiveRecord[],而不是 elasticsearch 文档,以实现最大兼容性
  • 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() 支持日期比较
  • 为关系字段创建一个模式缓存,因为它们现在总是被搜索以进行精确匹配
  • 支持模型和关系字段的聚合
  • 文档