zozocorp / elasticquent
将 Laravel Eloquent 模型映射到 Elasticsearch 类型。
Requires
- php: >=7.3.0
- elasticsearch/elasticsearch: ~6.1
- nesbot/carbon: ~1.0|~2
Requires (Dev)
- mockery/mockery: ^0.9.4|^1.0
- phpunit/phpunit: ~4.2|~5.0|~8.0|^9.0
This package is auto-updated.
Last update: 2024-09-07 09:05:19 UTC
README
Elasticsearch for Eloquent Laravel Models
Elasticquent 通过将它们映射到 Elasticsearch 类型,简化了使用 Elasticsearch 和 Eloquent 模型的操作。您可以使用默认设置或直接在模型中定义 Elasticsearch 应如何索引和搜索您的 Eloquent 模型。
Elasticquent 使用 官方 Elasticsearch PHP API。要开始使用,您应了解 Elasticsearch 的工作原理(索引、类型、映射等)。
Elasticsearch 要求
您必须运行 至少 Elasticsearch 1.0。Elasticsearch 0.9 及以下版本 将无法正常工作 且不受支持。
内容
报告问题
如果您发现任何问题,请随时使用 GitHub 的错误跟踪器 报告此项目的问题。
或者,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 文件
"zozocorp/elasticquent": "dev-master"
运行一次 composer update
后,您需要在您的 config/app.php
中注册 Laravel 服务提供者
'providers' => [ ... Elasticquent\ElasticquentServiceProvider::class, ],
我们还为 elasticsearch-php 客户端(使用我们的设置连接)提供了一个外观,如果需要,请将其添加到您的 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 将在配置文件中查找 default_index
键(config/elasticquent.php
)。要设置要使用的索引的默认值,您可以编辑此文件并设置 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\Collection
,chunk
方法将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调用的测试。
- 对路由的支持。