madewithlove/elasticsearcher

在 ElasticSearch PHP SDK 上构建的包装器,允许更容易地管理索引/文档/查询。

0.7.0 2022-04-14 11:36 UTC

README

checks

此包是一个中立的轻量级包装器,位于 Elasticsearch PHP 客户端 之上。其主要目标是允许在您的应用程序中更轻松地构建查询和索引。它不打算隐藏或替换 Elasticsearch PHP 客户端的任何功能。

安装

通过 composer 安装最新版本很简单

composer require madewithlove/elasticsearcher

版本

特性

查询类

在类中构建查询,以便在您的应用程序中更容易地进行监控。

class MoviesFrom2014Query extends AbstractQuery
{
	public function setup()
	{
		$this->searchIn('movies', 'movies');

		// Full notation
		$body = [
			'query' => [
				'bool' => [
					'filter' => [
						'term' => ['year' => 2014]
					]
				]
			]
		];
		$this->setBody($body);

		// Short (dotted) notation
		$this->set('query.bool.filter.term.year', 2014);

		$this->paginate(2, 20);
		$this->sortBy('name', 'asc');
	}
}

// Usage
$query = new MoviesFrom2014Query($this->getElasticSearcher());
$query->run();

使用自定义/可重用片段进行查询

将查询或索引中重复出现或复杂的片段移动到单独的类中。

class MoviesFrom2014Query extends AbstractQuery
{
	public function setup()
	{
		$this->searchIn('movies', 'movies');

		$this->set('query.bool.filter', [new YearFilter(2014)]);
	}
}

使用自定义结果解析进行查询

在查询返回结果之前对 Elasticsearch 的响应执行操作。它可以用于将 Elasticsearch 文档转换为 ORM 中的模型/实体。在多个查询中重用它。

class MoviesFrom2014Query extends AbstractQuery
{
	public function setup()
	{
		$this->searchIn('movies', 'movies');
		$this->parseResultsWith(new MoviesResultParser());

		$body = array(...);

		$this->setBody($body);
	}
}

// Usage
$query = new MoviesFrom2014Query($this->getElasticSearcher());
$result = $query->run();
foreach ($result->getResults() as $movie) {
	var_dump($movie->title, $movie->id, $movie->year);
}

索引管理

$searcher->indicesManager()->exists('listings');
$searcher->indicesManager()->create('suggestions');
$searcher->indicesManager()->update('suggestions');
$searcher->indicesManager()->delete('suggestions');

文档管理

$manager->index('suggestions', $data);
$manager->bulkIndex('suggestions', [$data, $data, $data]);
$manager->update('suggestions', 123, ['name' => 'Fight Club 2014']);
$manager->updateOrIndex('suggestions', 123, ['name' => 'Fight Club 2014']);
$manager->delete('suggestions', 123);
$manager->exists('suggestions', 123);
$manager->get('suggestions', 123);

集群健康

有时当您重新索引 ES 数据时,您可能会在索引重建和索引数据之间遇到一些问题。这是因为 ES 可能需要更长的时间来重建索引,导致重新索引任务失败 - 我们在这里谈论的是 微秒。您可以在 这里这里 找到一些参考。

为了避免这种情况,我们在 ElasticSearcher 类中构建了这个辅助程序来检查集群健康。您可以使用如下方式

<?php
/** @var \ElasticSearcher\ElasticSearcher $searcher */
while (!$searcher->isHealthy()) { sleep(1); }

将此放在您的重新索引命令中,在索引创建和数据索引之间。

注意:如果您正在运行单个 ES 节点,您需要将您的 elasticsearch number_of_replicas 设置配置为 0。然而,我们强烈建议您使用至少 2 个节点。

对 Elasticsearch 客户端的访问

该包不会也不打算实现 Elasticsearch 客户端的全部功能。始终可以访问客户端。

$client = $searcher->getClient();

用法

use ElasticSearcher\Environment;
use ElasticSearcher\ElasticSearcher;

$env = new Environment(
  ['hosts' => ['localhost:9200']]
);
$searcher = new ElasticSearcher($env);

更多用法请参阅 示例 和文档。

文档