帮酷LOGO
  • 显示原文与译文双语对照的内容
Maps Laravel Eloquent models to Elasticsearch types

  • 源代码名称:Elasticquent
  • 源代码网址:http://www.github.com/elasticquent/Elasticquent
  • Elasticquent源代码文档
  • Elasticquent源代码下载
  • Git URL:
    git://www.github.com/elasticquent/Elasticquent.git
  • Git Clone代码到本地:
    git clone http://www.github.com/elasticquent/Elasticquent
  • Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/elasticquent/Elasticquent
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
  • Elasticquent

    Elasticsearch用于 Eloquent Laravel 模型

    Elasticquent通过将它们映射到Elasticsearch类型,使它的与 ElasticsearchEloquent模型一起工作。 在模型中,你可以使用缺省设置或者定义Elasticsearch如何索引和搜索你的Eloquent模型。

    Elasticquent使用官方 Elasticsearch PHP API 。 首先,你应该对Elasticsearch如何工作有基本的了解。

    Elasticsearch要求

    你必须正在运行至少 Elasticsearch 1.0"。 Elasticsearch and和将不工作,不支持。

    电子邮件内容

    报告问题

    如果发现问题,请使用github跟踪器的 Bug 报告这里项目。

    或者,fork 该项目并发出请求请求:)

    概述

    Elasticquent允许你采用一个Eloquent的模型,并在Elasticsearch中轻松索引和搜索它的内容。

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

    搜索时,不要获取搜索结果的纯 array,而是获得一些特殊Elasticsearch功能的有效集合。

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

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

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

    查看有关如何开始使用Elasticsearch和Elasticquent的文档的其余部分 !

    Elasticquent的工作原理

    在使用数据库时,从数据库表读取的数据中填充有说服力的模型。 使用 Elasticquent,模型由Elasticsearch中索引的数据填充。 使用Elasticsearch进行搜索的整个想法是它的快速和光线,所以模型功能将由文档索引的数据决定。

    设置

    在开始使用Elasticquent之前,请确保已经安装了 Elasticsearch插件。

    要开始,请在 composer.json file: 中添加 Elasticquent

    "elasticquent/elasticquent":"dev-master"

    一旦你运行了 composer update,你需要在 config/app.php 中使用 register Laravel 服务提供商:

    'providers'=> [...ElasticquentElasticquentServiceProvider::class,],

    我们还为 elasticsearch php客户端( 使用我们的设置连接) 提供了一个外观,如果需要,将它的添加到 config/app.php

    'aliases'=> [...'Es'=>ElasticquentElasticquentElasticsearchFacade::class,],

    然后向你希望在Elasticsearch中索引的任何有说服力的模型添加Elasticquent特性:

    useElasticquentElasticquentTrait;classBookextendsEloquent{useElasticquentTrait;}

    现在你的Eloquent模型有一些额外的方法,可以使用Elasticsearch轻松地索引模型的数据。

    Elasticsearch配置

    默认情况下,Elasticquent将连接到 localhost:9200 并使用 default 作为索引 NAME,你可以在配置文件中更改这里设置和其他设置。 你可以以在 /app/config/elasticquent.php 为 Laravel 4添加 elasticquent.php 配置文件,或者者使用以下workbench命令将配置文件发布到 Laravel 5:

    $ php artisan vendor:publish --provider="ElasticquentElasticquentServiceProvider"
    <?phpreturnarray(/* |-------------------------------------------------------------------------- | 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构建索引和映射,但是也可以使用一些 helper 方法从模型中构建索引和类型。

    如果要创建索引的简单方法,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 密钥:

    returnarray(// 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',);

    如果希望具有更为动态的索引,还可以以使用 getIndexName 方法中的方法重写默认配置:

    functiongetIndexName(){return'custom_index_name';}

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

    设置自定义类型名称

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

    functiongetTypeName(){return'custom_type_name';}

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

    $typeExists=Book::typeExists();

    全文索引文档

    要将所有条目编入索引,请使用 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');

    基于的查询查询

    第二个是基于查询的查询,以查找更复杂的搜索需求:

    publicstaticfunctionsearchByQuery($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();

    访问碎片的array:

    $books->shards();

    访问最大得分:

    $books->maxScore();

    访问超时的布尔值属性:

    $books->timedOut();

    并访问took属性:

    $books->took();

    访问搜索聚合有关详细信息,请参见聚合:

    $books->getAggregations();

    全文搜索集合文档

    搜索结果集合中的项将包含来自Elasticsearch的一些额外数据。 你可以通过使用 isDocument 函数来检查模型是否为文档或者是否为文档:

    $book->isDocument();

    你可以检查Elasticsearch分配给这里文档的文档分数,方法如下:

    $book->documentScore();

    块结果来自 Elastiquent

    IlluminateSupportCollection 类似,chunk 方法将Elasticquent集合分解为给定大小的多个小集合:

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

    使用Elasticquent之外的搜索集合

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

    $client=newElasticsearchClient();$params=array('index'=>'default','type'=>'books');$params['body']['query']['match']['title'] ='Moby Dick';$collection=Book::hydrateElasticsearchResult($client->search($params));

    更多选项

    文档 id

    Elasticquent将使用任何设置为 primaryKey的作为Elasticsearch文档的for 。

    文档数据

    默认情况下,Elasticquent将对Elasticsearch文档使用整个属性 array 。 但是,如果要自定义搜索文档的结构,可以设置返回自己的自定义文档 array的getIndexDocumentData 函数。

    functiongetIndexDocumentData(){returnarray('id'=>$this->id,'title'=>$this->title,'custom'=>'variable' );}

    小心,因为Elasticquent在创建搜索结果集时读取文档源,所以要确保你要使用的模型功能的数据。

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

    如果使用自定义模型的自定义集合,只需将 ElasticquentCollectionTrait 添加到集合中,以便使用 addToIndex

    classMyCollectionextendsIlluminateDatabaseEloquentCollection{useElasticquentCollectionTrait;}

    路线图

    Elasticquent当前需要:

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



    Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语