jakeboyles/laravel-searchy

Laravel Searchy 通过模糊搜索、基本字符串匹配、Levenshtein 距离等方式,简化了用户驱动的搜索。

2.0.2 2015-12-23 11:24 UTC

This package is not auto-updated.

Last update: 2024-09-20 10:59:42 UTC


README

Tom Lingham Laravel Searchy

Laravel 5+ Searchy

简化数据库搜索

Searchy 是一个易于使用、轻量级、仅支持 MySQL、Laravel 的包,它使在模型数据上运行用户驱动的搜索变得简单而有效。它使用伪模糊搜索和其他加权机制,具体取决于您启用的搜索驱动程序。它不需要在您的服务器上安装其他软件(因此可能比专用搜索程序慢一些),但可以在几分钟内设置并准备好使用。

!! Laravel 4 !!}

寻找 Laravel 4 兼容的 Searchy?查看 1.0 分支 :)

https://github.com/TomLingham/Laravel-Searchy/tree/1.0

安装

"tom-lingham/searchy" : "2.*" 添加到您的 composer.json 文件中的 require 部分

"require": {
	"laravel/framework": "5.*",
	"tom-lingham/searchy" : "2.*"
}

在您的终端中运行 composer update 以将包拉入您的 vendors 文件夹。

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

TomLingham\Searchy\SearchyServiceProvider::class

如果您希望在您的应用程序中快速访问它,请将别名添加到 Laravel 的 ./config/app.php 文件中的 aliases 数组

'Searchy' => TomLingham\Searchy\Facades\Searchy::class

使用方法

要使用 Searchy,您可以利用魔法方法。

如果您正在搜索 users 表中用户的名称和电子邮件列/字段,例如,您将运行

$users = Searchy::users('name', 'email')->query('John Smith')->get();

您也可以写成这样

$users = Searchy::search('users')->fields('name', 'email')->query('John Smith')->get();

在这种情况下,将您想要搜索的列传递给 fields() 方法。

这两个示例都返回包含您搜索结果的 Object 数组。如果您想对结果进行进一步操作,可以使用 getQuery() 替代 get() 返回数据库查询对象实例

$users = Searchy::search('users')->fields('name', 'email')->query('John Smith')
    ->getQuery()->having('relevance', '>', 20)->get();

搜索多个列

您还可以将多个参数添加到要搜索的列/字段列表中。

例如,如果您想搜索用户的名称、电子邮件地址和用户名,您可能会运行

$users = Searchy::users('name', 'email', 'username')->query('John Smith')->get();

搜索连接/连接的列

有时您可能想利用对连接列的搜索。例如,在 first_namelast_name 字段上,但您只想运行一个查询。为此,可以使用双冒号分隔列

$users = Searchy::users('first_name::last_name')->query('John Smith')->get();

仅返回特定列

您可以在搜索中指定要返回的列

$users = Searchy::users('first_name::last_name')->query('John Smith')->select('first_name')->get();

// Or you can swap those around...
$users = Searchy::users('first_name::last_name')->select('first_name')->query('John Smith')->get();

但是,这也会返回 relevance 别名列,无论在此处输入了什么。

## 配置

您可以将配置文件发布到您的 app 目录,并通过运行 php artisan vendor:publish 覆盖设置,将配置复制到您的 config 文件夹中的 searchy.php

您可以在配置文件中设置用于搜索的默认驱动程序。目前您的选项(在这个阶段)是:fuzzysimplelevenshtein

您还可以在运行搜索时使用以下语法覆盖这些方法

Searchy::driver('fuzzy')->users('name')->query('Batman')->get();

## 软删除

默认情况下,软删除不会包含在您的结果中。但是,如果您想包含软删除,可以通过以下语法实现。

Searchy::trashed()->users('name')->query('Batman')->get();

## 驱动程序

Searchy 利用 '驱动程序' 来处理您指定的字段的各种匹配条件。

驱动器简单地是一组特定的“匹配器”,根据特定条件匹配字符串。

目前只有三个驱动器:简单、模糊和Levenshtein(实验性)。

简单搜索驱动器

简单搜索驱动器仅使用3个匹配器,每个匹配器都有最适合我的测试环境的相关乘数。

