scout本身不提供全文检索,依赖所选引擎(如meilisearch、algolia或数据库);常见问题包括未启用searchable trait、tosearchablearray()未过滤敏感字段、scout_driver未配置、异步索引未监听队列、中文分词未适配等。

Scout 本身不提供全文检索能力,它只是个搜索驱动抽象层;真正生效的是你选的引擎(如 Algolia、Meilisearch 或数据库本地方案)。
为什么 scout:import 没效果?数据根本没进搜索引擎
常见错误是只运行了 php artisan scout:import,但没确认模型是否正确实现了 Searchable trait,也没检查 toSearchableArray() 返回值是否合理。
- 必须在模型里加
use Searchable;,且该模型需继承Model -
toSearchableArray()默认返回全部字段,但如果有敏感字段或大文本(如 HTML 内容),得手动过滤,否则影响索引体积和查询响应 - 运行前确保
SCOUT_DRIVER已设为有效值(如meilisearch),且对应服务正在运行并可连通 - 如果用 MySQL 全文索引(
database驱动),注意仅支持 MyISAM 或 InnoDB(5.6+)+fulltext索引,且scout:import实际只是刷新缓存,不建索引
search() 返回空数组?查的不是同一份数据源
最常踩的坑:数据库里刚插入一条记录,立刻调用 Model::search('xxx')->get() 却查不到——因为 Scout 默认异步更新索引(通过队列),而你没开队列监听。
- 开发时可临时关闭队列:
SCOUT_QUEUE=false,让索引更新同步执行 - 若坚持用队列,必须运行
php artisan queue:work,且确保QUEUE_CONNECTION配置正确(如sync、redis) - Meilisearch/Algolia 的搜索默认区分大小写和词干,比如搜
running不会匹配run,需提前配置settings开启typoTolerance或stemmer - 数据库驱动下
search()实际走的是MATCH ... AGAINST,只支持布尔模式或自然语言模式,不支持通配符前缀(*term)
怎么让中文也能搜?别指望默认配置
Scout 所有官方驱动默认按英文分词,对中文直接失效——Meilisearch 7.x+ 原生支持中文,但需显式启用;MySQL 则基本不可用。
- Meilisearch:建索引后立即发请求设置分词器:
curl -X POST 'http://localhost:7700/indexes/posts/settings' -H 'Content-Type: application/json' --data-binary '{"searchableAttributes": ["title", "content"], "distinctAttribute": null, "rankingRules": ["words", "typo", "proximity", "attribute", "sort", "exactness"]}',关键是它默认已启用中文分词(基于segment),但需确认 Meilisearch 版本 ≥ 0.29 - 避免用
database驱动处理中文全文检索,MySQL 的ft_min_word_len和编码限制太多,实际无法满足需求 - 如果用 Algolia,得自己实现中文分词逻辑(如用
jieba-php预处理),再把切词结果塞进toSearchableArray()
真正难的不是接上 Scout,而是选对引擎、配对分词、压住延迟——尤其当用户输入带错别字、中英文混排、或期望实时反馈时,本地数据库方案很快见底,这时候就得直面 Meilisearch 的配置细节或 Algolia 的费用模型。











