mmanos/laravel-search

Laravel 5 的搜索包。

v1.0.5 2017-06-29 20:11 UTC

README

此包提供了一系列全文搜索服务的统一 API。目前支持以下驱动程序:ElasticsearchAlgoliaZendSearch(适用于本地使用)。

通过 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();

注意: 您还可以将驱动程序数组作为第二个参数传递。