babenkoivan/elastic-adapter
Composer 安装命令:
composer require babenkoivan/elastic-adapter
包简介
Adapter for official PHP Elasticsearch client
README 文档
README
Elastic Adapter is an adapter for the official PHP Elasticsearch client. It's designed to simplify basic index and document operations.
Contents
- Compatibility
- Installation
- Configuration
- Index Management
- Document Management
- Point in Time Management
Compatibility
The current version of Elastic Adapter has been tested with the following configuration:
- PHP 8.2
- Elasticsearch 9.x
- Laravel 12.x
If your project uses older Elasticsearch, Laravel, or PHP version check the previous major version of the package.
Installation
The library can be installed via Composer:
composer require babenkoivan/elastic-adapter
Configuration
Elastic Adapter uses babenkoivan/elastic-client as a dependency. To change the client settings you need to publish the configuration file first:
php artisan vendor:publish --provider="Elastic\Client\ServiceProvider"
In the newly created config/elastic.client.php file you can define the default connection name and describe multiple
connections using configuration hashes. Please, refer to
the elastic-client documentation for more details.
Index Management
\Elastic\Adapter\Indices\IndexManager is used to manipulate indices.
Create
Create an index, either with the default settings and mapping:
$index = new \Elastic\Adapter\Indices\Index('my_index'); $indexManager->create($index);
or configured according to your needs:
$mapping = (new \Elastic\Adapter\Indices\Mapping()) ->text('title', [ 'boost' => 2, ]) ->keyword('tag', [ 'null_value' => 'NULL' ]) ->geoPoint('location') ->dynamic(true) ->dynamicTemplate('no_doc_values', [ 'match_mapping_type' => '*', 'mapping' => [ 'type' => '{dynamic_type}', 'doc_values' => false, ], ]); $settings = (new \Elastic\Adapter\Indices\Settings()) ->index([ 'number_of_replicas' => 2, 'refresh_interval' => -1 ]); $index = new \Elastic\Adapter\Indices\Index('my_index', $mapping, $settings); $indexManager->create($index);
Alternatively, you can create an index using raw input:
$mapping = [ 'properties' => [ 'title' => [ 'type' => 'text' ] ] ]; $settings = [ 'number_of_replicas' => 2 ]; $indexManager->createRaw('my_index', $mapping, $settings);
Drop
Delete an index:
$indexManager->drop('my_index');
Put Mapping
Update an index mapping using builder:
$mapping = (new \Elastic\Adapter\Indices\Mapping()) ->text('title', [ 'boost' => 2, ]) ->keyword('tag', [ 'null_value' => 'NULL' ]) ->geoPoint('location'); $indexManager->putMapping('my_index', $mapping);
or using raw input:
$mapping = [ 'properties' => [ 'title' => [ 'type' => 'text' ] ] ]; $indexManager->putMappingRaw('my_index', $mapping);
Put Settings
Update an index settings using builder:
$settings = (new \Elastic\Adapter\Indices\Settings()) ->analysis([ 'analyzer' => [ 'content' => [ 'type' => 'custom', 'tokenizer' => 'whitespace' ] ] ]); $indexManager->putSettings('my_index', $settings);
or using raw input:
$settings = [ 'number_of_replicas' => 2 ]; $indexManager->putSettingsRaw('my_index', $settings);
Exists
Check if an index exists:
$indexManager->exists('my_index');
Open
Open an index:
$indexManager->open('my_index');
Close
Close an index:
$indexManager->close('my_index');
Put Alias
Create an alias:
$alias = new \Elastic\Adapter\Indices\Alias('my_alias', true, [ 'term' => [ 'user_id' => 12, ], ]); $indexManager->putAlias('my_index', $alias);
The same with raw input:
$settings = [ 'is_write_index' => true, 'filter' => [ 'term' => [ 'user_id' => 12, ], ], ]; $indexManager->putAliasRaw('my_index', 'my_alias', $settings);
Get Aliases
Get index aliases:
$indexManager->getAliases('my_index');
Delete Alias
Delete an alias:
$indexManager->deleteAlias('my_index', 'my_alias');
Connection
Switch Elasticsearch connection:
$indexManager->connection('my_connection');
Document Management
\Elastic\Adapter\Documents\DocumentManager is used to manage and search documents.
Index
Add a document to the index:
$documents = collect([ new \Elastic\Adapter\Documents\Document('1', ['title' => 'foo']), new \Elastic\Adapter\Documents\Document('2', ['title' => 'bar']), ]); $documentManager->index('my_index', $documents);
There is also an option to refresh index immediately:
$documentManager->index('my_index', $documents, true);
Finally, you can set a custom routing:
$routing = (new \Elastic\Adapter\Documents\Routing()) ->add('1', 'value1') ->add('2', 'value2'); $documentManager->index('my_index', $documents, false, $routing);
Delete
Remove a document from the index:
$documentIds = ['1', '2']; $documentManager->delete('my_index', $documentIds);
If you want the index to be refreshed immediately pass true as the third argument:
$documentManager->delete('my_index', $documentIds, true);
You can also set a custom routing:
$routing = (new \Elastic\Adapter\Documents\Routing()) ->add('1', 'value1') ->add('2', 'value2'); $documentManager->delete('my_index', $documentIds, false, $routing);
Finally, you can delete documents using query:
$documentManager->deleteByQuery('my_index', ['match_all' => new \stdClass()]);
Search
Search documents in the index:
// configure search parameters $searchParameters = new \Elastic\Adapter\Search\SearchParameters(); // specify indices to search in $searchParameters->indices(['my_index1', 'my_index2']); // define the query $searchParameters->query([ 'match' => [ 'message' => 'test' ] ]); // configure highlighting $searchParameters->highlight([ 'fields' => [ 'message' => [ 'type' => 'plain', 'fragment_size' => 15, 'number_of_fragments' => 3, 'fragmenter' => 'simple' ] ] ]); // add suggestions $searchParameters->suggest([ 'message_suggest' => [ 'text' => 'test', 'term' => [ 'field' => 'message' ] ] ]); // enable source filtering $searchParameters->source(['message', 'post_date']); // collapse fields $searchParameters->collapse([ 'field' => 'user' ]); // aggregate data $searchParameters->aggregations([ 'max_likes' => [ 'max' => [ 'field' => 'likes' ] ] ]); // sort documents $searchParameters->sort([ ['post_date' => ['order' => 'asc']], '_score' ]); // rescore documents $searchParameters->rescore([ 'window_size' => 50, 'query' => [ 'rescore_query' => [ 'match_phrase' => [ 'message' => [ 'query' => 'the quick brown', 'slop' => 2, ], ], ], 'query_weight' => 0.7, 'rescore_query_weight' => 1.2, ] ]); // add a post filter $searchParameters->postFilter([ 'term' => [ 'cover' => 'hard' ] ]); // track total hits $searchParameters->trackTotalHits(true); // track scores $searchParameters->trackScores(true); // script fields $searchParameters->scriptFields([ 'my_doubled_field' => [ 'script' => [ 'lang' => 'painless', 'source' => 'doc[params.field] * params.multiplier', 'params' => [ 'field' => 'my_field', 'multiplier' => 2, ], ], ], ]); // runtime mappings $searchParameters->runtimeMappings([ 'day_of_week' => [ 'type' => 'long', 'script' => [ 'lang' => 'painless', 'source' => 'doc[params.field] * params.multiplier', 'params' => [ 'field' => 'my_field', 'multiplier' => 2, ], ], ], ]); // boost indices $searchParameters->indicesBoost([ ['my-alias' => 1.4], ['my-index' => 1.3], ]); // define the search type $searchParameters->searchType('query_then_fetch'); // set the preference $searchParameters->preference('_local'); // use pagination $searchParameters->from(0)->size(20); // search after $searchParameters->pointInTime([ 'id' => '46ToAwMDaWR5BXV1', 'keep_alive' => '1m', ]); $searchParameters->searchAfter([ '2021-05-20T05:30:04.832Z', 4294967298, ]); // use custom routing $searchParameters->routing(['user1', 'user2']); // enable explanation $searchParameters->explain(true); // set maximum number of documents to collect for each shard $searchParameters->terminateAfter(10); // enable caching $searchParameters->requestCache(true); // perform the search and get the result $searchResult = $documentManager->search($searchParameters); // get the total number of matching documents $total = $searchResult->total(); // get the corresponding hits $hits = $searchResult->hits(); // every hit provides access to the related index name, the score, the document, the highlight and more // in addition, you can get a raw representation of the hit foreach ($hits as $hit) { $indexName = $hit->indexName(); $score = $hit->score(); $document = $hit->document(); $highlight = $hit->highlight(); $innerHits = $hit->innerHits(); $innerHitsTotal = $hit->innerHitsTotal(); $raw = $hit->raw(); // get an explanation $explanation = $searchResult->explanation(); // every explanation includes a value, a description and details // it is also possible to get its raw representation $value = $explanation->value(); $description = $explanation->description(); $details = $explanation->details(); $raw = $explanation->raw(); } // get suggestions $suggestions = $searchResult->suggestions(); // get aggregations $aggregations = $searchResult->aggregations();
Connection
Switch Elasticsearch connection:
$documentManager->connection('my_connection');
Point in Time Management
\Elastic\Adapter\Search\PointInTimeManager is used to control points in time.
Open
Open a point in time:
$pointInTimeId = $pointInTimeManager->open('my_index', '1m');
Close
Close a point in time:
$pointInTimeManager->close($pointInTimeId);
Connection
Switch Elasticsearch connection:
$pointInTimeManager->connection('my_connection');
babenkoivan/elastic-adapter 适用场景与选型建议
babenkoivan/elastic-adapter 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 4.39M 次下载、GitHub Stars 达 40, 最近一次更新时间为 2019 年 12 月 05 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「php」 「client」 「adapter」 「elasticsearch」 「elastic」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 babenkoivan/elastic-adapter 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 babenkoivan/elastic-adapter 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 babenkoivan/elastic-adapter 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Adapter designed to add Framework Agnosticism for Caching within PHP Packages.
flysystem cache Adapter
Virtual Filesystem Storage Adapter for Laravel
A simple interface for composite Flysystem adapters
Mock PSR-18 HTTP client
Asynchronous MQTT client built on React
统计信息
- 总下载量: 4.39M
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 40
- 点击次数: 18
- 依赖项目数: 8
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2019-12-05