sync_engine/search/
mod.rs

1// Copyright (c) 2025-2026 Adrian Robinson. Licensed under the AGPL-3.0.
2// See LICENSE file in the project root for full license text.
3
4//! Search Infrastructure
5//!
6//! Full-text search across items using RediSearch and MySQL.
7//!
8//! # Architecture
9//!
10//! ```text
11//! QueryBuilder (AST)
12//!     ↓
13//!     ├─→ RediSearchTranslator → FT.SEARCH syntax
14//!     └─→ SqlTranslator → MySQL JSON_EXTRACT queries
15//! ```
16//!
17//! # Index Registration
18//!
19//! sync-engine stays "dumb" about content but provides index lifecycle management:
20//!
21//! ```rust,no_run
22//! # use sync_engine::{SyncEngine, search::{SearchIndex, Query}};
23//! # async fn example(engine: &SyncEngine) {
24//! // Register schema at startup using builder pattern
25//! let index = SearchIndex::new("users", "crdt:users:")
26//!     .text_sortable("name")
27//!     .text("email")
28//!     .numeric_sortable("age")
29//!     .tag("roles");
30//!
31//! engine.create_search_index(index).await.unwrap();
32//!
33//! // RediSearch auto-indexes matching JSON documents
34//! // Search using Query AST
35//! let query = Query::field_eq("name", "Alice");
36//! let results = engine.search("users", &query).await.unwrap();
37//! # }
38//! ```
39//!
40//! # Query Language (Lucene/RediSearch syntax)
41//!
42//! ```text
43//! @name:Alice               - Field equals
44//! @age:[25 40]              - Numeric range
45//! @tags:{rust|database}     - Tag membership (OR)
46//! @name:Alice AND @age:[25 40]  - Boolean AND
47//! @status:active | @status:pending  - Boolean OR
48//! -@deleted:true            - Boolean NOT
49//! @name:*alice*             - Wildcard contains
50//! @name:ali*                - Prefix match
51//! @name:%alice%             - Fuzzy match (Levenshtein)
52//! ```
53
54mod query_builder;
55mod redis_translator;
56mod sql_translator;
57mod index_manager;
58mod search_cache;
59
60pub use query_builder::{Query, QueryBuilder, QueryNode, FieldQuery, FieldOperator, QueryValue};
61pub use redis_translator::RediSearchTranslator;
62pub use sql_translator::{SqlTranslator, SqlQuery, SqlParam};
63pub use index_manager::{IndexManager, SearchIndex, SearchField, SearchFieldType};
64pub use search_cache::{SearchCache, SearchCacheStats};