babenkoivan/elastic-mate

此包已废弃,不再维护。没有建议的替代包。

Elasticsearch 管理工具

v0.1.0 2018-12-15 10:39 UTC

This package is auto-updated.

Last update: 2020-01-23 18:22:39 UTC


README

Packagist Packagist Build Status Donate

Elastic mate 是一个工具,它简化了文档和索引管理。这只是一个包的早期版本,因此某些功能可能无法按预期工作,或者您可能在文档中找到一些不准确之处。

内容

基本使用

快速链接

安装

使用 composer 安装包

composer require babenkoivan/elastic-mate

配置

您只需配置客户端即可开始使用该包

use BabenkoIvan\ElasticMate\Infrastructure\Client\ClientFactory;
use BabenkoIvan\ElasticMate\Core\EntityManagers\IndexManager;
use BabenkoIvan\ElasticMate\Core\EntityManagers\BulkDocumentManager;

// create Elastic Search client instance
$client = ClientFactory::fromConfig([
  'hosts' => [
      'localhost:9200'
  ]
]);

// pass client to managers
$indexManager = new IndexManager($client);
$documentManager = new BulkDocumentManager($client);

了解更多有关可能的配置选项 这里

索引操作

创建

官方文档中了解更多有关索引创建的信息。

use BabenkoIvan\ElasticMate\Infrastructure\Client\ClientFactory;
use BabenkoIvan\ElasticMate\Core\EntityManagers\IndexManager;
use BabenkoIvan\ElasticMate\Core\Settings\Analysis;
use BabenkoIvan\ElasticMate\Core\Settings\Analyzers\StandardAnalyzer;
use BabenkoIvan\ElasticMate\Core\Settings\Settings;
use BabenkoIvan\ElasticMate\Core\Mapping\Mapping;
use BabenkoIvan\ElasticMate\Core\Mapping\Properties\TextProperty;
use BabenkoIvan\ElasticMate\Core\Entities\Index;

// create Elastic Search client instance
$client = ClientFactory::fromConfig([
  'hosts' => [
      'localhost:9200'
  ]
]);

// pass client to an index manager
$indexManager = new IndexManager($client);

// configure your index
$analysis = (new Analysis())
    ->addAnalyzer(new StandardAnalyzer('content_analyzer'));
    
$settings = (new Settings())
    ->setNumberOfShards(1)
    ->setAnalysis($analysis);

$mapping = (new Mapping())
    ->setSourceEnabled(false)
    ->addProperty((new TextProperty('content'))->setAnalyzer('content_analyzer'));

$index = (new Index('my_index'))
    ->setSettings($settings)
    ->setMapping($mapping);

// create the index
$indexManager->create($index);

了解更多有关支持的 设置映射

更新设置

官方文档中了解更多有关索引设置更新的信息。

use BabenkoIvan\ElasticMate\Infrastructure\Client\ClientFactory;
use BabenkoIvan\ElasticMate\Core\EntityManagers\IndexManager;
use BabenkoIvan\ElasticMate\Core\Settings\Analysis;
use BabenkoIvan\ElasticMate\Core\Settings\Analyzers\StandardAnalyzer;

// create Elastic Search client instance
$client = ClientFactory::fromConfig([
  'hosts' => [
      'localhost:9200'
  ]
]);

// pass client to an index manager
$indexManager = new IndexManager($client);

// configure your index settings
$analysis = (new Analysis())
    ->addAnalyzer(new StandardAnalyzer('content_analyzer'));
    
$index->getSettings()
    ->setAnalysis($analysis);

// update the index settings
$indexManager->updateSettings($index);

// you can force settings update, that will cause index closing and opening it again after update
$indexManager->updateSettings($index, true);

了解更多有关支持的 设置

更新映射

官方文档中了解更多有关映射更新的信息。

use BabenkoIvan\ElasticMate\Infrastructure\Client\ClientFactory;
use BabenkoIvan\ElasticMate\Core\EntityManagers\IndexManager;
use BabenkoIvan\ElasticMate\Core\Mapping\Properties\TextProperty;

// create Elastic Search client instance
$client = ClientFactory::fromConfig([
  'hosts' => [
      'localhost:9200'
  ]
]);

// pass client to an index manager
$indexManager = new IndexManager($client);

// configure your index mapping
$index->getMapping()
    ->addProperty(new TextProperty('content'));

// update the index mapping
$indexManager->updateMapping($index);

了解更多有关支持的 映射属性

删除

官方文档中了解更多有关索引删除的信息。

use BabenkoIvan\ElasticMate\Infrastructure\Client\ClientFactory;
use BabenkoIvan\ElasticMate\Core\EntityManagers\IndexManager;

// create Elastic Search client instance
$client = ClientFactory::fromConfig([
  'hosts' => [
      'localhost:9200'
  ]
]);

