shader2k/search-indexer

零停机时间重新索引

1.0 2021-01-04 09:31 UTC

This package is auto-updated.

Last update: 2024-09-04 20:14:17 UTC


README

PHPUnit

Elasticsearch 零停机时间重新索引

零停机时间模型重新索引

安装

通过 Composer 安装

composer require shader2k/search-indexer

配置

将 config 文件复制到 <projectRoot>/config/indexerconfig.php

配置参数

  • searchDriverFactoriesdataProviderFactories - 系统中可用的驱动器和提供者(可以扩展现有,通过指定别名和类工厂)
  • searchDriverNameDefaultdataProviderNameDefault - 默认驱动器和提供者的别名
  • 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'
]