Scout 风格 API
search、where、orderBy、paginate,迁移主要换一个 trait。
Searchable trait 把模型、观察者与查询构建器串起来,搜索请求最终交给统一的 Engine 契约。
配置根能从 Webman 插件路径、SCOUT_CONFIG_KEY、Yii params 或 Scout::configure() 解析,同一份代码跑在六种框架与原生 PHP 上。
探探,一只拿着放大镜的侦察犬,嗅出文档、建立索引,再按需把它们找回来。
嗅一嗅,文档就排好队了。模型、构建器与引擎之间只有一层契约。
search、where、orderBy、paginate,迁移主要换一个 trait。
OpenSearch、Elasticsearch、Meilisearch 等九种引擎。
时间范围、地理距离、全文检索、KNN 向量排序与分面聚合。
saved、deleted、restored 事件触发写入,支持软删除文档。
Webman Redis Queue 可用时异步,缺失时记录日志并降级同步。
Webman、Laravel、Hyperf、ThinkPHP、Yii2、Yii3 与原生 PHP。
PHP 版本之外,同一套搜索能力也有 Rust 与 Go 实现。
版本记录来自真实提交与发布。
支持 Laravel 13 与 symfony/console 8,依赖解析跟上新框架栈。
修复 symfony/console 8.x 下的安装失败与致命错误。
新增原生 PHP 配置入口与项目宠物,集中修复一轮审查问题。
新增多框架接入支持,并补齐对应文档。
点击图片放大查看。
先安装,再跑一个最小示例。
composer require erikwang2013/webman-scoutuse Erikwang2013\WebmanScout\Searchable;
use support\Model;
class Product extends Model
{
use Searchable;
public function searchableAs(): string
{
return 'products';
}
}
$products = Product::search('phone')
->where('status', 1)
->paginate(15);cargo add rust-scout
cargo add tokio --features macros,rt
cargo add serde_jsonuse rust_scout::{Engine, EngineManager, ScoutConfig, SearchBuilder, SearchDocument};
#[tokio::main]
async fn main() -> rust_scout::Result<()> {
let engine = EngineManager::new(ScoutConfig::collection()).engine()?;
let doc = SearchDocument::new("book-1", serde_json::json!({
"title": "Programming Rust"
}))?;
engine.update(&[doc]).await?;
let result = engine
.search(SearchBuilder::new("rust").within("default").take(10))
.await?;
println!("total = {}", result.total);
Ok(())
}go get github.com/erikwang2013/go-scouttype Post struct { ID int; Title string }
func (p Post) ScoutKey() any { return p.ID }
func (p Post) TableName() string { return "posts" }
func (p Post) ShouldBeSearchable() bool { return p.Title != "" }
func (p Post) ToSearchableArray() map[string]any { return map[string]any{"title": p.Title} }
func main() {
ctx := context.Background()
s := scout.NewWithConfig(scout.DefaultConfig())
engines.Register(s.Manager)
sr := s.Searchable(&Post{}, scout.NewMemorySource(Post{ID: 1}))
_, _ = sr.MakeAllSearchable(ctx, 0)
_, _ = sr.Search(ctx, "Go", nil).Take(10).Get(ctx)
}鼠标停一停,它会换一种心情。