kiendt/elasticquent

将 Laravel Eloquent 模型映射到 Elasticsearch 类型。

v1.0.6 2016-01-28 04:23 UTC

This package is auto-updated.

Last update: 2024-09-11 04:34:43 UTC


README

Elasticsearch for Eloquent Laravel Models

Elasticquent 通过将它们映射到 Elasticsearch 类型,使得使用 ElasticsearchEloquent 模型变得更容易。您可以使用默认设置,或者在模型中直接定义 Elasticsearch 如何索引和搜索您的 Eloquent 模型。

Elasticquent 使用 官方 Elasticsearch PHP API。要开始使用,您应该对 Elasticsearch 的工作原理有基本的了解(索引、类型、映射等)。

Elasticsearch 要求

您必须运行 至少 Elasticsearch 1.0。Elasticsearch 0.9 及以下版本 将无法工作,也不受支持。

内容

报告问题

如果您发现任何问题,请随时通过 GitHub 的 bug 跟踪器 报告此项目的问题。

或者,fork 项目并提交 pull request :)

概述

Elasticquent 允许您轻松地将 Eloquent 模型索引和搜索其内容在 Elasticsearch 中。

    $books = Book::where('id', '<', 200)->get();
    $books->addToIndex();

在搜索时,您将获得一个包含一些特殊 Elasticsearch 功能的 Eloquent 集合,而不是一个普通的搜索结果数组。

    $books = Book::search('Moby Dick');
    echo $books->totalHits();

此外,您仍然可以使用所有 Eloquent 集合功能

    $books = $books->filter(function ($book) {
        return $book->hasISBN();
    });

查看其余的文档,了解如何开始使用 Elasticsearch 和 Elasticquent!

Elasticquent 的工作原理

当使用数据库时,Eloquent 模型是从数据库表中读取的数据填充的。使用 Elasticquent,模型是通过在 Elasticsearch 中索引的数据填充的。使用 Elasticsearch 进行搜索的整个想法是它快速且轻量级,因此您模型的功能将由索引的文档数据来决定。

设置

在开始使用 Elasticquent 之前,请确保您已安装 Elasticsearch

要开始,将 Elasticquent 添加到您的 composer.json 文件中

"elasticquent/elasticquent": "dev-master"

运行一次 composer update 后,您需要在您的 config/app.php 中注册 Laravel 服务提供者

'providers' => [
    ...
    Elasticquent\ElasticquentServiceProvider::class,
],

我们还提供了一个用于 elasticsearch-php 客户端的 facade(使用我们的设置连接),如果您需要,请将以下内容添加到您的 config/app.php

'aliases' => [
    ...
    'Es' => Elasticquent\ElasticquentElasticsearchFacade::class,
],

然后将 Elasticquent 特性添加到任何您想要在 Elasticsearch 中索引的 Eloquent 模型中

use Elasticquent\ElasticquentTrait;

class Book extends Eloquent
{
    use ElasticquentTrait;
}

现在您的 Eloquent 模型有一些额外的功能,使使用 Elasticsearch 索引模型数据变得更容易。

Elasticsearch 配置

默认情况下,Elasticquent 将连接到 localhost:9200 并使用 default 作为索引名称,您可以在配置文件中更改这些以及其他设置。您可以在 Laravel 4 中将 elasticquent.php 配置文件添加到 /app/config/elasticquent.php,或使用以下 Artisan 命令将配置文件发布到您的配置目录(Laravel 5)

$ php artisan vendor:publish --provider="Elasticquent\ElasticquentServiceProvider"
<?php

return array(

    /*
    |--------------------------------------------------------------------------
    | Custom Elasticsearch Client Configuration
    |--------------------------------------------------------------------------
    |
    | This array will be passed to the Elasticsearch client.
    | See configuration options here:
    |
    | http://www.elasticsearch.org/guide/en/elasticsearch/client/php-api/current/_configuration.html
    */

    'config' => [
        'hosts'     => ['localhost:9200'],
        'retries'   => 1,
    ],

    /*
    |--------------------------------------------------------------------------
    | Default Index Name
    |--------------------------------------------------------------------------
    |
    | This is the index name that Elastiquent will use for all
    | Elastiquent models.
    */

    'default_index' => 'my_custom_index_name',

);

索引和映射

虽然您当然可以通过 Elasticsearch API 来构建索引和映射,但您也可以使用一些辅助方法直接从模型中构建索引和类型。

如果您想以简单的方式创建索引,Elasticquent模型提供了一个相应的功能。

Book::createIndex($shards = null, $replicas = null);

对于自定义分析器,您可以在模型中设置indexSettings属性,并从那里定义分析器。

    /**
     * The elasticsearch settings.
     *
     * @var array
     */
    protected $indexSettings = [
        'analysis' => [
            'char_filter' => [
                'replace' => [
                    'type' => 'mapping',
                    'mappings' => [
                        '&=> and '
                    ],
                ],
            ],
            'filter' => [
                'word_delimiter' => [
                    'type' => 'word_delimiter',
                    'split_on_numerics' => false,
                    'split_on_case_change' => true,
                    'generate_word_parts' => true,
                    'generate_number_parts' => true,
                    'catenate_all' => true,
                    'preserve_original' => true,
                    'catenate_numbers' => true,
                ]
            ],
            'analyzer' => [
                'default' => [
                    'type' => 'custom',
                    'char_filter' => [
                        'html_strip',
                        'replace',
                    ],
                    'tokenizer' => 'whitespace',
                    'filter' => [
                        'lowercase',
                        'word_delimiter',
                    ],
                ],
            ],
        ],
    ];

对于映射,您可以在模型中设置mappingProperties属性,并使用一些映射函数。

protected $mappingProperties = array(
   'title' => array(
        'type' => 'string',
        'analyzer' => 'standard'
    )
);

