@@ -85,14 +85,12 @@ struct SearchArgs {
8585 /// Use full-text search (default, on by default)
8686 #[ arg( long, default_value_t = true ) ]
8787 fts : bool ,
88-
8988 /// Path to the knowledge repository (auto-detected by default)
9089 #[ arg( long, value_name = "PATH" ) ]
9190 repo : Option < PathBuf > ,
92-
93- /// Use vector search (requires embedding model)
94- #[ arg( long, default_value_t = false ) ]
95- vector : bool ,
91+ /// Use vector search (requires embedding model)
92+ #[ arg( long, default_value_t = false ) ]
93+ vector : bool ,
9694}
9795
9896#[ derive( Parser ) ]
@@ -418,6 +416,28 @@ fn main() -> Result<()> {
418416 return Ok ( ( ) ) ;
419417 }
420418
419+ if args. vector {
420+ let mut model = kq_embeddings:: EmbeddingModel :: new (
421+ & repo_path. join ( ".kq/model-cache" )
422+ ) ?;
423+ match model. load ( ) {
424+ Ok ( ( ) ) => {
425+ let emb = model. embed ( & args. query ) ?;
426+ let results = kq_core:: vector:: hybrid_search (
427+ & conn, & args. query , & emb, args. limit , args. limit
428+ ) ?;
429+ for r in & results {
430+ println ! ( " {:6.2} {}" , r. score, r. path) ;
431+ }
432+ }
433+ Err ( e) => {
434+ eprintln ! ( "Vector search unavailable: {e}" ) ;
435+ eprintln ! ( "Model will be downloaded on first vector search." ) ;
436+ }
437+ }
438+ return Ok ( ( ) ) ;
439+ }
440+
421441 let results = kq_core:: search:: search_fts ( & conn, & args. query , args. limit ) ?;
422442
423443 if results. is_empty ( ) {
0 commit comments