kennedytedesco/meilisearch-search-filter

构建 Meilisearch 查询过滤器的流畅直观方式。

v1.0 2023-08-30 13:31 UTC

This package is auto-updated.

Last update: 2024-08-30 01:49:56 UTC


README

Meilisearch 搜索过滤器

Build Status PHPStan License

这个零依赖库提供了一个构建 Meilisearch 查询过滤器的流畅直观方式。它通过提供可链式 API 简化了构建过滤器的过程。

安装

最低要求: PHP 8.1 或更高版本。

要在项目中使用此库,您可以使用 Composer 安装它

composer require kennedytedesco/meilisearch-search-filter "^1.0"

用法

您可以通过阅读官方文档了解 Meilisearch 过滤器的工作方式。

您还应该查看Meilisearch PHP SDK

以下是一些使用此库构建过滤器的示例

use Meilisearch\Client;
use KennedyTedesco\Meilisearch\SearchFilter\SearchFilter;

$client = new Client('http://127.0.0.1:7700', 'masterKey');

$filter = SearchFilter::new()
    ->where(function (SearchFilter $filter) {
        $filter->whereGreaterThan('rating.critics', 80)
            ->whereGreaterThanOrEqual('rating.users', 70);
    })
    ->whereIn('genres', ['Horror', 'Thriller']);

$index = $client->index('movies');

$results = $index->search('wonder', [
    // (rating.critics > 80 AND rating.users >= 70) AND genres IN ["Horror", "Thriller"]
    'filter' => $filter->build(),
]);

在构建过滤器时,您也可以使用别名方法

use KennedyTedesco\Meilisearch\SearchFilter\SearchFilter;

$filter = SearchFilter::new()
    ->where(function (SearchFilter $filter) {
        $filter->whereGt('rating.critics', 80)
            ->whereGte('rating.users', 70);
    })
    ->orWhereIn('genres', ['Horror', 'Thriller']);

echo $filter->build(); 

// Output: (rating.critics > 80 AND rating.users >= 70) OR genres IN ["Horror", "Thriller"]

或者,您可以使用 where(...) 方法,并将运算符作为第二个参数传递

use KennedyTedesco\Meilisearch\SearchFilter\SearchFilter;

$filter = SearchFilter::new()
    ->where(function (SearchFilter $filter) {
        $filter->where('rating.critics', '>', 80)
            ->where('rating.users', '>=', 70);
    })
    ->orWhereIn('genres', ['Horror', 'Thriller']);

echo $filter->build(); 

// Output: (rating.critics > 80 AND rating.users >= 70) OR genres IN ["Horror", "Thriller"]

使用范围

TO 运算符等价于 >=<=

更多详情请见此链接

use KennedyTedesco\Meilisearch\SearchFilter\SearchFilter;

$filter = SearchFilter::new()
    ->whereBetween('rating.critics', 80, 90);

echo $filter->build(); 

// Output: rating.critics 80 TO 90

如果您希望结果仅包括 1995 年 3 月之后发行的“喜剧”和“恐怖”电影,则必须对 OR 条件进行分组

use KennedyTedesco\Meilisearch\SearchFilter\SearchFilter;

$filter = SearchFilter::new()
    ->where(function (SearchFilter $filter) {
        $filter->where('genres', 'horror')
            ->orWhere('genres', 'comedy');
    })
    ->where('release_date', '>', '795484800');

echo $filter->build();

// Output: (genres = "horror" OR genres = "comedy") AND release_date > 795484800

因此,当您向 where()orWhere() 方法提供闭包时,一个新的 SearchFilter 实例被作为第一个参数传递给闭包。这允许您在括号内构建嵌套过滤器。

使用 when()

when() 方法允许您有条件地添加过滤器到查询中。例如

use KennedyTedesco\Meilisearch\SearchFilter\SearchFilter;

$filter = SearchFilter::new()
    ->when($request->filled('type'), function (SearchFilter $filter) use($request) {
        $filter->where('type', $request->get('type'));
    })
    ->where('release_date', '>', '795484800');

所有可用的过滤器方法

贡献

如果您想为此项目做出贡献,请随时提交拉取请求或在 GitHub 存储库中打开问题。