Laravel Scout/Meilisearch -按不可搜索列过滤

2fjabf4q  于 2022-11-18  发布在  其他
关注(0)|答案(3)|浏览(297)

我想使它,以便我可以过滤结果的基础上,一个列是不可搜索的梅利搜索和拉拉威尔侦察。
因此,设想一个“Comment”表,其中包含以下可搜索列:

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 scout添加到SearchableArray中。这样做的问题是,当用户搜索时,来自created_at的结果也会被查询。

efzxgjgh

efzxgjgh1#

如果我没有理解错的话,您希望能够基于created_at列进行过滤,但它不应该是可搜索的,即输入“795”作为查询不应该返回所有结果,其中“795”是时间戳的一部分?
我不认为Scout会让你以一种简单的方式实现这一点,但它仍然是可能的。
第一步是将created_at列添加到toSearchableArray()方法中,这样可以确保数据被美丽索引。
第二步是修改索引的配置,在索引中你的模型是可搜索的,以便从可搜索属性列表中排除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能实现对自定义索引设置的支持,或者公开一种更新设置的方法,例如允许您在配置文件中添加驱动程序特定的设置,我将非常感激。

qni6mghb

qni6mghb2#

我用Meilisearch的可过滤属性解决了这个问题。但是在运行搜索之前需要配置它。我用php artisan tinker解决了这个问题,如下所示,你可能需要写一个Artisor命令来完成。

$client = new MeiliSearch\Client('https://url_to_meilisearch_instance:7700');

$client->index('comments_index')->updateFilterableAttributes(['created_at']); // Replace your index_name

如果你有一个相当大的数据集,你可能需要运行下面的命令来检查状态:

$client->index('comments_index')->stats();

如果响应包含isIndexing => false,就可以开始了。

Comment::search($query)->where('created_at', '>', 795484800)->get();
htzpubme

htzpubme3#

我花了无数个小时调试并让日期过滤器工作。
当where子句只接受两个参数时,这将不起作用

Comment::search($query)->where('created_at', '>', 795484800)->get();

这也不会起作用,因为传递的参数不是scout库中支持的两个选项的一部分

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

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

我的解决方案,每个人都在那里试图让这个工作是使用以下:

$results = Event::search(
            query: $request->get('query'),
            callback: function (Indexes $meilisearch, $query, array $options) use ($request, $from, $to) {
                
                $options['filter'] = "from <= 1667692800";
                // dd($options);
                return $meilisearch->rawSearch(
                    $query,
                    $options,
                );
            },
        )->paginate();

希望这能帮助其他有问题的人,因为这浪费了我早上寻找解决方案的时间,直到我决定在库中挖掘代码。

相关问题