Full-Text Search — Azure DocumentDB ($search + createSearchIndexes)
Azure DocumentDB's full-text search is driven by search indexes built with the createSearchIndexes database command and queried through the $search aggregation stage. Scoring is BM25, exposed via $meta: "searchScore". The community $text operator and { field: "text" } index type are not the DocumentDB search path.
Key syntax points that differ from many blog posts and older docs:
- Index command is
createSearchIndexes(notcreateIndexes) — each index has anameand adefinition.mappings.fieldsblock;dynamic: falseis the safe default. - Custom analyzers live inside
definition.analyzersand are referenced per-field viaanalyzer/searchAnalyzer. $searchtargets an index by name viaindex: "<name>"— the engine does not auto-pick when multiple exist.- No
countfield inside$search— use a downstream{ $limit: N }stage. - No
compoundoperator yet — query one field at a time and merge in the application (seefts-multifield-index).
Rules
- fts-create-search-index — Create a search index via
runCommand({ createSearchIndexes }); usedefinition.mappingswithdynamic: false. - fts-basic-search —
$search+textoperator for BM25 keyword search; targetindex, projectsearchScore, cap with$limit. - fts-fuzzy-search — Add
fuzzy: { maxEdits: 1 }to tolerate typos; keepmaxEditssmall. - fts-phrase-search —
phraseoperator withslopfor ordered-proximity matching. - fts-custom-analyzers — Keyword tokenizer +
lowerCase+asciiFolding+edgeGramfor case-insensitive prefix matching on IDs, SKUs, part numbers. Index-time vs search-time analyzer pair. - fts-path-hierarchy —
pathHierarchytokenizer for hierarchical identifiers (BN-747-ENG-2024.05, dotted, slash paths). - fts-multifield-index — One search index mapping multiple fields; fan-out-and-merge in the app while
$searchcompoundis unavailable. - fts-hybrid-search — Combine BM25 and vector search (RRF) on the same collection.