teamtnt/laravel-scout-tntsearch-driver

基于 https://github.com/teamtnt/tntsearch 的 Laravel Scout 搜索包驱动程序

资助包维护!
teamtnt

安装量: 1,838,222

依赖者: 36

建议者: 0

安全: 0

星标: 1,091

关注者: 18

分支: 142

开放问题: 15

v14.0.0 2024-03-16 22:37 UTC

README

Backers on Open Collective Sponsors on Open Collective Latest Version on Packagist Software License Build Status Quality Score Total Downloads

此包可轻松将全文搜索功能添加到您的模型中,支持 Laravel 5.3 到 9.0。

高级产品

如果您认为 TNT Search 是您的宝贵资产之一,请查看我们的高级产品之一

在 Open Collective 上支持我们

内容

安装

您可以通过 composer 安装此包

composer require teamtnt/laravel-scout-tntsearch-driver

添加服务提供者

// config/app.php
'providers' => [
    // ...
    TeamTNT\Scout\TNTSearchScoutServiceProvider::class,
],

请确保您也有 Laravel Scout 作为提供者,否则您将收到 "无法解析的依赖" 错误

// config/app.php
'providers' => [
    // ...
    Laravel\Scout\ScoutServiceProvider::class,
],

SCOUT_DRIVER=tntsearch 添加到您的 .env 文件

然后您应该将 scout.php 配置文件发布到您的配置目录

php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"

在您的 config/scout.php 中添加

'tntsearch' => [
    'storage'  => storage_path(), //place where the index files will be stored
    'fuzziness' => env('TNTSEARCH_FUZZINESS', false),
    'fuzzy' => [
        'prefix_length' => 2,
        'max_expansions' => 50,
        'distance' => 2,
	'no_limit' => true
    ],
    'asYouType' => false,
    'searchBoolean' => env('TNTSEARCH_BOOLEAN', false),
    'maxDocs' => env('TNTSEARCH_MAX_DOCS', 500),
],

为了防止您的搜索索引提交到您的项目仓库,请将以下行添加到您的 .gitignore 文件中。

/storage/*.index

可以将 asYouType 选项设置为每个模型的基础,以下是一个示例。

使用

在安装 scout 和 TNTSearch 驱动程序后,您需要将 Searchable 特性添加到您想要进行搜索的模型中。此外,通过在模型上定义 toSearchableArray 方法来定义您想要搜索的字段

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;

class Post extends Model
{
    use Searchable;

    public $asYouType = true;

    /**
     * Get the indexable data array for the model.
     *
     * @return array
     */
    public function toSearchableArray()
    {
        $array = $this->toArray();

        // Customize array...

        return $array;
    }
}

然后,像这样与搜索服务同步数据

php artisan scout:import App\\Post

如果您有很多记录并且想要加快速度,您可以运行(请注意,使用此方法后,您将无法在 toSearchableArray() 中使用模型关系)

php artisan tntsearch:import App\\Post

之后,您可以使用以下方式搜索您的模型

Post::search('Bugs Bunny')->get();

Scout 状态

php artisan scout:status

使用此简单命令,您将快速了解您的搜索索引。

Image of Scout Status Command

或者,您可以传递一个可搜索的模型参数

php artisan scout:status "App\Models\Post"

如果您的模型不在默认位置 app 或其子目录中,您可以将 modelPath 选项设置为

// config/scout.php
'tntsearch' => [
    // ...
    'modelPath' => 'models',
],

Image of Scout Status Command

约束

除了 where() 语句作为条件之外,您还可以使用 Eloquent 查询来约束您的搜索。这允许您考虑关系。

如果您使用此功能,则必须在控制器中定义所有查询之后调用搜索命令。

您已经知道的 where() 语句可以在任何地方应用。

namespace App\Http\Controllers;

use App\Post;

class PostController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {
        $post = new Post;

        // filter out posts to which the given topic is assigned
        if($request->topic) {
            $post = $post->whereNotIn('id', function($query){
                $query->select('assigned_to')->from('comments')->where('topic','=', request()->input('topic'));
            });
        }

        // only posts from people that are no moderators
        $post = $post->byRole('moderator','!=');

        // when user is not admin filter out internal posts
        if(!auth()->user()->hasRole('admin'))
        {
            $post= $post->where('internal_post', false);
        }

        if ($request->searchTerm) {
            $constraints = $post; // not necessary but for better readability
            $post = Post::search($request->searchTerm)->constrain($constraints);
        }

        $post->where('deleted', false);

        $post->orderBy('updated_at', 'asc');

        $paginator = $post->paginate(10);
        $posts = $paginator->getCollection();

        // return posts
    }
}

通过查询添加

searchable() 方法将分块查询的结果并添加到您的搜索索引中。

$post = Post::find(1);

// You may also add record via collection...
$post->searchable();

// OR

$posts = Post::where('year', '>', '2018')->get();

// You may also add records via collections...
$posts->searchable();

当使用约束时,请在添加约束后将其应用于查询,如上例所示。

排序

现在可以像 where() 语句一样将 orderBy() 语句应用于搜索查询。

当使用约束时,请在添加约束后将其应用于查询,如上例所示。

赞助商

成为赞助商,让您的标志出现在我们的 Github README 上,并提供链接到您的网站。[成为赞助商]

致谢

贡献者

这个项目的存在离不开所有贡献者。

赞助者

感谢所有赞助者!🙏 [成为赞助者]