// pass client to an index manager
$indexManager = new IndexManager($client);

// delete an index
$indexManager->delete($index);

文档操作

索引

官方文档中了解更多有关文档索引 API 的信息。

use BabenkoIvan\ElasticMate\Infrastructure\Client\ClientFactory;
use BabenkoIvan\ElasticMate\Core\EntityManagers\BulkDocumentManager;
use BabenkoIvan\ElasticMate\Core\Entities\Document;
use BabenkoIvan\ElasticMate\Core\Content\Content;

// create Elastic Search client instance
$client = ClientFactory::fromConfig([
  'hosts' => [
      'localhost:9200'
  ]
]);

// pass client to a document manager
$documentManager = new BulkDocumentManager($client);

// define your documents
$documents = collect([
    new Document('1', new Content(['name' => 'foo'])),
    new Document('2', new Content(['name' => 'bar']))
]);

// index the documents
$documentManager->index($index, $documents);

// you can force document indexation, that will cause immidiate index refresh
$documentManager->index($index, $documents, true);

删除

官方文档中了解更多有关文档删除 API 的信息。

use BabenkoIvan\ElasticMate\Infrastructure\Client\ClientFactory;
use BabenkoIvan\ElasticMate\Core\EntityManagers\BulkDocumentManager;

// create Elastic Search client instance
$client = ClientFactory::fromConfig([
  'hosts' => [
      'localhost:9200'
  ]
]);

// pass client to a document manager
$documentManager = new BulkDocumentManager($client);

// delete the documents
$documentManager->delete($index, $documents);

// you can force document deletion, that will cause immidiate index refresh
$documentManager->delete($index, $documents, true);

搜索

官方文档中了解更多关于搜索API的信息。

use BabenkoIvan\ElasticMate\Infrastructure\Client\ClientFactory;
use BabenkoIvan\ElasticMate\Core\EntityManagers\BulkDocumentManager;
use BabenkoIvan\ElasticMate\Core\Search\Queries\MatchAllQuery;
use BabenkoIvan\ElasticMate\Core\Search\Sort\Simple\SimpleSort;
use BabenkoIvan\ElasticMate\Core\Search\Sort\Simple\FieldSort;
use BabenkoIvan\ElasticMate\Core\Search\Pagination;
use BabenkoIvan\ElasticMate\Core\Search\Request;

// create Elastic Search client instance
$client = ClientFactory::fromConfig([
  'hosts' => [
      'localhost:9200'
  ]
]);

// pass client to a document manager
$documentManager = new BulkDocumentManager($client);

// create a search query
$query = new MatchAllQuery();

// define the way your want documents to be sorted
$sort = new SimpleSort(collect([
    new FieldSort('_id', 'asc')
]));

// specify from and size parameters for pagination
$pagination = new Pagination(20, 10);

// create a search request
$request = (new Request($query))
    ->setSort($sort)
    ->setPagination($pagination);

// execute the request and receive a search result
$response = $documentManager->search($index, $request);

// get documents from response
$response->getDocuments();

// get number of documents, that satisfy the query
$response->getTotal();

阅读更多关于支持的搜索查询

内容突变器

当你处理文档内容时,通常你操作的是原始类型。如果你想将自定义类型用作属性值,请按照以下示例配置该属性的突变器。

use BabenkoIvan\ElasticMate\Core\Contracts\Content\Mutator;
use DateTimeImmutable;
use BabenkoIvan\ElasticMate\Core\Mapping\Properties\DateProperty;
use BabenkoIvan\ElasticMate\Core\Mapping\Mapping;
use BabenkoIvan\ElasticMate\Core\Entities\Document;
use BabenkoIvan\ElasticMate\Core\Content\Content;

// declare mutator
class MyDateTimeMutator implements Mutator
{
    /**
     * @var string
     */
    private $format;

    /**
     * @param string $format
     */
    public function __construct(string $format)
    {
        $this->format = $format;
    }

    /**
     * @param DateTimeImmutable $value
     * @return string
     */
    public function toPrimitive($value)
    {
        return $value->format($this->format);
    }

    /**
     * @param string $value
     * @return DateTimeImmutable
     */
    public function fromPrimitive($value)
    {
        return DateTimeImmutable::createFromFormat($this->format, $value);
    }
}

// set mutator in your property
$dateTimeProperty = (new DateProperty('my_datetime_property'))
    ->setFormat('yyyy-MM-dd HH:mm:ss')
    ->setMutator(new MyDateTimeMutator('Y-m-d H:i:s'));
    
$mapping = (new Mapping())
   ->addProperty($dateTimeProperty);

// create an index
// ...   

// now you can use DateTimeImmutable in document content, whenever you define a new document or retrieve one from search results
$document = new Document('1', new Content([
  'my_datetime_property' => new DateTimeImmutable()
]));