protected $matchers = [
	'TomLingham\Searchy\Matchers\ExactMatcher'                 => 100,
	'TomLingham\Searchy\Matchers\StartOfStringMatcher'         => 50,
	'TomLingham\Searchy\Matchers\InStringMatcher'              => 30,
];

模糊搜索驱动器

模糊搜索驱动器是一组匹配器,设置如下。乘数是我使用的,但您可以随意更改这些或创建自己的驱动器,使用相同的匹配器和更改乘数以适应。

protected $matchers = [
	'TomLingham\Searchy\Matchers\ExactMatcher'                 => 100,
	'TomLingham\Searchy\Matchers\StartOfStringMatcher'         => 50,
	'TomLingham\Searchy\Matchers\AcronymMatcher'               => 42,
	'TomLingham\Searchy\Matchers\ConsecutiveCharactersMatcher' => 40,
	'TomLingham\Searchy\Matchers\StartOfWordsMatcher'          => 35,
	'TomLingham\Searchy\Matchers\StudlyCaseMatcher'            => 32,
	'TomLingham\Searchy\Matchers\InStringMatcher'              => 30,
	'TomLingham\Searchy\Matchers\TimesInStringMatcher'         => 8,
];

Levenshtein搜索驱动器(实验性)

Levenshtein搜索驱动器使用Levenshtein距离计算字符串之间的“距离”。它要求您在MySQL中有一个类似以下存储过程的存储过程:levenshtein(string1, string2)。在res文件夹中有一个包含适当函数的SQL文件 - 您可以使用此文件。

protected $matchers = [
	'TomLingham\Searchy\Matchers\LevenshteinMatcher' => 100
];

## 匹配器

ExactMatcher

匹配精确字符串并应用高乘数,将任何精确匹配项置于顶部。

StartOfStringMatcher

匹配以搜索字符串开头的字符串。例如,搜索“hel”将匹配;“Hello World”或“helping hand”

AcronymMatcher

匹配缩略词匹配,但不返回 Studly Case 匹配。例如,搜索“fb”将匹配;“foo bar”或“Fred Brown”,但不匹配“FreeBeer”。

ConsecutiveCharactersMatcher

匹配包含搜索字符串中所有字符的字符串,这些字符在字符串中相对位置。它还计算字符串中匹配的字符百分比,并根据此应用乘数。

例如,搜索“fba”将匹配;“Foo Bar”或“Afraid of bats”,但不匹配“fabulous”

StartOfWordsMatcher

匹配搜索中的每个单词与单词的起始位置。

例如,搜索“jo ta”将匹配;“John Taylor”或“Joshua B. Takeshi”

StudlyCaseMatcher

使用单词的首字母匹配 Studly Case 字符串

例如,搜索“hp”将匹配;“HtmlServiceProvider”或“HashParser”,但不匹配“hasProvider”

InStringMatcher

匹配字符串中的任何字符串出现,并且不区分大小写。

例如,搜索“smi”将匹配;“John Smith”或“Smiley Face”

TimesInStringMatcher

根据搜索字符串在字符串中出现的次数匹配字符串,然后对每次出现应用乘数。例如,搜索“tha”将匹配;“I hope that that cat has caught that mouse”(3 x 乘数)或“Thanks, it was great!”(1 x 乘数)

LevenshteinMatcher

参见Levenshtein驱动器

## 扩展

驱动器

创建自己的搜索驱动器非常简单。只需创建一个扩展TomLingham\Searchy\SearchDrivers\BaseSearchDriver的类,并添加一个名为$matchers的属性,其值为匹配器类数组的键和每个匹配器的乘数值。您可以从Searchy中已包含的类中选择,或者创建自己的类。

匹配器

要创建自己的匹配器,您可以创建一个扩展TomLingham\Searchy\Matchers\BaseMatcher的类,并且(对于简单的匹配器)重写formatQuery方法,以返回带有%通配符的字符串格式化。对于更高级的扩展,您可能需要重写buildQuery方法和其他方法。

## 贡献 & 报告错误

如果您想改进这里提供的代码,请随时提交拉取请求。

如果您发现任何错误,请在此处提交,我会尽快回应。请确保提供尽可能多的信息。