0

我想这样做,以便我可以根据 Meil​​isearch 和 Laravel scout 无法搜索的列过滤结果。

所以想象一个“评论”表,有以下可搜索的列:

public function toSearchableArray() {
    $array = Arr::only(
        $this->toArray(),
        ['id','title', 'link', 'raw_text', 'subchan', 'nsfw']
    );
    
    return $array;  
}

但只能在特定日期之后获得结果:

Comment::search($query, ['filters' => 'created_at > 795484800'])

为此,我需要添加created_at侦察兵的 toSearchableArray。这样做的问题是,当用户搜索时,created_at也会查询来自的结果。

4

1 回答 1

3

如果我理解正确,您希望能够基于created_at列进行过滤,但它不应该是可搜索的,即输入“795”作为查询不应该返回“795”是时间戳一部分的所有结果?

我认为 Scout 目前不会允许您以简单的方式实现这一目标,但它仍然应该是可能的。

第 1 步是将created_at列添加到toSearchableArray()方法中。这将确保数据被 Meil​​i 索引。

第 2 步是更改模型可搜索的索引配置,以便从可搜索属性created_at列表中排除。这是伪代码且未记录在案,但应如下所示:

$dummy = new Comment();

// Should resolve to an engine: https://github.com/laravel/scout/blob/f8aa3c3182fe97f56a6436fd0b28fcacfcbabc11/src/Searchable.php#L279
$engine = $dummy->searchableUsing();

// Should resolve to MeiliSearch\Endpoints\Indexes via a magic method that resolves the underlying Meili driver:
// https://github.com/laravel/scout/blob/33bbff0e3bfb1abd0ea34236c331fc17cdeac0bc/src/Engines/MeiliSearchEngine.php#L298
// ->
// https://github.com/meilisearch/meilisearch-php/blob/f25ee49b658f407af3d3f1f9a402997e7974b6bb/src/Delegates/HandlesIndex.php#L23
$index = $engine->index($dummy->searchableAs());

// https://github.com/meilisearch/meilisearch-php/blob/f25ee49b658f407af3d3f1f9a402997e7974b6bb/src/Endpoints/Delegates/HandlesSettings.php#L55
$index->updateSearchableAttributes(
    ['id','title', 'link', 'raw_text', 'subchan', 'nsfw']
);

一旦created_at被索引但不可搜索,您想要过滤该值。梅里有数值运算符

第 3 步是使用 Scout进行自定义搜索:

Comment::search($query, function (Indexes $meilisearch, $query, $options) {
    $options['filters'] = 'created_at>795484800';

    return $meilisearch->search($query, $options);
});

同样,这是伪代码——我还没有测试过它的任何部分。如果 Scout 支持在创建时自定义索引设置或公开更新设置的方法,例如允许您在配置文件中添加驱动程序特定设置,我将不胜感激。

于 2021-06-15T14:33:14.203 回答