honvid/laravel-search

laravel 的一个搜索驱动插件。本扩展包提供了跨越多种全文搜索服务的统一 API

v1.0 2018-06-11 07:02 UTC

This package is not auto-updated.

Last update: 2024-09-26 16:52:05 UTC


README

laravel 的一个搜索驱动插件

本扩展包提供了跨越多种全文搜索服务的统一 API,它只是从 mmanos/laravel-search 分支出来,并将 Elasticsearch 更新到 ^6.0。目前支持 ElasticsearchAlgolia 驱动。

通过 Composer 安装

使用以下命令安装包

composer require honvid/laravel-search

之后,你应该添加服务提供者

它支持包自动发现。如果你的 Laravel 版本高于 5.5,请跳过此步骤。

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

'providers' => array(
	// ...
	'Honvid\Providers\SearchServiceProvider',
)

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

'aliases' => array(
	// ...
	'Search' => 'Honvid\Facades\Search',
)

配置

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

$ php artisan vendor:publish --provider="Honvid\Providers\SearchServiceProvider"

依赖

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

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

执行模糊搜索

执行模糊搜索以找到拼写相似但不是精确匹配的结果。例如,你想要返回包含单词 "updates" 的文档,通过搜索单词 "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();

参数包括 latitude(纬度)、longitude(经度)和 distance(距离,单位:米)。

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

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

许可证

Laravel-Search 包是开源软件,根据 MIT 许可证 许可。