People search across thirty years of court records

· case study · anonymized

A probate officer sees Katherine J. Smith on a new death certificate. Thirty years earlier, another case named Kathy Smith. The officer has to decide whether those names belong to the same person. Linking two people incorrectly—or splitting one person into two records—changes the case.

The agency runs probate and related court processes around property: land disputes, assignments, and what happens to a parcel when its owner dies. Cases have accumulated in Oracle for more than 30 years; the paper originals sit in an underground archive. Names, dates of birth, and roles are spread across tables and document-shaped fields. Finding a person across decades of filings is a search problem, not a primary-key lookup.

One person, many cases

The people index is designed around one rule: one canonical record per officer-confirmed identity, shared across every case and document in which that person appears. The same person can be a decedent in one estate and a witness in another without becoming two records.

Oracle holds the cases. The case system holds documents and the person–case–document mappings. Infino holds the people: canonical records that officers search and confirm as each document arrives.

Why Infino

The agency considered Elasticsearch and ClickHouse. The people query had to combine literal name matching, vector similarity for spelling variants and initials, and a date-of-birth filter while keeping court records inside the agency’s Azure environment. The deciding constraint was reducing the cost of people search.

Human confirmation was also non-negotiable. Search may rank candidates, but it never links or creates a person automatically. The write happens only after an officer decides.

Every document starts with a read-only match

A probate case is not one batch. A death certificate lands today, a will next week, and a court order months later. Each upload is processed separately. Structured fields are extracted from the document; raw OCR is retained, but matching runs on the extracted person fields.

Every extracted person is searched against the complete people index, not only the current case. A simplified query returns a ranked shortlist and writes nothing:

candidates.sql
-- candidate matches for one extracted person
SELECT   person_id, full_name, dob, score
FROM     hybrid_search('people', 'full_name', 'Katherine J. Smith',
                       'name_embedding', :q, 50)
WHERE    dob IS NULL OR dob = '1958-03-12'
ORDER BY score DESC LIMIT 10;

-- → a short, ranked shortlist; a case officer confirms the match

The officer reviews the candidates for each extracted person and confirms. The system performs no auto-link and no auto-create. Confirming an existing person adds this case and document to that record. Confirming a new person inserts one record, seeded with this first case and document. Then the next document arrives, and the same match-and-confirm cycle runs again.

EACH DOCUMENT, OVER THE CASE LIFECYCLE 1 · create case in the case system 2 · upload document death cert · will · order 3 · extract people structured fields, not OCR 4 · match globally · read only name (keyword + vector) + date of birth → ranked candidates Infino people index one record per human 5 · officer confirms no auto-link · no auto-create · nothing is written to Infino before this update existing person add this case + document ingest new person seeded with this case + document next document — days, weeks, or months later
Each document triggers a global, read-only match. Writes happen only after the officer confirms: update an existing person, or insert a new one.

Months to days

The agency reports that this people-matching workflow cut case processing from months to days and reduced its people-search cost by more than after moving to Infino.

The officer still makes the identity decision. What changed is the work before that decision: instead of searching decades of rows and scans manually, the officer starts with one ranked shortlist from the agency’s own people index.