madewithlove / elasticsearcher
在 ElasticSearch PHP SDK 上构建的包装器,允许更容易地管理索引/文档/查询。
0.7.0
2022-04-14 11:36 UTC
Requires
- elasticsearch/elasticsearch: ^7.0
- jdrieghe/array-helpers: ^0.2.0
Requires (Dev)
- phpstan/phpstan: ^1.5
- phpunit/phpunit: ^9.5
This package is auto-updated.
Last update: 2024-09-14 16:44:58 UTC
README
此包是一个中立的轻量级包装器,位于 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);
更多用法请参阅 示例 和文档。