mmanos / laravel-search
Laravel 5 的搜索包。
Requires
- php: >=5.3.0
- illuminate/support: ~5.0
Requires (Dev)
- algolia/algoliasearch-client-php: 1.1.*
- elasticsearch/elasticsearch: 1.0.*@dev
- zendframework/zendsearch: dev-master
Suggests
- algolia/algoliasearch-client-php: Required for Algolia driver.
- elasticsearch/elasticsearch: Required for ElasticSearch driver.
- zendframework/zendsearch: Required for ZendSearch driver.
README
此包提供了一系列全文搜索服务的统一 API。目前支持以下驱动程序:Elasticsearch、Algolia 和 ZendSearch(适用于本地使用)。
通过 Composer 安装
将以下内容添加到 composer.json 文件中的 require 对象
"mmanos/laravel-search": "dev-master"
之后,运行 composer install 安装包。
将服务提供者添加到 app/config/app.php
中的 providers
数组。
'providers' => array( // ... 'Mmanos\Search\SearchServiceProvider', )
将类别名添加到 app/config/app.php
中的 aliases
数组。
'aliases' => array( // ... 'Search' => 'Mmanos\Search\Facade', )
Laravel 4
使用 0.0
分支或 v0.*
标签以支持 Laravel 4。
配置
将默认配置文件发布到您的应用程序中,以便您可以进行修改。
$ php artisan vendor:publish
依赖项
以下依赖项对于所列的搜索驱动程序是必需的
- ZendSearch:
zendframework/zendsearch
- Elasticsearch:
elasticsearch/elasticsearch
- Algolia:
algolia/algoliasearch-client-php
默认索引
此包提供了一个方便的语法来处理“默认”索引。编辑配置文件中的 default_index
字段以更改此值。如果您需要处理多个索引,请参阅下面的 处理多个索引。
索引操作
使用此包进行索引非常简单。只需提供文档的唯一标识符以及要索引的字段关联数组。
如果第一次访问不存在索引,将自动创建索引。
索引一个文档
将具有 id
为 "1" 的文档添加到 "默认" 索引。
Search::insert(1, array( 'title' => 'My title', 'content' => 'The quick brown fox...', 'status' => 'published', ));
注意:
id
可以是字符串或整数。此 id 用于删除记录,并在搜索结果中返回。
与文档一起存储额外参数
您可以将额外参数与文档一起存储,以便稍后可以从搜索结果中检索它们。这对于引用时间戳或其他记录标识符非常有用。
Search::insert( "post-1", array( 'title' => 'My title', 'content' => 'The quick brown fox...', 'status' => 'published', ), array( 'created_at' => time(), 'creator_id' => 5, ) );
注意: 额外参数不会索引,但会存储在索引中以供将来检索。
删除一个文档
从 "默认" 索引中删除具有 id
为 "1" 的文档。
Search::delete(1);
删除一个索引
Search::deleteIndex();
搜索操作
搜索一个文档
在 "默认" 索引中搜索包含单词 "fox" 的 content
字段的文档
$results = Search::search('content', 'fox')->get();
搜索多个字段
$results = Search::search(array('title', 'content'), 'fox')->get();
搜索所有字段
$results = Search::search(null, 'fox')->get();
执行模糊搜索
执行模糊搜索以找到拼写相似但不完全相同的搜索结果。例如,您想要通过搜索 "update" 返回包含单词 "updates" 的文档
$results = Search::search('content', 'update', array('fuzzy'=>true))->get();
注意: 您还可以为模糊参数传递介于 0 和 1 之间的数字值,其中接近 1 的值需要更高的相似度。默认值为 0.5。
将过滤器应用于查询
您也可以将过滤器应用于搜索查询。过滤器尝试将您指定的值匹配为整个“短语”。
$results = Search::search('content', 'fox') ->where('status', 'published') ->get();
注意: 如果值包含多个单词,则过滤器不保证整个字段值与整个短语完全匹配。
地理搜索
某些驱动程序支持基于位置搜索
$results = Search::search('content', 'fox') ->whereLocation(36.16781, -96.023561, 10000) ->get();
参数包括 纬度
、经度
和 距离
(以米为单位)。
注意: 目前,只有
algolia
驱动支持地理搜索。请确保每个索引记录包含位置信息:_geoloc => ['lat' => 1.23, 'lng' => 1.23]
。
限制结果集大小
$results = Search::search('content', 'fox') ->where('status', 'published') ->limit(10) // Limit 10 ->get(); $results = Search::search('content', 'fox') ->where('status', 'published') ->limit(10, 30) // Limit 10, offset 30 ->get();
分页结果集
您还可以使用 Laravel 分页器实例来分页结果集。
$paginator = Search::search('content', 'fox')->paginate(15);
限制从响应中返回的字段
$results = Search::select('id', 'created_at') ->search('content', 'fox') ->get();
链式搜索和过滤
$results = Search::select('id', 'created_at') ->where('title', 'My title') ->where('status', 'published') ->search('content', 'fox') ->search('content', 'quick') ->limit(10) ->get();
注意: 链式过滤器/搜索被构建为布尔查询,其中每个都必须提供匹配项。
删除与查询匹配的所有文档
Search::search('content', 'fox')->delete();
处理多个索引
如果您需要处理多个索引,在指定索引名称后,您可以访问上述所有相同的方法。
向名为 "posts" 的索引中添加一个文档
Search::index('posts')->insert(1, array( 'title' => 'My title', 'content' => 'The quick brown fox...', 'status' => 'published', ));
搜索 "posts" 索引中 content
字段包含单词 "fox" 且 status
为 "published" 的文档
$results = Search::index('posts')->search('content', 'fox') ->where('status', 'published') ->get();
从 "posts" 索引中删除具有 id
为 "1" 的文档
Search::index('posts')->delete(1);
删除整个 "posts" 索引
Search::index('posts')->deleteIndex();
高级查询回调
如果您需要更多控制搜索查询,您可以在所有条件添加到查询之后、查询执行之前添加一个回调函数。然后,您可以修改原生查询实例并将其返回以执行。
$results = Search::index('posts')->select('id', 'created_at') ->search('content', 'fox') ->addCallback(function ($query) { // Make changes to $query... return $query; }) ->get();
由于每个驱动都有自己的原生 $query
对象/数组,您可能只想为其中一个驱动执行回调
$results = Search::index('posts')->select('id', 'created_at') ->search('content', 'fox') ->addCallback(function ($query) { // Adjust pagination for an elasticsearch query array. $query['from'] = 0; $query['size'] = 20; return $query; }, 'elasticsearch') ->get();
注意: 您还可以将驱动程序数组作为第二个参数传递。