← Research

Research note · July 21, 2026

The museum that broke our search.

Museo Egizio's onboarding exposed two separate retrieval bugs that had been sitting latent in LinkedCulture's hybrid search since before it joined. Neither was its fault.

linkedculturemuseoegiziosearchhybridsearchopensearchqdrantsemanticsearchengineering


Two days after Museo Egizio joined LinkedCulture, a search for "Egyptian" returned forty results. None of them were from Museo Egizio.

That is the kind of failure that looks like it must be about the new museum. It wasn't. Museo Egizio's 5,228 records were ingested correctly, indexed correctly, and embedded correctly. What broke was two separate, pre-existing weaknesses in how LinkedCulture's hybrid search ranks results, both of which had been sitting quietly in the system for a while. Museo Egizio didn't cause either one. It just catalogs its collection cleanly enough that both became visible for the first time.

LinkedCulture's search combines two engines: a keyword index (OpenSearch) and a semantic index (Qdrant, using vector embeddings). Museo Egizio's adapter does something unusually correct for an anonymous archaeological collection: it records culture: "Egyptian" and leaves creator genuinely blank, because there is no named maker for most of these objects. Many other institutions in the index handle the same situation differently. They fold the cultural attribution into the creator field instead, since that field is what their own systems expose for "who made this." Both conventions are honest descriptions of the same underlying reality. They just live in different fields.

That difference turned out to matter more than it should have. The keyword engine's relevance scoring rewards a matched value for being rare and penalizes it for being common, on the general assumption that a common word carries less information. That assumption is right for ordinary prose. It is backwards for a controlled category field like culture, where a value being shared across every relevant record is exactly what makes it a correct match, not a weaker one. Because creator: "Egyptian" is a comparatively unusual value in a field usually reserved for named artists, it scored far higher than culture: "Egyptian" ever could, even though both are equally valid signals that a record is about Egyptian material culture. Museo Egizio's records, which had nothing in the creator field to lean on, lost every time.

The fix treats category fields as exact matches with a fixed score, rather than letting a search engine designed for free-text prose apply its usual "rare is relevant" logic to a field that was never meant to work that way. After that change, a search for "Egyptian" returns a real mix of institutions, Museo Egizio included, instead of one collection's cataloging convention crowding out everyone else's.

Fixing that surfaced a second, quieter problem. One specific object, a limestone relief fragment titled "Fragment of relief with Egyptian gods," was now the single best keyword match in the entire index for the word "Egyptian." It still ranked nineteenth overall.

The reason came down to how the semantic side of the search works. Qdrant doesn't compare a query against every embedding in the collection. At more than 500,000 records, that would be too slow. Instead it searches approximately, checking a bounded neighborhood of the vector space and returning whatever it finds there. For most queries that neighborhood is plenty. For a single, generic word like "Egyptian," it turned out not to be. We checked this specific record's real similarity to the query by hand, computing it directly against its actual stored vector rather than relying on the approximate search to find it. The number was 0.375, a genuinely strong match by this system's own calibration. It simply never appeared, because more than a thousand other records in the collection score just as high or higher against that one word. A single common adjective, it turns out, describes a very crowded region of meaning.

Search math treats "we looked and found nothing" and "we never looked" as the same outcome. They aren't. The fix computes a record's real similarity directly, by its own stored vector, whenever the approximate search skips past it but the keyword side already flagged it as worth a second look. That is not a new search step bolted onto the pipeline. It is closing a gap in the same confidence-scoring formula the system already used, so a record's absence from an approximate shortlist stops being mistaken for evidence that it isn't relevant.

Neither bug was new, and neither was really about this museum. The first had been possible as soon as two institutions described the same kind of object differently, which was true of this index well before Museo Egizio arrived. The second is a property of trying to search 500,000-plus records approximately, one that any sufficiently generic single-word query, from any collection, would eventually have tripped over. What Museo Egizio actually did was catalog its collection with unusual honesty: a real culture field, an empty creator field where no creator exists, real findspot data instead of folding it into a paragraph of description. That honesty left nothing else for its records to lean on when the ranking math had a blind spot, so it was the first collection to hit both blind spots on the very same query.

The lesson generalizes past this one museum. The collections most worth adding to a system like this are often the ones described most conscientiously, and conscientious cataloging is exactly what will keep finding the retrieval layer's weak points, one honest new institution at a time.