feat: add unified search engine — HNSW heap-opt, segment index, boolean/phrase/ngram/facet
CI / test (push) Has been cancelled
CI / verify (push) Has been cancelled
Clients CI / build-server (push) Has been cancelled
Clients CI / test-python (push) Has been cancelled
Clients CI / test-javascript (push) Has been cancelled
Clients CI / test-nim (push) Has been cancelled
Clients CI / test-rust (push) Has been cancelled
CI / test (push) Has been cancelled
CI / verify (push) Has been cancelled
Clients CI / build-server (push) Has been cancelled
Clients CI / test-python (push) Has been cancelled
Clients CI / test-javascript (push) Has been cancelled
Clients CI / test-nim (push) Has been cancelled
Clients CI / test-rust (push) Has been cancelled
New src/barabadb/search/ module with 9 components: - priority_queue.nim: BoundedHeap for O(log n) search - hnsw_opt.nim: heap-based searchLayer (2.4x faster, 92-99% recall@10) - inverted.nim: segment-based index with soft-delete and compaction - phrase.nim: positional phrase + proximity search - boolean.nim: recursive descent parser (AND/OR/NOT/ranges/wildcards) - ngram.nim: trigram index for O(1) fuzzy/prefix/wildcard - stemmer.nim: Porter2 stemmers (EN/BG/DE/FR/RU) - facet.nim: faceted search with filter pushdown - engine.nim: UnifiedSearchEngine combining all search types Performance (dim=128, efConstruction=200): N=1K: 0.30ms search, 99.6% recall@10 N=10K: 1.09ms search, 92.6% recall@10 N=50K: 2.26ms search, 75.5% recall@10 Includes search benchmarks (benchmarks/search_bench.nim), updated docs (en/bg fts.md, en/bg search.md), and crossmodal engine integration.
This commit is contained in:
@@ -6,6 +6,7 @@ import ../storage/lsm
|
||||
import ../vector/engine as vengine
|
||||
import ../graph/engine as gengine
|
||||
import ../fts/engine as fts
|
||||
import ../search/hnsw_opt
|
||||
|
||||
type
|
||||
QueryMode* = enum
|
||||
@@ -88,6 +89,19 @@ proc searchVectorFiltered*(engine: CrossModalEngine, query: seq[float32], k: int
|
||||
filter: proc(meta: Table[string, string]): bool {.gcsafe.}): seq[(uint64, float64)] =
|
||||
vengine.searchWithFilter(engine.vectorIdx, query, k, filter)
|
||||
|
||||
proc searchVectorOpt*(engine: CrossModalEngine, query: seq[float32], k: int = 10,
|
||||
metric: vengine.DistanceMetric = vengine.dmCosine): seq[(uint64, float64)] =
|
||||
hnsw_opt.searchOpt(engine.vectorIdx, query, k, metric)
|
||||
|
||||
proc searchVectorFilteredOpt*(engine: CrossModalEngine, query: seq[float32], k: int,
|
||||
filter: proc(meta: Table[string, string]): bool {.gcsafe.}): seq[(uint64, float64)] =
|
||||
hnsw_opt.searchWithFilterOpt(engine.vectorIdx, query, k, filter)
|
||||
|
||||
proc insertVectorOpt*(engine: CrossModalEngine, id: uint64, vector: seq[float32],
|
||||
meta: Table[string, string] = initTable[string, string]()) =
|
||||
hnsw_opt.insertOpt(engine.vectorIdx, id, vector, meta)
|
||||
engine.metadata[id] = meta
|
||||
|
||||
# Graph operations
|
||||
proc addNode*(engine: CrossModalEngine, label: string,
|
||||
props: Table[string, string] = initTable[string, string]()): uint64 =
|
||||
|
||||
Reference in New Issue
Block a user