Laravel Scout结合Meilisearch如何基于非可搜索列过滤结果
Laravel Scout 对接 Meilisearch 非可搜索字段过滤解决方案
核心逻辑
Meilisearch 存在三类互相独立的字段配置规则,互不影响:
toSearchableArray定义的是会同步到 Meilisearch 索引的字段,只是同步范围,不决定搜索/过滤能力searchableAttributes定义的是用户输入关键词时,会参与全文匹配的字段filterableAttributes定义的是可以作为过滤条件使用的字段
你需要的效果只需要把created_at加入同步范围,但是排除出可搜索字段,同时加入过滤字段即可。
具体操作步骤
- 修改
toSearchableArray,加入created_at字段
public function toSearchableArray() { $array = Arr::only( $this->toArray(), ['id','title', 'link', 'raw_text', 'subchan', 'nsfw', 'created_at'] ); return $array; }
- 在Comment模型中定义Meilisearch的索引属性配置(Laravel Scout 9+ 原生支持)
// 定义用户搜索时参与匹配的字段,不包含created_at public function getSearchableAttributes(): array { return ['title', 'link', 'raw_text', 'subchan', 'nsfw']; } // 定义可作为过滤条件的字段,加入created_at public function getFilterableAttributes(): array { return ['created_at', 'nsfw']; }
如果你使用的是低于9.0版本的Laravel Scout,可以直接通过Meilisearch的管理面板或者API手动修改对应索引的
searchableAttributes和filterableAttributes配置,效果一致。
- 同步索引配置并重新导入数据
# 同步新的索引属性配置到Meilisearch php artisan scout:sync-index-settings # 重新导入Comment数据,把之前缺失的created_at字段同步到索引 php artisan scout:import "App\Models\Comment"
效果验证
配置完成后你的原有过滤代码可以正常运行,同时用户搜索任意关键词时,不会匹配到created_at字段的内容。
// 过滤逻辑正常生效 Comment::search($query, ['filters' => 'created_at > 795484800'])->get();
内容的提问来源于stack exchange,提问作者Felix
相关产品推荐
相关产品推荐

