USearchWiki is an open, searchable atlas of wiki-style and scholarly text. Every document is one row under a permanent key, with its sections inside it, and everything learned about that text — embeddings from several models, links resolved across languages, the dates and places it mentions — is added beside the same rows, together with the indexes that search them. New collections, models and annotations extend the atlas without renumbering what is already there.
It lets a person, a retrieval pipeline or an agent ask:
- "Find the passages closest to this paragraph, in any language, and score whole documents by all of their sections."
- "Which sections link to the entity Paris, whatever the language of the article?"
- "Show the passages that mention a date between 1939 and 1945 and a place within 200 km of Warsaw."
- "Rank these documents under four different embedding models and compare where they disagree."
The atlas includes Wikipedia in every language, whose layout and keys every other collection follows, and the arXiv, bioRxiv and medRxiv preprint servers:
| Collection | Documents | Sections | With text |
|---|---|---|---|
wikipedia |
60'354'903 | 197'268'428 | all |
example |
300'000 | 976'725 | all |
arxiv |
3'192'870 | 10'156'620 | 480'647 |
biorxiv |
352'284 | 2'043'412 | 79'113 |
medrxiv |
89'561 | 646'783 | 23'964 |
wikipedia holds the newest revisions of FineWiki's 325 language editions, and the preprint collections are in English.
The example collection is the one to start with: 6.1 GB that carries every column, model file and graph of the full Wikipedia, in a uniform sample of its languages.
Every row carries its own license as an SPDX identifier, and what a row publishes follows it.
Wikipedia text is under CC BY-SA 4.0.
A preprint publishes its text, sections, annotations, markup and source files only under CC BY or CC0; every other preprint keeps its metadata — title, authors, categories, dates, URL and license — with a null text and empty lists.
Abstracts follow the same rule for bioRxiv and medRxiv, while arXiv abstracts come from arXiv's own CC0 metadata.
Every document of the current release carries:
- Text: the rendered Markdown of the whole document, with its sections as byte ranges that tile it exactly.
- Links: each link as a byte span, the Wikidata entity it names and the document it resolves to, both keyed the same way in every language.
- Dates and places: every date range and coordinate box found in the text, flagged by whether a template, a linked entity, a text pattern or the collection's metadata produced it.
- Source: the original files verbatim, from wikitext and JATS XML to the TeX of a paper.
- Embeddings: one vector per document from three dense models, and one vector per section from a late-interaction model for MaxSim search.
- Indexes: USearch graphs over the section and document vectors, each reaching 99% recall on held-out queries.
Preprint collections have no model files or graphs yet.
Each collection holds parquet/ with one row per document, cut into 1M-row stems named by their first and end rows, and its graphs beside it.
Files sharing a stem are row-aligned, one per model, so vectors need no join and any model can be fetched or dropped alone.
Sizes below use GB = 2³⁰ bytes.
.
├── data
│ ├── collections.parquet # collection names by ordinal, frozen and append-only
│ ├── example # 6.1 GB, the first 300'000 shuffled Wikipedia documents
│ │ └── ... # the same shape as wikipedia
│ ├── wikipedia
│ │ ├── index-gte-sections.safegraphs # 97.0 GB, every section under its document's key, for MaxSim
│ │ ├── index-qwen-documents.safegraphs # 130.4 GB, one body vector per document
│ │ ├── index-arctic-documents.safegraphs # 130.4 GB, one body vector per document
│ │ └── parquet # 61 stems of each kind
│ │ ├── 0000000000-0001000000.parquet # 3.8 GB, text, sections, links, dates, places, source
│ │ ├── 0000000000-0001000000.gte.parquet # 0.7 GB, one 128-d vector per section
│ │ ├── 0000000000-0001000000.qwen.parquet # 3.5 GB, body and title vectors
│ │ ├── 0000000000-0001000000.arctic.parquet # 3.5 GB, body and title vectors
│ │ ├── 0000000000-0001000000.nomic.parquet # 2.6 GB, body and title vectors
│ │ ├── ...
│ │ └── 0060000000-0060354903.nomic.parquet
│ ├── arxiv
│ │ └── parquet # one row per paper, in progress
│ ├── biorxiv
│ │ └── parquet
│ │ └── 0000000000-0000352284.parquet # 3.1 GB, every paper, text for 79'113
│ └── medrxiv
│ └── parquet
│ └── 0000000000-0000089561.parquet # 0.7 GB, every paper, text for 23'964
└── README.mdWikipedia documents are shuffled once with a fixed seed, so any prefix of the stems is a uniform sample across languages, and example is exactly the first 300'000 of them.
>>> import pyarrow.parquet as pq
>>> pq.read_schema('data/wikipedia/parquet/0000000000-0001000000.parquet')
key: fixed_size_binary[16] not null # the document, see Keys
collection: dictionary<string> not null # such as enwiki, arxiv, biorxiv or medrxiv
title: string not null
url: string not null # versioned for preprints
language: string # such as en, null when unknown
modified: timestamp[ms] not null # UTC, the revision or posting date
license: dictionary<string> not null # SPDX, such as CC-BY-SA-4.0, CC-BY-4.0 or CC0-1.0
entity: fixed_size_binary[16] # the Wikidata entity, Wikipedia only
authors: list<string>
categories: list<string>
abstract: large_string # where the license allows
subject_dates: list<struct<start: int32, end: int32, property: uint32, precision: uint8, calendar: uint8, source: uint8>>
subject_places: list<struct<south: float, west: float, north: float, east: float, precision_deg: float, property: uint32, source: uint8>>
text: large_string # rendered Markdown, null when withheld
sections: list<struct<heading: string, level: uint8, start: uint32, end: uint32>>
links: list<struct<span: struct<start: uint32, end: uint32>, section: uint16, entity: fixed_size_binary[16], target: fixed_size_binary[16], url: string, context: uint8>>
dates: list<struct<span: struct<start: uint32, end: uint32>, section: uint16, start: int32, end: int32, property: uint32, precision: uint8, calendar: uint8, source: uint8>>
places: list<struct<span: struct<start: uint32, end: uint32>, section: uint16, south: float, west: float, north: float, east: float, precision_deg: float, property: uint32, source: uint8>>
infoboxes: large_string # FineWiki's infobox JSON, Wikipedia only
markup: dictionary<string> # wikitext, latex or jats
source: list<struct<path: string, content: large_binary>>sectionstiletextexactly: each is a UTF-8 byte range[start, end), the first starts at 0, every next one starts where the previous ended, and the last ends withtext.levelis 0 for the lead and otherwise the count of#, andheadingis null for the lead.- Every
spaninlinks,datesandplacesis a UTF-8 byte range into the wholetext, andsectionis the index of the section holding it. A null span with a section marks a fact annotated in that section with no matching words, such as a date carried by a linked entity whose link text is a name. A link with neither span nor section is a template, reference or back-matter link, which has no rendered position. - A link's
entityis the Wikidata entity its target names,targetthe key of the document it resolves to, andurlan external address, each null when absent. Entities and targets are UUIDs that hold across languages: a link to Paris from any wiki carries the same entity.contextsays where the link sat in the markup: 0 prose, 1 table, 2 template, 3 reference, 4 other, and null when unknown. - Dates are inclusive day ranges since 1970 in the proleptic Gregorian calendar, with astronomical years below 1, so
1965is the whole year and14 July 1789a single day.precisionfollows Wikidata: 7 century, 8 decade, 9 year, 10 month, 11 day.calendaris 0 for Gregorian, 1 for a value converted from Julian, 2 when the source calendar is unknown.propertyis the Wikidata property a linked entity contributed, such as 580 for a start time, and 0 otherwise. - Places are boxes in degrees, and a point has equal pairs;
west > eastcrosses the antimeridian.precision_degis the source precision and 0 when absent. - The
sourcefield of a date or place says how it was found: 0 a date or coordinate template, 1 a linked Wikidata entity, 2 a text pattern, 3 the primary and 4 a secondarygeo_tagscoordinate, and 5 the collection's metadata, such as the posting date of a preprint. Insubject_datesandsubject_places, source 1 is the document's own Wikidata entity. subject_datesandsubject_placesdescribe the subject itself: Wikidata birth, death, inception and coordinates,geo_tags, title coordinates and infobox templates for an article, and posting dates for a preprint.datesandplacesdescribe only what the text mentions.- The
sourcecolumn holds the original files verbatim under theirpath: one entry of wikitext or JATS XML, or every TeX file of an arXiv paper.
Schema metadata records the collection, the schema_version, the license_policy, the key layout, and for Wikipedia the finewiki_commit, wikidata_dump_date and sql_dump_date.
Each model has its own file per stem, row-aligned with the main file and starting with the same key column:
| File | Columns | Type |
|---|---|---|
*.gte.parquet |
vectors |
list<fixed_size_list<halffloat, 128>>, by section |
*.qwen.parquet |
body, title |
fixed_size_list<halffloat, 1024> |
*.arctic.parquet |
body, title |
fixed_size_list<halffloat, 1024> |
*.nomic.parquet |
body, title |
fixed_size_list<halffloat, 768> |
A GTE cell holds one vector for each of its document's sections, in the same order.
Every key is an RFC 9562 UUIDv8 of 16 big-endian bytes, and the same bytes identify the row in its model files and every graph.
Its 122 custom bits hold collection:16, page:32, revision:36, section:16, sentence:22, placed around the fixed version and variant fields, so sorting keys groups a collection's pages and a page's revisions.
section and sentence are reserved for addressing parts of a document and are 0 in every stored key.
An entity key uses collection 0xFFFF and the Wikidata QID number as its page.
def decode(key: bytes) -> tuple[int, int, int, int]:
value = int.from_bytes(key, "big")
payload = (value >> 80) << 74 | ((value >> 64) & 0xFFF) << 62 | value & ((1 << 62) - 1)
return payload >> 106, (payload >> 74) & 0xFFFF_FFFF, (payload >> 38) & 0xF_FFFF_FFFF, (payload >> 22) & 0xFFFFcollection is the ordinal in collections.parquet: 0 to 324 are the Wikipedia language editions, 325 is arXiv, 326 bioRxiv and 327 medRxiv.
page and revision carry each collection's own identifiers:
| Collection | Identifier | page |
revision |
|---|---|---|---|
| Wikipedia | page and revision IDs | page ID | revision ID |
| bioRxiv, medRxiv | 10.1101/2024.06.04.24308466 |
24308466 |
days << 8 | version |
| arXiv | YYMM.NNNNN |
yymm · 100'000 + number |
version |
| arXiv | archive/YYMMNNN |
10⁹ + archive index · 10⁷ + yymmnnn |
version |
For bioRxiv and medRxiv, days counts from 1970 to the posting date in a dated DOI, and is 0 for an undated one.
A Wikipedia key opens its article at https://<lang>.wikipedia.org/?curid=<page>&oldid=<revision>.
The graphs are SafeGraphs checkpoints built with USearch at connectivity 64 and an insertion expansion of 256, over the inner metric on unit vectors, which USearch reports as dot.
The GTE graph holds every section under its document's key, so a plain search returns the document of the nearest section, and USearch's MaxSim scores whole documents: every query section takes its best match within a document, and those maxima sum.
The last 10'000 documents of the shuffle are held out of every graph as queries.
Recall is 1-recall@10 over the held-out queries against exact scans of the first 1'000 of them, measured on a 96-core Graviton4 with every graph in RAM:
| Graph | Insert, s | Refine, s | Expansion | Queries/s | Rows/s | Recall@10 |
|---|---|---|---|---|---|---|
index-gte-sections, MaxSim |
2'118 | 1'618 | 256 | 16'055 | 52'823 | 0.995 |
index-qwen-documents |
4'145 | … | 128 | 32'416 | 32'416 | 0.990 |
index-arctic-documents |
3'997 | 3'955 | 512 | 9'393 | 9'393 | 0.993 |
The GTE row queries USearch's MaxSim with every section of a held-out document and ranks documents; the dense rows query one body vector per document by inner product, which on these unit vectors ranks like angular distance. Each graph searches at least as many rows per second as it inserted, counting refinement, so none was bought with a slower search. Served in place from one NVMe drive instead of RAM, every graph keeps its recall at the same expansion: 0.996 for GTE, 0.990 for Qwen3 and 0.993 for Arctic.
Install straight from GitHub with uv, no clone required.
uv pip install "git+https://github.com/unum-cloud/USearchWiki.git" # read the shards
uv pip install "usearchwiki[search] @ git+https://github.com/unum-cloud/USearchWiki.git" # search the graphs with USearch v3To hack on the code, clone it and install editable instead.
git clone https://github.com/unum-cloud/USearchWiki.git
cd USearchWiki
uv venv --python 3.12
source .venv/bin/activate
uv pip install -e ".[search]"The dense, ground and colbert extras reproduce the embeddings and the original ground truth, and need GPUs.
The dataset lives in the public usearch-wiki bucket on AWS S3 in us-west-2, readable anonymously.
Download the example collection, 6.1 GB with every column, model file and graph:
mkdir -p data/example
aws s3 cp --no-sign-request s3://usearch-wiki/data/collections.parquet data/
aws s3 sync --no-sign-request s3://usearch-wiki/data/example/ data/example/If you need just one model's vectors of the full Wikipedia:
aws s3 sync --no-sign-request s3://usearch-wiki/data/wikipedia/parquet/ data/wikipedia/parquet/ \
--exclude "*" --include "*.qwen.parquet"The usearchwiki package reads every collection lazily, row group by row group:
from usearchwiki import WikiDataset, civil_from_days
data = WikiDataset.open("data/example")
document = data.document(219) # "Channel wing", with its sections, links, dates and places
for date in document.dates:
section = document.sections[date["section"]]
print(section.heading, document.quote(date["span"]), civil_from_days(date["start"]))
data.vectors("qwen", 219, 1) # (1, 1024) float16
data.vectors("gte", 219, 1) # (7, 128) float16, one row per section
for key, score in data.search_like(219, "gte", 10): # MaxSim over all of its sections, needs usearch>=3
print(score, data.find(key).title)python -m usearchwiki data/example 219 prints one document with every annotation.
The dataset is built in stages, each verified before the next, by tools kept outside this repository.
HuggingFaceFW/finewiki — August 2025 snapshot, 325 languages, 61.5M articles, pinned to commit 8bd13e72e6a002407649b3e898535f42ceb1aeb9.
FineWiki is extracted from Wikimedia's Enterprise HTML dumps (not raw wikitext), so templates are fully rendered by MediaWiki's own engine.
This avoids the well-known content loss that plagues wikitext-based parsers, as mwparserfromhell cannot expand templates.
Section headings, tables, math, and lists are preserved as Markdown.
Bot-generated stubs, disambiguation pages, and cross-language leakage are filtered out.
FineWiki holds several revisions of about 1.2M pages. USearchWiki keeps only the newest revision of each page, which is how 61.5M source rows become 60'354'903 articles.
The annotations come from three more sources:
- Wikidata: the
all.json.bz2dump of 2026-10-26, for entities, sitelinks, dates, coordinates and template families. - Wikimedia SQL dumps:
page,redirectandgeo_tagsof every wiki, from October and November 2026, for title resolution and article coordinates. - Site information: each wiki's
siteinfo-namespacesdump, for the localized File and Category prefixes that are not links.
The preprint collections come from their servers directly.
bioRxiv and medRxiv contribute the metadata of every paper and, under CC BY or CC0, its abstract and full-text JATS XML.
arXiv contributes its CC0 metadata for every paper, from arXiv's bulk metadata snapshot, and, under CC BY or CC0, the TeX sources from its bulk source archive.
An arXiv paper's text is its TeX converted to Markdown by pandoc, math kept as TeX, with the title and abstract as its lead section; the original files stay verbatim in source.
No chunking is used for the dense models.
Short-content models only process the abstract.
Long-context models are prioritized and receive the whole document in the original form.
Sections split the rendered text at its Markdown headings, so the sections of an article concatenate back to its FineWiki text byte for byte.
| Scope | Articles | Parquet, GB | Avg Bytes/Article |
|---|---|---|---|
| English | 6.6M | 38 | 5,700 |
| Top 5: EN, DE, FR, ES, RU | 15.7M | 86 | 5,460 |
| Top 10 by text volume¹ | 22.9M | 120 | 5,250 |
| Top 20 | 41.6M | 149 | 3,580 |
| All 325 languages | 61.6M | ~170 | 2,740 |
¹ EN, DE, FR, ES, RU, IT, JA, ZH, PL, UK — excluding bot-generated wikis (Cebuano, Swedish, Waray, Egyptian Arabic) which inflate article counts with minimal text.
Parquet weight includes both text and wikitext columns; pure text is roughly half.
Average bytes/article drops at wider scope because smaller wikis are dominated by stubs.
Measured by scanning every parquet shard, including rendered Markdown text and raw wikitext columns:
| Quantity | Total | Per article |
|---|---|---|
| Articles | 61.55M | … |
Rendered text bytes: text column |
195.2 GB | 3.2 KB |
Wikitext bytes: wikitext column |
337.1 GB | 5.5 KB |
| Markdown paragraphs: blank-line-separated blocks | 254.2M | 4.13 |
Section headings: #, ##, ### |
206.3M | 3.35 |
35% of articles have a single paragraph (stubs), 65% have ≤ 3, only 10% have 8+. Paragraph length distribution:
- 12%: under 50 bytes, mostly headings or one-liners,
- 38%: in 200–800 bytes, the prose sweet spot,
- 4%: over 3.2 KB, long lists or tables rendered as one block.
Annotation density extracted from raw wikitext:
| Annotation kind | Total | Articles touched |
|---|---|---|
Plain [[wikilinks]] |
1.42 B | 99.4% |
Templates {{...}} |
0.998 B | 98.6% |
Piped links [[T|d]] |
0.648 B | 89.3% |
Citations <ref>... |
0.400 B | 71.0% |
External URLs [https://...] |
84M | 41.8% |
Categories [[Category:...]] |
55M | 16.3% |
Tables {...} |
19M | 14.6% |
Files / images [[File:...]] |
14M | 7.2% |
Section anchors [[Article#Section]] |
11.5M | 6.4% |
Math <math>... |
6.4M | 0.5% |
Self anchors [[#Section]] |
2.6M | 0.7% |
Galleries <gallery> |
2.5M | 3.2% |
Inline interwiki [[lang:...]] |
0.83M | 1.1% |
Section anchors deserve attention: they form a 11.5M-edge paragraph-level link graph already curated by editors — a built-in supervision signal for sub-article retrieval evaluation.
Each model embeds the same article corpus independently. No chunking is applied — short-context models see truncated articles, long-context models see the full text. Dense models produce one vector per article, for its body and separately for its title. GTE-ModernColBERT produces one vector per token, and those are mean-pooled within each section, so the dataset stores one 128-dimensional vector per section rather than per token.
| Model | Type | Dims | Context | Params | Reported score |
|---|---|---|---|---|---|
| Qwen3-Embedding-0.6B | Dense, decoder | 1024 | 32 K | 600 M | 70.7 MTEB v2 |
| GTE-ModernColBERT-v1 | ColBERT, encoder | 128 | 8-32 K | 139 M | 88.4 LongEmbed |
| arctic-embed-l-v2.0 | Dense, encoder | 1024 | 8 K | 568 M | 55.6 BEIR |
| nomic-embed-text-v1.5 | Dense, encoder | 768 | 8 K | 137 M | 62.3 MTEB v1 |
| e5-mistral-7b-instruct | Dense, decoder | 4096 | 4 K | 7.1 B | 66.6 MTEB v1 |
Every model is under Apache 2.0 except e5-mistral-7b-instruct, under MIT. Qwen3-Embedding builds on Alibaba's Qwen3 and e5-mistral on Mistral-7B, fine-tuned by Microsoft; GTE-ModernColBERT is LightOn's tuning of Answer.AI's ModernBERT, arctic-embed is Snowflake's tuning of BAAI's BGE-M3 over Meta's XLM-R, and nomic-embed builds on NomicBERT. E5-Mistral is planned and not yet embedded.
All vectors are stored as float16, which NumPy, PyArrow and Parquet read natively, unlike bfloat16.
Encoder models ran in TEI and decoder models in vLLM with --task embed.
embed_articles.py sends each article's first 16'384 characters, which the server truncates again to the model's context, and GTE-ModernColBERT mean-pools its token vectors within each section.
The scripts that produced the vectors and the original GPU ground truth stay in this repository as provenance: embed_articles.py, embed_sections.py, late_chunking.py and ground_truth.py.
- FineWiki shards and the embeddings are pulled and checked against their SHA-256 sums.
- An audit proves that section spans match every GTE offset file, that
(wiki, page)is unique, and that every vector is unit length. - One seed-42 shuffle and the key encoding are frozen before anything else is written.
- The Wikidata JSON dump is streamed once into compact tables of sitelinks, dates and places.
- Each article's wikitext is parsed for links, templates and dates, and its rendered text is split into sections and annotated.
- Graph inputs are cut from the vectors in shuffled order, and each graph is built, then refined until it reaches 99% recall.
Every section concatenates back to its FineWiki text, every non-null link target exists among the document keys, every span falls inside its text on a UTF-8 boundary, and every model file's keys equal its stem's keys.
Wikipedia sections hold 1'304'896'451 links: 89.3% name a Wikidata entity, 86.2% resolve to an article, and 0.79% could not be placed in their section.
They carry 504'197'545 dates, 72.8% from patterns, 26.3% from linked entities and 1.0% from templates, and 318'427'995 places, 99.1% of them from linked entities.
subject_dates and subject_places add 35'833'701 dates and 43'388'134 places about the articles' subjects, 47.6% of the places from geo_tags.
Links come from the wikitext, matched to the rendered sections by heading text and in order, never by count.
A link is placed only where its display words appear in order after the previous link of the same section; a free search would misplace the 23% of English display strings that repeat within a section.
Template and reference links rarely appear in the rendered text, so they are kept without a span or section rather than at a wrong position.
Titles resolve through FineWiki, then the page and redirect tables, and an entity comes from the target article or from current Wikidata sitelinks; 68'478 stored wikidata_id values disagreed with Wikidata and were corrected.
Dates and places come from three sources, each flagged:
- Templates: date and coordinate templates found in each wiki through their Wikidata items, such as
{{Birth date}},{{Start date}},{{Date}}and{{Coord}}, so localized names are covered without a per-wiki list. - Linked entities: a linked item that is a calendar item, or has a point in time, start or end time, a coordinate location, or a complete bounding box. Birth dates and inceptions of linked items are excluded, since every link to a person or a city would otherwise become a date.
- Patterns: per-wiki rules for years, full dates, ranges, decades, centuries and eras in the 20 largest wikis, and ISO dates everywhere. Ranges written with words, such as from 1937 to 1939, stay as two separate dates. Coordinates need degrees with a hemisphere, since a bare degree sign is mostly a temperature.
Wikidata values use best rank only, skip unknown and missing values, and convert Julian dates through Julian day numbers. Coordinates at exactly 0°, 0° are placeholders and are dropped, as are coordinates on other globes.
Not every arXiv paper has text yet.
Of the 3'192'870 papers, 77.4% convert from TeX to Markdown, 10.5% fail to parse, 8.0% are PDF-only submissions, 2.7% exceed the conversion time limit, and 1.5% have no recognizable LaTeX main file or fail otherwise.
Such a paper keeps its metadata with a null text; under CC BY or CC0 it still publishes its TeX in source, while a PDF-only paper has an empty source.
Of the 620'870 openly licensed papers, 140'223 have no text: 55'795 PDF-only, 53'035 parse failures, 28'260 timeouts and 3'133 others.
Later releases close the gap with LaTeXML, the converter behind arXiv's own HTML pages, for papers pandoc cannot parse, a longer time limit, and OCR of the PDF-only papers.
Four papers in the source archive have no metadata and are left out.
Preprint annotations are thin yet. Preprint links are citations and web links, so none names a Wikidata entity: 35% carry a DOI or arXiv URL, and 7.2% of arXiv links resolve to another document of the atlas, under 1% for bioRxiv and medRxiv. Over 90% of preprint dates are bare years, mostly those of cited works, and coordinates are almost absent. Later releases link the molecules, genes, species, theorems, datasets and other entities named in preprint text to Wikidata, and tell citation years apart from the dates a paper is about.
An arXiv paper is the version its source archive holds. The bulk archive keeps the version current when each monthly tar was cut, so a paper revised later carries that earlier version in its key and URL.
The sources are 14 months apart.
FineWiki's text is the August 2025 snapshot, while Wikidata is the 2026-10-26 dump and the page, redirect and geo_tags tables come from dumps of October and November 2026.
A link to a page created or renamed in between may stay unresolved, and an entity may carry facts newer than the article text.
Three Nomic vectors were recomputed.
Three source rows held a NaN: elwiki page Βραβεία Nickelodeon Kids' Choice, zhwiki page 第五届全国人民代表大会代表名单 and hewiki page פרס היצירה לסופרים עבריים.
They were re-embedded on a CPU with the original settings, which reproduce 36 neighboring rows at cosine 1.0000.
An article may lack an entity.
The 747'741 articles without a Wikidata item, 1.2% of the total, have a null entity, and links to them carry targets without entities.
USearchWiki goes beyond embeddings. Wikipedia articles contain rich structure — hyperlinks with descriptive anchor text, section hierarchies, tables, cross-lingual alignments, disambiguation — that can be parsed directly from the wikitext markup without any model inference. Combined with Wikidata properties and model-generated QA pairs, this creates multiple independent notions of relevance for the same corpus. The link spans, entities, sections, dates and places above implement the first three ideas and the temporal and geographic parts of the fifth; the rest are planned.
Wikipedia's internal links carry anchor text that describes the target article in context.
FineWiki preserves the raw wikitext alongside cleaned text, so every [[target|anchor]] link is extractable:
Wikitext: ...played [[football (soccer)|football]] between the [[Home Nations]]...
Extracted: "football" → [[Football (soccer)]]
"Home Nations" → [[Home Nations]]
"England" → [[England national football team]]
"tour of Central Europe" → [[1907–08 in English football#National team]]
Each anchor is a natural short query for which the target article is ground truth.
English Wikipedia has ~200M internal links — this creates millions of (query, relevant_document) pairs for free, far more realistic than synthetic queries or self-recall.
Different articles link to the same target with different anchors, capturing diverse search intents for the same document.
In this dataset every such pair is a link's span and its target key.
What it enables: Retrieval benchmarks where the query is natural human-written text, not a randomly sampled vector. Evaluates whether each embedding model's vector space places the anchor text near the target article.
Via Wikidata sitelinks, the same concept exists across 2–300 languages.
The article about "Paris" in English (Q90) maps to "パリ" in Japanese, "Париж" in Russian, "巴黎" in Chinese.
FineWiki provides wikidata_id for most articles, and this dataset corrects it against current Wikidata and stores it as the entity key, so the articles sharing an entity are one concept in every language:
enwiki: { title: "Paris", entity: Q90, ... }
jawiki: { title: "パリ", entity: Q90, ... }
ruwiki: { title: "Париж", entity: Q90, ... }
What it enables: Cross-lingual retrieval ground truth: given a query in language A, find the correct article in language B. Tests whether multilingual embedding models (Qwen3, Arctic) properly align their vector spaces across scripts. No existing ANN benchmark tests cross-lingual retrieval at scale.
FineWiki preserves section headings as Markdown ##/###.
A section heading is a natural query for its content:
## Early life → biographical passage about childhood
## Discovery and naming → how the element was found
## Economic impact → financial analysis sectionEach article becomes a tree of passages at different granularities — the full article, individual sections, and individual paragraphs. The heading itself serves as a query for which the section content is ground truth.
What it enables: Passage-level retrieval within articles — a more granular task than full-article retrieval. Tests whether embedding models capture topic boundaries within long documents.
Disambiguation pages explicitly list articles sharing names but meaning different things.
From wikitext: [[Mercury (planet)]], [[Mercury (element)]], [[Mercury (mythology)]], [[Freddie Mercury]].
These are natural hard negatives — articles that share surface-level query terms but should retrieve different documents.
Extractable from disambiguation templates in wikitext and from Wikidata instance_of divergence.
What it enables: Precision benchmarks: can the embedding model distinguish "Mercury" the planet from "Mercury" the element when the query is ambiguous? Standard ANN benchmarks have no concept of hard negatives.
Wikidata properties and Wikipedia page statistics provide rich, naturally correlated filter attributes. Unlike synthetic random labels used in NeurIPS'23, these filters correlate with semantic content — articles about nearby cities cluster both geographically AND in embedding space.
| Attribute | Type | Source | Example filter |
|---|---|---|---|
instance_of |
Categorical | Wikidata P31 | "only biographies" or "only cities" |
country |
Categorical | Wikidata P17 | "articles about France" |
coordinates |
Geo (lat/lon) | Wikidata P625 | "within 200 km of Tokyo" |
inception_year |
Temporal | Wikidata P571 / P569 | "events between 1939 and 1945" |
population |
Numeric | Wikidata P1082 | "cities with population > 500K" |
pageviews_monthly |
Numeric | Wikimedia pageviews | "popular articles only (> 10K views)" |
num_sitelinks |
Numeric | Wikidata sitelinks | "exists in 50+ languages" |
num_inlinks |
Numeric | pagelinks SQL dump |
"over 1,000 incoming links" |
language |
Categorical | FineWiki in_language |
"only Japanese articles" |
The coordinates and dates are stored today as subject_places, subject_dates, places and dates; the other attributes are planned.
What it enables: Filtered ANN benchmarks with realistic, multi-type filter conjunctions: "French cities founded after 1800 with population > 100K." Controllable selectivity: ship query sets at 0.1%, 1%, 10%, 50% selectivity.
Two articles citing the same external source (URL or DOI in <ref> tags) are related in a way distinct from semantic similarity or link structure.
Articles about the same scientific finding, or different news coverage of the same event, share citations but may not link to each other.
Wikitext: <ref>{{cite journal|doi=10.1038/nature12373|...}}</ref>
Extracted: doi:10.1038/nature12373 → shared by articles A, B, C
What it enables: A "citation graph" orthogonal to the link graph — tests whether embeddings capture source-level relatedness.
Run a small model (Qwen-2.5-3B) on each article to generate 3–5 factual questions whose answers are in the text. The generated question becomes a query, the source article becomes the ground truth document.
Article: "The 1908 Olympics, held in London, featured..."
Generated: "Where were the 1908 Olympics held?" → this article
What it enables: Standard retrieval evaluation in the BEIR/MSMARCO format, but over Wikipedia's full breadth.
FineWiki extracts infoboxes as structured JSON, kept in the infoboxes column:
[{"title": "1907–08 British Home Championship",
"data": {"Host country": "England, Ireland, Scotland and Wales",
"Dates": "15 February – 11 April 1908",
"Teams": "4"}},
{"title": "Tournament statistics",
"data": {"Top scorer(s)": "Vivian Woodward · Jimmy Quinn (4 goals)"}}]Each key-value pair is a structured fact that can be turned into a query: "Who was the top scorer of the 1907–08 British Home Championship?" → this article.
What it enables: Structured knowledge retrieval — queries derived from real structured data, not synthetic.
Cohere's Wikipedia releases are the closest analogue, embedding Wikipedia passages in many languages with one Cohere model per release. They ship the vectors and the passage text, but no links, dates or places and no search graphs, and a different model means a different download.
BEIR, MTEB and KILT measure retrieval quality against curated relevance labels, and KILT grounds its tasks in a single Wikipedia snapshot. Their corpora are small enough to search exactly, so they test models rather than search engines.
The big-ann-benchmarks tracks scale to a billion vectors, but each dataset comes from one model, and most from image or word descriptors older than current text encoders.
USearchWiki joins the two: several current embedding models over the same multilingual rows, with graphs at full scale, and with links, entities, dates and places to filter and label those rows.
If USearchWiki helps your research or product, please cite it:
@dataset{Vardanian_USearchWiki,
author = {Vardanian, Ash},
title = {{USearchWiki: An Open, Searchable Atlas of Wiki-Style and Scholarly Text}},
doi = {10.5281/zenodo.23977284},
url = {https://github.com/unum-cloud/USearchWiki},
license = {Apache-2.0}
}A machine-readable CITATION.cff is provided at the repository root.
The code in this repository is licensed under Apache 2.0.
Dataset licensing depends on the components:
- Wikipedia text: CC BY-SA 4.0
- Preprint text: each paper's own license, named in its
licensecolumn; text, sections, annotations, markup and source files are published only under CC BY or CC0 - Preprint metadata: titles, authors, categories, dates and URLs of every paper, published whatever its license; arXiv's abstracts come from its CC0 metadata
- FineWiki extraction: Apache 2.0
- Embeddings: Governed by each model's license (see table above — all selected models use Apache 2.0 or MIT)
- Annotations: Derived from Wikimedia and Wikidata dumps (CC0 for Wikidata, CC BY-SA 4.0 for Wikipedia)