shader2k / search-indexer
零停机时间重新索引
Requires
- php: ^7.1 || ^8.0
- ext-json: *
- hassankhan/config: ^2.1
- vlucas/phpdotenv: ^3.6
Requires (Dev)
- mockery/mockery: ^1.0
- phpunit/phpunit: ^8
This package is auto-updated.
Last update: 2024-09-04 20:14:17 UTC
README
Elasticsearch 零停机时间重新索引
零停机时间模型重新索引
安装
通过 Composer 安装
composer require shader2k/search-indexer
配置
将 config 文件复制到 <projectRoot>/config/indexerconfig.php
配置参数
searchDriverFactories和dataProviderFactories- 系统中可用的驱动器和提供者(可以扩展现有,通过指定别名和类工厂)searchDriverNameDefault和dataProviderNameDefault- 默认驱动器和提供者的别名dataProviderChunkSize从模型获取数据的部分大小elasticsearchHost搜索引擎主机(ElasticSearch)
如有必要,可以将 .env 文件放置在项目根目录(.env.example)
使用
可索引模型必须 必须 实现接口 \Indexable\IndexableContract
实现的方法
-
getIndexableFields()应返回要添加到索引的列名数组 -
getIdentifierField()应返回用作 ID 的列名 -
getSearchDriverName()如果方法返回 null,将使用默认驱动器。如果指定驱动器名称,则将使用该驱动器进行索引 -
getProviderName()提供者名称。类似于getSearchDriverName()方法使用 -
getIndexName()索引名称(必须唯一),例如return __CLASS__; -
getIdentifierValue()ID 的值,例如return (string) $this->id;
包中包含 Traits\IndexableTrait 特质,可以在模型中使用以使用默认驱动器和提供者。
在项目中使用服务
建议以单例模式初始化服务
indexingModel()重新索引整个模型。在这种情况下,将创建一个新的索引,将模型索引到其中,然后,通过原子操作,将旧索引替换为新索引。indexingEntity()将一个实体添加到索引removeEntity()从索引中删除实体
$searchIndexer = new SearchIndexerService(new ProviderManager(), new DriverManager()); //переиндексация всей модели $searchIndexer->indexingModel(User::class); //переиндексация одной сущности $index = $searchIndexer->indexingEntity($entity); //удаление одной сущности $index = $searchIndexer->removeEntity($entity);
在 Laravel 项目中添加服务
在 AppServiceProvider.php 的 boot() 方法中声明服务为单例
$this->app->singleton('SearchIndexerService', function ($app) { return new SearchIndexerService(new ProviderManager(), new DriverManager()); });
使用服务
$indexerService = App::make('SearchIndexerService'); //переиндексация всей модели $indexerService->indexingModel(User::class); //переиндексация одной сущности $index = $indexerService->indexingEntity($entity); //удаление одной сущности $index = $indexerService->removeEntity($entity);
扩展包
可以通过添加额外的搜索引擎(例如 Sphinx、Elasticsearch)和数据提供者(例如 Eloquent、Doctrine)来扩展包
添加驱动器
需要实现驱动器工厂接口 DriverFactoryContract 和驱动器接口 DriverContract。将新驱动器添加到 config
'searchDriverFactories' => [ 'anyAlias' => '\YourRepository\DriverFactoryClass' ]
在实现驱动器的 prepareIndex 方法时,需要确保在重新索引整个模型的情况下($reindex 参数设置为 true)旧索引的无缝运行。重新索引后,通过原子操作将旧索引替换为新索引。
类似地,可以通过实现 ProviderFactoryContract 为工厂和 ProviderContract 为提供者来扩展提供者。将新提供者添加到 config
'dataProviderFactories' => [ 'anyAlias' => '\YourRepository\ProviderFactoryClass' ]