Как сделать публикацию находимой
Набор находят по странице с постоянным адресом. Человек читает на ней описание и лицензию, поиск по данным читает разметку, сборщик каталога забирает отдельный файл, а ссылка из отчёта ведёт на выпуск с DOI. Репозиторий, запись в Zenodo и карточка в чужом каталоге называют тот же набор и ведут на эту страницу.
Ниже порядок для одного набора среднего размера. Как устроены сами площадки — в главах о статическом сайте, о Git и об облаке и хабах. Как то же самое платформа делает для тысяч страниц — в главе о находимости каталога.
Кто ищет и что он читает
Одного файла в открытом доступе мало: у каждого читателя свой вход.
| Кто ищет | Что открывает | Что для него готовят |
|---|---|---|
| Человек со ссылкой | страницу | описание, лицензия, файл, дата, контакт |
| Обычный поисковик | HTML и ссылки с других сайтов | текст на странице и карта сайта |
| Поиск по данным, например Google Dataset Search | разметку на странице | schema.org типа Dataset, которую можно прогнать тестом |
| Сборщик национального или ведомственного каталога | файл в профиле, о котором вы договорились | data.json или DCAT-AP, с заполненными полями этого профиля |
| Автор отчёта или статьи | выпуск, который не меняется задним числом | метку версии и DOI этого выпуска |
Темы репозитория dataset и open-data помогают тем, кто ищет репозитории на самой площадке. Поиск по данным их не читает. Почему так устроен GitHub — в главе о репозиториях.
Один главный адрес
Когда мест несколько, у набора всё равно один главный адрес: страница, которую ведёте вы. Остальные адреса на неё опираются.
| Поле разметки | Куда смотрит |
|---|---|
url | главная страница |
identifier | DOI выпуска, после того как номер выдан |
sameAs | другая страница того же набора, например запись Zenodo |
includedInDataCatalog | каталог, в котором запись уже появилась |
Google просит ставить полную разметку на главную страницу. Если разметка стоит и на копии, у копии в sameAs лежит адрес главной. Одно и то же значение sameAs у двух разных наборов склеивает их в один. Адрес поиска, ветки main и списка файлов в sameAs не ставят: это не страница набора.
Адрес страницы не собирают из заголовка. Заголовок правят, путь остаётся: …/bus-stops. Старые ссылки из статей и из индекса поисковика помнят путь, а не сегодняшнее название.
Поле includedInDataCatalog заполняют после того, как сборщик опубликовал запись. Имя каталога в разметке до этого обещает карточку, которой нет.
Что поставить на страницу
Разметка — блок application/ld+json в HTML страницы. Готовый текст лежит в schema-dataset.jsonld. Его вставляют в шаблон страницы. В README на github.com тот же текст остаётся абзацем для человека: тега script там нет, и поиск по данным его не читает.
Документация Google, сверенная 14 октября 2026 года, требует у типа Dataset два поля: name и description. Описание — от 50 до 5000 знаков. Более длинный текст поиск обрезает на 5000. Одно короткое предложение часто не дотягивает до 50. В описании пишут, что в таблице, за какой период и территорию, кто собрал и как часто файл меняется.
Остальные поля Google называет рекомендуемыми. Без них тест может пройти, а пользоваться набором нельзя. Лицензию, издателя и прямую ссылку на файл просят ещё и потому, что тип Dataset ставят и на мусор: об этом в главе о находимости каталога.
| Поле | Что писать |
|---|---|
name | название, по которому этот набор отличить от соседнего |
description | от 50 до 5000 знаков, тот же смысл, что в тексте страницы |
license | ссылка на конкретную версию, например CC BY 4.0. Ссылка на CC BY без номера версии для Google слабее |
distribution с contentUrl | прямая ссылка на файл и его encodingFormat. Ссылка на раздел сайта файлом не является |
creator, publisher | кто собрал и кто издаёт |
dateModified | дата файла. Её меняют в тот день, когда меняется файл |
temporalCoverage, spatialCoverage | период в виде 2020-01-01/2025-12-31 и территория. Если периода или территории нет, строки из шаблона удаляют |
identifier | DOI. В шаблоне книги этого поля нет: его добавляют после выдачи номера |
sameAs | вторая страница того же набора |
Google пишет, что понимает на странице и schema.org, и DCAT. Проверка расширенных результатов принимает schema.org. Пример DCAT в той же документации помечен как неподдерживаемый тестом. Поэтому на своей странице ставят JSON-LD: его можно проверить до того, как давать ссылку людям. Атрибуты dcat:Dataset на странице JKAN этот тест не подтверждают. Файл data.json для сборщика — отдельный документ, его Google со страницы не читает.
Словарь колонок для людей и программ лежит в datapackage.json. Google отдельно называет экспериментальной разметку CSVW прямо на странице и предупреждает, что тест на такой блок ругается. Для таблицы хватает CSV по прямой ссылке и описателя пакета.
Страница отдаёт этот HTML сама, без входа и без капчи. Оболочка, которую дорисовывает скрипт в браузере, для робота пуста. Как это выглядит у больших сайтов — в главе о находимости каталога.
Карта сайта
Google просит карту сайта, чтобы находить адреса наборов, и sameAs, чтобы понимать, где копии. У одного набора в карте одна строка. У каталога из десятков страниц без карты робот может не дойти до каждой.
Файл robots.txt поисковик читает только из корня имени сайта. Так сказано в RFC 9309, и тот же предел разобран на геопорталах в главе о находимости каталога. У адреса https://имя.github.io/bus-stops/ корень — https://имя.github.io/robots.txt. Файл robots.txt внутри каталога bus-stops этим правилом не является. Если корнем вы не распоряжаетесь, отдельный запрет из вашего каталога не появится. Карту тогда отправляют в Google Search Console по полному адресу sitemap.xml.
GitHub Pages сам разметку Dataset и карту сайта не пишет. Оба файла кладут в сборку сайта. Пределы хостинга и готовые генераторы — в главе о статических сайтах.
Файл для сборщика
Разметка одной страницы в национальный каталог не попадает. Сборщик забирает файл в том профиле, который принимает сейчас, а не в самой новой редакции схемы. data.gov по-прежнему собирает и DCAT-US 1.1, хотя версия 3.0 уже опубликована. Какой язык кому отдают — в главе о стандартах.
Файл готовят, когда сборщик есть и вы подали ему адрес. Регистрация сайта в Search Console этот адрес сборщику не сообщает. Как подать каталог на сбор — в главе о федерациях.
Файл, который объявляет схему и молчит об обязательных полях, сборщик может забрать таким, какой он есть. Короткий data.json у JKAN и записи без лицензии у небольшого ведомства разобраны в главах о статических сайтах и «Когда портал не нужен». Если сборщика нет, отдельный файл ради строки conformsTo не заводят: страница с разметкой уже описывает набор.
Вторая страница с DOI
DOI нужен, когда на выпуск ссылаются в тексте. Для внутренней таблицы его не заводят. Как связать репозиторий GitHub с Zenodo и почему .zenodo.json перекрывает CITATION.cff — в главе о репозиториях. Пока номера нет, блок identifiers из шаблона CITATION.cff удаляют.
Запись Zenodo с типом «набор данных» сама становится страницей с разметкой Dataset. DataCite пишет, что в Google Dataset Search попадают посадочные страницы с классом Dataset, а согласование содержимого по DOI — только если запись в состоянии Findable и тип ресурса Dataset. Сроком, когда Google дойдёт до страницы, DataCite не распоряжается. Тип «программа» этот класс не получает: в .zenodo.json для данных ставят upload_type со значением dataset.
Живая запись показывает, что страница Zenodo и ответ по DOI — два разных документа. 14 октября 2026 года выпуск Cantometrics, DOI 10.5281/zenodo.4898406, отдал в HTML один блок JSON-LD. Обычный запрос страницы вернул код 200. Тот же адрес с заголовком браузера Mozilla/5.0 вернул 403: отказ относится к этому заголовку, а не к отсутствию страницы.
- Тип в разметке страницы —
https://schema.org/Dataset. Короткого словаDatasetсразу после кавычки там нет. - Видимый текст описания — «The data repository for the Cantometrics dataset», 48 знаков. Строка в разметке длиннее, 56 знаков, только из-за тегов абзаца. Порог Google — от 50 знаков самого описания.
licenseведёт на текст CC BY-NC 4.0. В репозитории той же метки файл лицензии — CC BY 4.0. Расхождение уже разобрано в главе «Когда портал не нужен».url—https://zenodo.org/records/4898406. ПоляsameAsнет.contentUrlведёт на ZIP выпуска. Запрос заголовков этого адреса вернул код 200 и типapplication/octet-stream. В разметке у файла указанapplication/zip.
Запрос JSON-LD по тому же DOI в тот день вернул другой документ: тип Dataset, описание из 48 знаков, без ссылки на файл. Поле url в нём — старый путь /record/4898406, он отвечает кодом 301 и уводит на /records/4898406. Адрес метки в GitHub этот ответ называет статьёй, на которой набор основан, а не второй страницей набора.
Отсюда практический вывод. DOI и страница Zenodo закрывают ссылку из отчёта и дают поиску по данным ещё одну страницу. Текст описания, лицензию и прямую ссылку держат на своей странице и в запись Zenodo копируют теми же. В identifier своей разметки ставят DOI выпуска. В sameAs — адрес записи Zenodo. В цитате используют DOI выпуска, а общий DOI всех версий оставляют тем, кому нужна последняя.
Порядок на одном наборе
Пример — расписание автобусов района. Имена вымышленные, файлы — шаблоны этой книги. Рядом можно открыть живой репозиторий Country Codes: у него другая тема, описатель называется datapackage.yml, а 14 октября 2026 года в HTML страницы репозитория не было блока JSON-LD.
-
Репозиторий. Положите шаблоны: README,
datapackage.json,LICENSE, таблицу вdata/. ВCITATION.cffоставьтеtype: datasetи удалите блокidentifiers, пока DOI нет. В README напишите, что это за расписание, за какой сезон, кто отвечает и как часто файл меняется. Темыdatasetиopen-dataпоставьте: они помечают репозиторий на площадке. Что ещё лежит в пакете и где кончаются пределы Git — в главе о репозиториях. -
Страница. Соберите сайт из этого репозитория или положите страницу на уже существующий сайт. Путь
…/bus-stopsне меняется вместе с заголовком. В HTML вставьте блок из шаблона разметки. Описание сделайте длиннее 50 знаков, например: «Расписание остановок и времени отправления автобусов района за сезон: остановка, маршрут и время. Файл обновляют раз в сезон.» Лицензия — ссылка на CC BY 4.0. ВcontentUrl— прямая ссылка на CSV. Полеidentifierпока не добавляйте. -
Проверка разметки. Адрес страницы вставьте в проверку расширенных результатов. Ошибки типа Dataset исправьте до того, как давать ссылку. Страница должна открываться без входа: иначе тест и поисковик видят заглушку.
-
Карта сайта. Положите
sitemap.xmlс адресом этой страницы. Если распоряжаетесь корнем имени сайта, укажите карту вrobots.txtэтого корня. Иначе отправьте полный адрес карты в Search Console. -
Версия и DOI. Если на расписание будут ссылаться, поставьте метку, например
v2026.1, и получите DOI выпуска. Номер впишите вCITATION.cffна ветке и вidentifierразметки. ВsameAsпоставьте адрес записи Zenodo. Лицензия вLICENSE, в описателе, на странице и в записи Zenodo — одна и та же. Для таблицы, на которую никто не ссылается, шаг пропускают. -
Сборщик. Если региональный или национальный каталог забирает файл, положите его в профиле, который каталог принимает, и подайте адрес. Поля, которые профиль считает обязательными, заполните до заявки.
-
Через несколько дней и ещё раз через несколько недель. Найдите название в Google Dataset Search. Google пишет, что обход занимает несколько дней, а исчезновение из выдачи — дни или недели. Раньше этого срока площадку не меняют. Сначала перепроверьте тест разметки и то, что страница открыта без входа.
Пример: главный адрес на своей странице
Контекст. Двое уже ведут квартальную таблицу в репозитории. Раз в год ставят выпуск и получают DOI. Национальный каталог организацию не собирает. Через месяц по названию таблицу не находят в поиске по данным. Один участник предлагает давать ссылку на репозиторий, другой — только DOI, третий — поставить портал.
Варианты. Вкладка репозитория на github.com. Только запись Zenodo. Своя страница с разметкой, DOI в identifier и адресом Zenodo в sameAs. Портал.
Критерии. Разметку можно проверить до индексации. Ссылка из отчёта открывает неизменный выпуск. Человек без DOI открывает описание и файл. Сопровождение остаётся у этих двоих.
Решение. Главный адрес — своя страница. DOI выпуска стоит в отчёте и в поле identifier. Запись Zenodo — вторая страница того же набора.
Почему. Вкладка github.com у репозитория со словарём колонок не содержит Dataset: 14 октября 2026 года так открылась страница Country Codes. Запись Zenodo тип Dataset ставит сама, но описание и лицензию берёт из того, что ей отправили. У Cantometrics видимый текст короче порога Google, а лицензия на странице Zenodo разошлась с файлом в репозитории. Портал добавляет сервер при одном наборе и двух публикаторах.
Последствия. Карту сайта и разметку обновляют вместе с файлом. Пустой DOI не публикуют. Поиск по данным может сначала показать страницу Zenodo: у неё тоже тип Dataset. После индексации своей страницы обе страницы связаны через identifier и sameAs.
Когда пересмотреть. Наборов стало больше, чем двое успевают размечать. Появился сборщик и назвал профиль файла. Описание или лицензия на своей странице и в Zenodo разошлись.
Как записать такую карточку у себя — в главе «Как обосновать решение». Выбор репозитория для этой таблицы — в главе о Git.
Как проверить
Проверка своей страницы занимает несколько минут. Подставьте её адрес.
PAGE=https://example.org/bus-stops
# Страница открывается без входа
curl -sI -o /dev/null -w "%{http_code}\n" -L "$PAGE"
# В HTML есть тип Dataset: и короткое имя, и полный адрес schema.org
curl -sL "$PAGE" | grep -o '"@type"[[:space:]]*:[[:space:]]*"[^"]*Dataset"' | head -1
Код 200 и строка с Dataset значат, что страница отдаёт разметку. Дальше адрес вставляют в проверку расширенных результатов: документация Google требует у описания от 50 до 5000 знаков, и тест сверяет разметку с этими правилами. Пустого identifier в блоке быть не должно.
Команды ниже сняты 14 октября 2026 года с чужих публикаций. Они показывают разрыв, а не образец.
# Страница репозитория открывается. Блока JSON-LD в ней нет: вывод пустой
curl -sL -o /dev/null -w "%{http_code}\n" "https://github.com/datasets/country-codes"
curl -sL "https://github.com/datasets/country-codes" | grep -o 'application/ld+json' | head
# JSON-LD по DOI: тип Dataset, старый путь /record/, без distribution
curl -sL -H "Accept: application/ld+json" "https://doi.org/10.5281/zenodo.4898406"
# Старый путь перенаправляет на /records/
curl -sI -o /dev/null -w "%{http_code}\n" "https://zenodo.org/record/4898406"
# Страница Zenodo: код и тип Dataset в HTML
curl -sL -o /dev/null -w "%{http_code}\n" "https://zenodo.org/records/4898406"
curl -sL "https://zenodo.org/records/4898406" | grep -o '"@type"[[:space:]]*:[[:space:]]*"[^"]*Dataset"' | head -1
# API записи и файл из contentUrl
curl -sL "https://zenodo.org/api/records/4898406"
curl -sI -L -o /dev/null -w "%{http_code}\n" \
"https://zenodo.org/api/records/4898406/files/theglobaljukebox/cantometrics-v0.1-alpha.zip/content"
В тот день страница Country Codes вернула 200, поиск application/ld+json ничего не нашёл. Ответ по DOI был типом Dataset. Путь /record/4898406 вернул 301. Страница /records/4898406 вернула 200, а поиск типа нашёл "@type": "https://schema.org/Dataset". API записи вернул 200 и тип dataset. Заголовки файла из contentUrl вернули 200 и тип application/octet-stream. Запрос этой же страницы с заголовком Mozilla/5.0 вернул 403.
Где путь ломается
- Вкладка репозитория вместо страницы. Файл и README на месте, типа Dataset в HTML нет. Обычный поиск может найти README. Поиск по данным ищет разметку.
- Описание короче 50 знаков. Тип Dataset объявлен, обязательное поле по правилам Google не заполнено. Теги вокруг короткой фразы длину текста не заменяют.
- Пустой или вымышленный DOI. Номер-заглушка из
CITATION.cffпопадает в чужие ссылки. Пока номера нет, блокаidentifiersи поляidentifierнет. - Один
sameAsу двух наборов. Поиск склеивает разные таблицы в одну запись. contentUrlведёт на раздел сайта. Скачивать нечего. В поле стоит адрес файла.- Файл объявляет профиль и пропускает его поля. Сборщик публикует дырявую карточку. Без сборщика такой файл не заводят.
- Три места с тремя лицензиями. Человек по DOI и человек по репозиторию получают разные условия. Лицензию пишут один раз и копируют.
- Капча, вход или страница из скрипта. Тест разметки и робот видят заглушку. Через месяц индекс будет пуст по той же причине.
Чем этот путь отличается от портала
Портал сам собирает выгрузку, карту сайта и часто разметку для каждой страницы. Здесь это делает автор страницы, по одному набору. Проверка та же, что в главе о находимости каталога: адрес открыт, разметка проходит тест, карта сайта известна поисковику, нужный профиль отдан сборщику. Когда наборов становится больше, чем один человек успевает описывать, или сбор идёт по расписанию из многих организаций, возвращайтесь к главе «Когда портал не нужен»: порог там записан заранее.
Источники
- Разметка Dataset в документации Google — обязательны
nameиdescriptionот 50 до 5000 знаков; schema.org и DCAT на странице; пример DCAT проверка расширенных результатов не принимает;sameAs, карта сайта,contentUrl. Сверено 14 октября 2026 года - DataCite: посадочные страницы и Google Dataset Search — класс Dataset на странице, карта сайта или ссылки, состояние Findable и тип ресурса Dataset для согласования содержимого. Справка DataCite по-прежнему называет старый инструмент проверки структурированных данных. Актуальная проверка в документации Google — Rich Results Test
- RFC 9309 —
robots.txtчитается из корня имени сайта - Google Search Console, Google Dataset Search
- Country Codes — 14 октября 2026 года страница ответила кодом 200, блока
application/ld+jsonнет. Имя описателяdatapackage.ymlразобрано в главе о Git-репозиториях - Cantometrics, DOI 10.5281/zenodo.4898406 — 14 октября 2026 года. В HTML страницы JSON-LD с типом
https://schema.org/Dataset, видимое описание 48 знаков, лицензия CC BY-NC 4.0,contentUrlна ZIP,sameAsнет. Обычный запрос страницы — 200. Запрос с заголовкомMozilla/5.0— 403. API записи — 200, типdataset. JSON-LD по DOI — безdistribution,urlс путём/record/, этот путь отвечает 301. Заголовки файла изcontentUrl— 200,application/octet-stream - Шаблоны: /templates/README.md, /templates/datapackage.json, /templates/CITATION.cff, /templates/schema-dataset.jsonld
- Экспорт метаданных, находимость каталога, GitHub и Zenodo