nu:legal · recht.nulegal.eu

We put Google's search on 484,464 German court decisions and measured it

Bork Morfaw

Veröffentlicht am 27.07.2026

Google's two off-the-shelf options for searching a legal corpus — Programmable Search (CSE) and Vertex AI Search — measured against our own retrieval stack on real user queries, on 2,941 held-out case-law questions, and on 116 landmark research questions: we win two of three, and the loss taught us the most.

Why we ran this

Our search over recht.nulegal.eu — every German federal statute plus, at benchmark time, 484,464 court decisions — is built in-house: hybrid lexical + dense retrieval with a fine-tuned German-legal query encoder, citation-graph priors, and an LLM rerank path for natural-language questions. The obvious question any team should ask itself: would off-the-shelf Google do just as well?

We tested both ways Google can sit on top of a corpus like ours:

  1. Google Programmable Search (CSE) restricted to our public site: Google's web index of the corpus.
  2. Vertex AI Search with our full corpus — 584,465 documents: 100,001 statute sections with body text (§/Art./Anlage provisions rather than heading-only rows) plus the 484,464 decisions — pushed into a datastore: Google's retrieval engine, with no index-coverage excuse.

Setup

Three evaluation sets, none synthetic:

Results

evalmetricGoogle CSEVertex AI Searchours
organic probe (119)answered@50.3190.7730.908
case_eval (2,941)recall@10n/a ¹0.275 ²0.610 ³
landmark-v2 (116)recall@100.069 ⁴0.5520.517
landmark-v2 (116)recall@200.069 ⁴0.6210.647

¹ CSE cannot be scored on case_eval: the gold decisions were largely absent from Google's index of our young site, so a recall number would measure crawl coverage, not retrieval.

² The Vertex case_eval run had 40 of its 2,941 queries fail to fetch (retries exhausted). The 40 are counted as misses, so 0.275 is a floor: had every failed query been a hit, the ceiling would be about 0.289. The failures are logged as fetch_errors in the published run artifact, results/run_vertex_case_eval_20260727.json in the research repository.

³ Offline measurement against the production dense retriever. The live full-scale run of the production API on the same questions measured 0.659 — see the method notes; the summary above quotes that live-vs-live pair.

⁴ CSE returns at most 10 results per query, so recall@20 cannot exceed recall@10.

The CSE number is an index-coverage story, not a retrieval story. At measurement time (July 2026) the site was weeks old and Google's crawl covered a small fraction of it: 74 of the 116 landmark questions returned zero results. As of that measurement, "just put a Google search box on it" answered one query in three.

Vertex AI Search is a serious baseline, and it still loses on what users actually type. With the full corpus indexed, it answers 77% of real queries against our 91%, and it trails badly on precise case-law lookup: 0.275 vs 0.610 in the table's offline measurement, 0.275 vs 0.659 live against live. Domain-tuned retrieval — the citation graph, the fine-tuned encoder, German legal query handling — earns its keep exactly where precision matters.

The interesting result is the one we lost. On long, doctrine-heavy research questions, Vertex's semantic retrieval finds landmark decisions our stack misses at rank 10. The headline gap (0.552 vs 0.517) is four questions out of 116, well within sampling noise at this size; what makes the result real is the diff, not the delta. The diff is also what makes it actionable: of 116 questions, both engines find 40, only ours finds 20, only Vertex finds 24, neither finds 32. The engines are complementary — a fused candidate pool would lift recall@10 from 52% to a 72% ceiling. That fusion experiment is on our roadmap.

Method notes

Appendix: reproduce it, cite it, provenance

Reproduce it. The harness — runner scripts, judge prompts, metric code, and the evaluation sets — is published in our research repository under research-friendly licenses (code: PolyForm Noncommercial 1.0.0; data: CC BY-NC 4.0; commercial licensing on request). German court decisions themselves are in the public domain (§ 5 UrhG).

Cite it. BibTeX, with this page as the canonical URL:

bibtex
@techreport{nulegal_google_search_vs_our_retrieval,
  title  = {We put Google's search on 484,464 German court decisions and measured it},
  author = {Bork Morfaw},
  year   = {2026},
  institution = {nu:legal research},
  url    = {https://recht.nulegal.eu/forschung/google-search-vs-our-retrieval}
}

Provenance (14 September 2026). This article first appeared on research.nulegal.eu on 27 July 2026 and moved to this page when that site was folded into recht.nulegal.eu. In the move, the summary was restated on the live-vs-live full-scale pair (recall@10 0.659 vs 0.275, 2.4×) instead of the offline 0.610 (2.2×); the caveat about the 40 failed Vertex queries moved from the repository README into the text; the judge cross-check is now described as what it is (two passes of the same model at different temperatures); and the corpus count is stated once, as 484,464 decisions at benchmark time. No measured number changed. A German-language analysis of the same July 2026 measurement series: Ein Webindex ist kein Bestand: drei Messreihen zur juristischen Suche.