如果您想根据映射属性设置模型类型映射,可以使用以下方法:

    Book::putMapping($ignoreConflicts = true);

要删除映射

    Book::deleteMapping();

要重建(删除和重新添加,当您对映射进行重要更改时很有用)映射

    Book::rebuildMapping();

您还可以获取类型映射并检查其是否存在。

    Book::mappingExists();
    Book::getMapping();

设置自定义索引名称

默认情况下,Elasticquent将在配置文件(config/elasticquent.php)中查找default_index键。要设置要使用的索引的默认值,您可以编辑此文件并设置default_index键。

return array(

   // Other configuration keys ...
   
   /*
    |--------------------------------------------------------------------------
    | Default Index Name
    |--------------------------------------------------------------------------
    |
    | This is the index name that Elastiquent will use for all
    | Elastiquent models.
    */
    
   'default_index' => 'my_custom_index_name',
);

如果您想有一个更动态的索引,也可以通过在Eloquent模型内部覆盖默认配置的getIndexName方法来实现。

function getIndexName()
{
    return 'custom_index_name';
}

注意:如果没有指定索引,Elasticquent将使用硬编码的字符串default的值。

设置自定义类型名称

默认情况下,Elasticquent将使用模型的表名作为索引的类型名称。如果您想覆盖它,可以使用getTypeName函数。

function getTypeName()
{
    return 'custom_type_name';
}

要检查Elasticquent模型中的类型是否存在,请使用typeExists

    $typeExists = Book::typeExists();

索引文档

要索引Eloquent模型中的所有条目,请使用addAllToIndex

    Book::addAllToIndex();

您还可以索引模型集合。

    $books = Book::where('id', '<', 200)->get();
    $books->addToIndex();

您还可以索引单个条目。

    $book = Book::find($id);
    $book->addToIndex();

您还可以重新索引整个模型。

    Book::reindex();

搜索

在Elasticquent中有三种搜索方式。所有三种方法都返回一个搜索集合。

简单术语搜索

第一种方法是简单术语搜索,它搜索所有字段。

    $books = Book::search('Moby Dick');

基于查询的搜索

第二种是基于查询的搜索,用于更复杂的搜索需求。

    public static function searchByQuery($query = null, $aggregations = null, $sourceFields = null, $limit = null, $offset = null, $sort = null)

示例

    $books = Book::searchByQuery(array('match' => array('title' => 'Moby Dick')));

以下是可用参数的列表

  • query - 您的ElasticSearch查询
  • aggregations - 您希望返回的聚合。 有关聚合的详细信息,请参阅聚合
  • sourceFields - 限制返回集仅限于所选字段
  • limit - 要返回的记录数
  • offset - 设置记录偏移量(用于分页结果)
  • sort - 您的排序查询

原始查询

最后一种方法是发送到Elasticsearch的原始查询。这种方法在搜索Elasticsearch中的记录时将提供最大的灵活性。

    $books = Book::complexSearch(array(
        'body' => array(
            'query' => array(
                'match' => array(
                    'title' => 'Moby Dick'
                )
            )
        )
    ));

这相当于

    $books = Book::searchByQuery(array('match' => array('title' => 'Moby Dick')));

搜索集合

当您在Elasticquent模型上搜索时,您将获得一个带有一些特殊功能的搜索集合。

您可以获取总命中数

    $books->totalHits();

访问碎片数组

    $books->shards();

访问最大分数

    $books->maxScore();

访问超时布尔属性

    $books->timedOut();

以及访问took属性

    $books->took();

以及访问搜索聚合 - 有关聚合的详细信息,请参阅聚合

    $books->getAggregations();

搜索集合文档

搜索结果集合中的项目将包含来自Elasticsearch的一些额外数据。您可以使用isDocument函数始终检查模型是否是文档。

    $book->isDocument();

您可以使用以下方式检查Elasticsearch分配给该文档的文档分数

    $book->documentScore();

从 Elastiquent 分块结果

类似于Illuminate\Support\Collectionchunk方法将Elasticquent集合分割成多个给定大小的较小集合

    $all_books = Book::searchByQuery(array('match' => array('title' => 'Moby Dick')));
    $books = $all_books->chunk(10);

在 Elasticquent 外使用搜索集合

如果您正在处理来自Elasticquent之外的原始搜索数据,您可以使用Elasticquent搜索结果集合将该数据转换为集合。

$client = new \Elasticsearch\Client();

$params = array(
    'index' => 'default',
    'type'  => 'books'
);

$params['body']['query']['match']['title'] = 'Moby Dick';

$collection = Book::hydrateElasticsearchResult($client->search($params));

更多选项

文档ID

Elasticquent将使用Eloquent模型中设置的primaryKey作为Elasticsearch文档的id。

文档数据

默认情况下,Elasticquent会使用整个属性数组来处理您的Elasticsearch文档。但是,如果您想自定义搜索文档的结构,可以设置一个getIndexDocumentData函数,该函数返回您自己的自定义文档数组。

function getIndexDocumentData()
{
    return array(
        'id'      => $this->id,
        'title'   => $this->title,
        'custom'  => 'variable'
    );
}

请注意这一点,因为Elasticquent在创建搜索结果集合时将文档源读取到Eloquent模型属性中,所以请确保您索引了足够的数据以满足您想要使用的模型功能。

使用自定义集合与 Elasticquent 一起使用

如果您正在使用自定义集合与Eloquent模型,只需将ElasticquentCollectionTrait添加到您的集合中,这样您就可以使用addToIndex

class MyCollection extends \Illuminate\Database\Eloquent\Collection
{
    use ElasticquentCollectionTrait;
}

路线图

Elasticquent目前需要

  • 模拟ES API调用的测试。
  • 对路由的支持。