michelmelo/laravel-search

Laravel 5|6|7 搜索包

0.0.8 2023-01-14 10:33 UTC

This package is auto-updated.

Last update: 2024-08-29 21:07:57 UTC


README

此包提供了一组统一的 API,用于访问多种不同的全文搜索引擎。目前支持以下驱动: ElasticsearchAlgoliaZendSearch(适用于本地使用)。

通过 Composer 安装

将以下内容添加到你的 composer.json 文件中,在 require 对象里

"michelmelo/laravel-search": "0.0.8"

之后,运行 composer install 安装此包。

将服务提供者添加到 app/config/app.php 文件中的 providers 数组。

'providers' => array(
	// ...
	'MichelMelo\Search\SearchServiceProvider',
)

或者

'providers' => array(
	// ...
	MichelMelo\Search\SearchServiceProvider::class,
)

将类别名添加到 app/config/app.php 文件中的 aliases 数组。

'aliases' => array(
	// ...
	'Search' => 'MichelMelo\Search\Facade',
)

配置

将默认配置文件发布到你的应用中,以便进行修改。

$ php artisan vendor:publish

或者

$ php artisan vendor:publish  --provider=MichelMelo\Search\SearchServiceProvider

依赖项

以下依赖项对于所列的搜索驱动是必需的

  • 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();

搜索操作

搜索一个文档

在“默认”索引中搜索具有 content 字段包含单词“fox”的文档

$results = Search::search('content', 'fox')->get();

搜索多个字段

$results = Search::search(array('title', 'content'), 'fox')->get();

搜索所有字段

$results = Search::search(null, 'fox')->get();

执行模糊搜索

执行模糊搜索以找到拼写类似但不是完全匹配的结果。例如,你想要返回包含单词“更新”的文档,通过搜索单词“update”来实现

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

其中参数为 latitudelongitudedistance(以米为单位)。

注意:目前,只有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();

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