legalthings/elasticsearch-php

PHP版的Elasticsearch

0.2.0 2018-07-05 16:32 UTC

README

此库旨在提供一个简化的接口来使用Elasticsearch。内部使用原始的 elastic/elasticsearch-php 库。

如果需要,可以公开原始库的客户端并使用它。

需求

所需的PHP扩展由composer标记

安装

可以使用composer安装此库。

composer require legalthings/elasticsearch-php

客户端

要创建客户端,您需要传递 配置选项。如果没有提供任何选项,则自动使用 localhost:9200 作为主机。

use LegalThings/Elasticsearch;

$config = ['hosts' => 'elasticsearch.example.com:9200'];

$es = new Elasticsearch($config);

如果需要,您可以直接使用原始的 elastic/elasticsearch-php 客户端。

$info = $es->client->info();

配置

配置传递给Elasticsearch的配置构建器,这意味着您可以提供它接受的任何配置选项。有关更多信息,请参阅 此链接

如果要在配置中添加自定义键,请将 ["quiet" => true] 添加到配置中。如果没有提供quiet,当Elasticsearch遇到与Elasticsearch客户端无关的键时,将会抛出异常。

[
    'hosts' => ['localhost:9200'],
    'retries' => 2
]

搜索

使用 search() 方法在Elasticsearch中执行常见的、基本的搜索操作。

此方法自动 转换筛选器和文本搜索 到正确的Elasticsearch等效项,因此您无需手动进行此操作。

use LegalThings/Elasticsearch;

$es = new Elasticsearch($config);

$index = 'books';
$type = 'ancient';
$text = 'My book';
$fields = ['name'];
$filter = [
    'id' => '0001',
    'updated(max)' => '2017-01-01T00:00:00',
    'year(min)' => 1973,
    'published' => false
];
$sort = ['^year'];
$limit = 15;
$offset = 0;

$result = $es->search($index, $type, $text, $fields, $filter, $sort, $limit, $offset);
{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": null,
    "hits": [{
      "_index": "books",
      "_type": "ancient",
      "_id": "0001",
      "_score": null,
      "_source": {
        "id": "0001",
        "updated": "2017-01-01T00:00:00",
        "year": 1980,
        "published": false,
        "name": "My book two"
      },
      "sort": [1980]
    }]
  }
}

索引

使用 index() 方法在Elasticsearch中执行常见的、基本的索引操作。

use LegalThings/Elasticsearch;

$es = new Elasticsearch($config);
        
$index = 'books';
$type = 'ancient';
$id = '0001';
$data = [
    'id' => '0001',
    'updated' => '2017-01-01T00:00:00',
    'year' => 1980,
    'published' => false,
    'name' => 'My book two'
];

$result = $es->index($index, $type, $id, $data);
{
  "_index": "books",
  "_type": "ancient",
  "_id": "0001",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "created": true
}

更新

使用 update() 方法在Elasticsearch中执行常见的、基本的更新操作,该操作部分更新文档。

use LegalThings/Elasticsearch;

$es = new Elasticsearch($config);
        
$index = 'books';
$type = 'ancient';
$id = '0001';
$data = [
    'name' => 'My book three'
];

$result = $es->update($index, $type, $id, $data);
{
  "_index": "books",
  "_type": "ancient",
  "_id": "0001",
  "_version": 2,
  "result": "updated",
  "_shards": {
    "total": 0,
    "successful": 0,
    "failed": 0
  }
}

获取

使用 get() 方法在Elasticsearch中执行常见的、基本的获取操作。

use LegalThings/Elasticsearch;

$es = new Elasticsearch($config);
        
$index = 'books';
$type = 'ancient';
$id = '0001';

$result = $es->get($index, $type, $id);
{
  "_index": "books",
  "_type": "ancient",
  "_id": "0001",
  "_version": 1,
  "found": true,
  "_source": {
    "id": "0001",
    "updated": "2017-01-01T00:00:00",
    "year": 1980,
    "published": false,
    "name": "My book two"
  }
}

删除

使用 delete() 方法在Elasticsearch中执行常见的、基本的删除操作。

use LegalThings/Elasticsearch;

$es = new Elasticsearch($config);
        
$index = 'books';
$type = 'ancient';
$id = '0001';

$result = $es->delete($index, $type, $id);
{
  "found": true,
  "_index": "books",
  "_type": "ancient",
  "_id": "0001",
  "_version": 1,
  "result": "deleted",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  }
}

筛选器

此库使筛选Elasticsearch中的数据变得容易,因为您不需要将筛选器转换为特定的结构。有关更多示例,请参阅 测试。有关语法信息,请参阅 jasny筛选器

use LegalThings/ElasticFilter;

$filter = [
    'id' => '0001',
    'authors' => ['John', 'Jane'],
    'deleted' => null,
    'start_date(min)' => '2017-01-01T00:00:00',
    'end_date(max)' => '2018-01-01T00:00:00',
    'age(min)' => 25,
    'tags(not)' => ['foo', 'bar'],
    'published(not)' => null,
    'colors(any)' => ['blue', 'green'],
    'colors(none)' => ['red'],
    'category(all)' => ['A', 'B', 'C']
];

$ef = new ElasticFilter($filter);
$query = $ef->transform();

$this->assertEquals([
    'bool' => [
        'must' => [
            [ 'term' => [ 'id' => '0001' ] ],
            [ 'terms' => [ 'authors' => ['John', 'Jane'] ] ],
            [ 'missing' => [ 'field' => 'deleted' ] ],
            [ 'range' => [ 'start_date' => [ 'gte' => '2017-01-01T00:00:00' ] ] ],
            [ 'range' => [ 'end_date' => [ 'lte' => '2018-01-01T00:00:00' ] ] ],
            [ 'range' => [ 'age' => [ 'gte' => 25 ] ] ],
            [ 'terms' => [ 'colors' => [ 'blue', 'green' ] ] ],
            [ 'term' => [ 'category' => [ 'A', 'B', 'C' ] ] ]
        ],
        'must_not' => [
            [ 'terms' => [ 'tags' => [ 'foo', 'bar' ] ] ],
            [ 'missing' => [ 'field' => 'published' ] ],
            [ 'term' => [ 'colors' => [ 'red' ] ] ]
        ]
    ]
], $query);

或者,可以使用 流畅的接口 组合筛选器。这将输出与上面示例相同的查询。

use LegalThings/ElasticFilter;

$ef = new ElasticFilter();

$query = $ef->addDefaultFilter('id', '0001')
    ->addDefaultFilter('authors', ['John', 'Jane'])
    ->addDefaultFilter('deleted', null)
    ->addMinFilter('start_date', '2017-01-01T00:00:00')
    ->addMaxFilter('end_date', '2018-01-01T00:00:00')
    ->addMinFilter('age', 25)
    ->addNotFilter('tags', ['foo', 'bar'])
    ->addNotFilter('published', null)
    ->addAnyFilter('colors', ['blue', 'green'])
    ->addNoneFilter('colors', ['red'])
    ->addAllFilter('category', ['A', 'B', 'C'])
    ->transform();

$this->assertEquals([...], $query); // same output as first example

映射

此库包含预定义的 Elasticsearch映射,您可以使用它。有关更多信息,请参阅 此文件

use LegalThings/ElasticMap;

$es = new Elasticsearch($config);

$result = $es->client->indices()->create([
    'index' => 'my_index',
    'body' => ElasticMap::getFullTextSearchMapping()
]);