honvid / laravel-search
laravel 的一个搜索驱动插件。本扩展包提供了跨越多种全文搜索服务的统一 API
Requires
- php: ~7.0
- algolia/algoliasearch-client-php: ^1.26
- elasticsearch/elasticsearch: ^6.0
This package is not auto-updated.
Last update: 2024-09-26 16:52:05 UTC
README
laravel 的一个搜索驱动插件
本扩展包提供了跨越多种全文搜索服务的统一 API,它只是从 mmanos/laravel-search 分支出来,并将 Elasticsearch 更新到 ^6.0
。目前支持 Elasticsearch、Algolia 驱动。
通过 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 许可证 许可。