A drift incident hits at 2 a.m. Rejection rates on an AOI line have crept up over three shifts, and the engineer on call has to answer a single question fast: what changed? The logs are all there — CV telemetry, operator notes, model-version tags, lighting-calibration entries, rollback events. The problem is not that the data is missing. The problem is that it was dumped into a full-text index as if the index alone would make it findable. Type in “rejection rate high” and you get three weeks of noise. That is the failure this article is about. A full-text search database is genuinely useful for line-side reliability work, but only when it is designed around the reliability artefacts rather than treated as a generic log bucket. Get that design right and the mean-time-to-diagnose for a drift incident drops from hours of manual log-scanning to minutes of targeted query. Get it wrong and you have a searchable pile that returns everything and answers nothing. What does a full-text search database actually do here? Strip away the marketing and a full-text search engine — Elasticsearch, OpenSearch, Apache Solr, or the full-text extensions in PostgreSQL — does one thing well: it tokenizes free text, builds an inverted index mapping terms to documents, and ranks matches by relevance. That is powerful for the parts of a reliability record that are genuinely unstructured: an operator’s note that reads “conveyor vibration after belt swap, top-left ROI blurry,” or a maintenance log describing a lens cleaning. Where teams go wrong is assuming that because the engine can index everything, everything should live as free text. It should not. The reliability artefacts that matter most during an incident are structured: a model-version string, a timestamped drift-signal value, a rollback event, a rejection-rate reading per hour. Those belong in structured fields with typed mappings — keyword fields, date fields, numeric fields — so you can filter, range-query, and aggregate on them. Full-text ranking is the wrong tool for “give me every rejection-rate reading above 4% between 22:00 and 06:00 on model version 2.3.1.” That is a filter, not a relevance search. The correct mental model is a hybrid index: structured fields carry the evidence chain, and the full-text analyzer handles the human prose that sits alongside it. This is the same architectural instinct that governs where reliability gates belong at each stage of an ML pipeline — the tool is only as good as the schema it is asked to enforce. What belongs in full-text versus structured fields? The single most consequential design decision is the split between free-text fields and structured fields. Getting this wrong is what makes an incident query return noise. Here is the split we apply when we design a line-side reliability index. Reliability data Index treatment Why Model-version pin (e.g. aoi-detector-2.3.1) Structured keyword field Exact-match filter; never tokenized. You want version:2.3.1, not a fuzzy text match. Drift-signal value + timestamp Structured date + numeric fields Range and aggregation queries drive incident diagnosis. Rejection-rate readings Structured numeric + date Correlated against drift and version over time windows. Rollback / deploy events Structured keyword + date The “what changed” pivot point during an incident. Operator notes, maintenance logs Full-text field, analyzed Genuinely unstructured; relevance ranking earns its keep here. Lighting / calibration change notes Full-text field + structured event flag Prose plus a filterable flag so you can find the change fast. The pattern is simple to state and easy to violate under deadline pressure: anything you will filter, range, or aggregate on is structured; anything you will read and rank by relevance is full text. When a team indexes model versions as free text, version:2.3.1 collides with 2.3.10 and v2.3 on tokenization, and the exact-match guarantee you need during an incident evaporates. How do you tune the analyzer and schema for incident recall? An analyzer is the pipeline that turns raw text into indexed tokens: it lowercases, splits on delimiters, strips or keeps punctuation, applies stemming, and removes stop words. The default analyzers in Elasticsearch and OpenSearch are tuned for English prose, not for a plant’s vocabulary. On a real line, operators write in shorthand — “ROI3 NG,” “lux drop L-station,” part numbers with embedded dashes and slashes. A default analyzer shreds those into useless tokens. Tuning the analyzer to the plant’s vocabulary is what separates an index that recalls the right evidence from one that buries it. In configurations we have worked with, three adjustments do most of the work (observed pattern across industrial-CV engagements; not a benchmarked ranking): A custom tokenizer that preserves part-number and station-identifier patterns rather than splitting on every dash and slash. A synonym filter mapping plant shorthand to canonical terms, so “NG,” “no-good,” and “reject” all resolve to the same concept. Disabling aggressive stemming on identifier-like fields, because stemming “L3” and “L station” together destroys precision. The schema side matters just as much. Pin model versions and rollback events as keyword fields with date companions, and the incident query becomes a compound filter: version equals X, time window equals the three shifts in question, drift signal above threshold — then, and only then, full-text search the operator notes within that filtered set. That ordering is the whole trick. You narrow with structured filters first, then rank the surviving free text by relevance. An index built for keyword convenience does the opposite and drowns the signal. This is also where the searchable index and a monitoring harness meet. The drift signals you query on have to be captured in the first place — the discipline of logging drift telemetry for a line-side AOI model is what makes the timestamped values exist for the index to hold. How does a search layer shorten mean-time-to-diagnose? Consider the incident concretely. Rejection rate on a PCB AOI line climbs from a baseline of roughly 2% to 6% over three shifts (illustrative figures, not a measured benchmark). Without a designed index, the on-call engineer opens raw log files and greps for “reject,” reads operator notes shift by shift, and tries to remember which model version was live when. That is hours of work, and it depends on the engineer’s memory of the deployment history. With an index built around the artefacts, the same diagnosis is a sequence of targeted queries. Filter rejection-rate readings above 4% to find the exact window. Overlay the drift-signal field to see which detector class drifted. Filter deploy events in that window — and there it is: a model rollback at the start of shift two, followed by a lighting-calibration note the operator logged an hour later. The evidence chain assembles itself: version change, then lighting change, then the rejection spike. That correlation is the answer, and it took minutes. The measurable outcome is the shift from days to hours — often to minutes — in mean-time-to-diagnose. That is the headline the reliability pack is built to deliver: recovering from drift incidents in hours instead of days, with accurate rejection-rate evidence that stays retrievable across line refreshes. Full-text search is one supporting layer inside a broader production AI reliability practice, not the whole of it. Where the search layer sits after ownership transfer The index earns its most important keep at handoff. When on-call ownership of a line transfers — from the integration team to plant operations, or between shifts — institutional memory does not transfer with it. The engineer who remembers which lighting change caused which spike is not on the next call. The searchable index is how that knowledge stays queryable: the drift telemetry, the rollback runbook history, and the incident logs become evidence anyone with the query patterns can retrieve. This is why the search layer supports the on-call ownership transfer pack rather than standing alone. It is the same reason production hardening depends on retrievable incident evidence — a line that goes through production hardening and go-live needs its drift and rollback evidence to survive the transition from commissioning to steady-state operations. The index makes that evidence durable across the people who touch the line. FAQ How does full-text search databases actually work? A full-text search database tokenizes text, builds an inverted index mapping terms to documents, and ranks matches by relevance — engines like Elasticsearch, OpenSearch, and Solr do this well. In practice, for line-side reliability, it means the unstructured prose (operator notes, maintenance logs) is searchable by relevance, while the structured evidence (versions, drift values, timestamps) is best held in typed fields and queried by filter, not relevance. What line-side CV reliability data belongs in a full-text index versus structured fields? Anything you filter, range-query, or aggregate on belongs in structured fields: model-version pins as keyword fields, drift signals and rejection rates as numeric plus date fields, and rollback events as keyword-plus-date. Anything you read and rank by relevance — operator notes, maintenance and lighting-change prose — belongs in analyzed full-text fields. Indexing model versions as free text is the common mistake, because tokenization breaks exact-match guarantees. How do you tune an analyzer and schema so drift and rollback evidence is retrievable under incident pressure? Tune the analyzer to the plant’s vocabulary: a custom tokenizer that preserves part numbers and station identifiers, a synonym filter mapping shorthand like “NG” and “reject” to canonical terms, and disabled stemming on identifier fields. On the schema side, pin versions and rollback events as keyword-plus-date fields so an incident query narrows with structured filters first, then relevance-ranks the surviving free text. How does a search layer shorten mean-time-to-diagnose during a drift incident? Instead of grepping raw logs and relying on memory of the deployment history, the engineer runs targeted queries: filter rejection rates above threshold to find the window, overlay the drift signal, then filter deploy events to spot the rollback or calibration change that caused it. The evidence chain assembles in minutes rather than hours, turning a days-long recovery into an hours-long one. How does the searchable index fit into the on-call ownership transfer pack after handoff? When on-call ownership transfers between teams or shifts, institutional memory does not transfer with it. The searchable index keeps drift telemetry, rollback runbook history, and incident logs queryable by anyone with the query patterns, so the knowledge of what changed and why survives the handoff rather than living only in one engineer’s head. What are the limits of full-text search for reliability work — when do you need structured telemetry or a time-series store instead? Full-text search is weak at high-frequency numeric telemetry and time-window aggregation at scale; a purpose-built time-series store handles dense drift and rejection-rate streams more efficiently. Use full-text search for the human prose and the correlation-friendly index of evidence, and keep the raw high-cardinality metrics in structured telemetry or a time-series database — the search layer supports the reliability pack, it does not replace the monitoring stack. The design question worth carrying forward The failure mode here is not technical incompetence; it is a category error. Treating a full-text search database as a drop-in log store is the naive move, and it survives right up until the first incident that demands correlation under pressure. The question to ask before you commission the index is not “can we search this later?” — you almost always can, badly. It is “when an engineer needs the exact evidence chain behind a drift spike, does the schema return it, or does it return noise?” Design the index around the reliability artefacts — model-version pins, timestamped drift signals, rollback events — and the answer holds up when it matters most.