Приватные поля
Поля вроде себестоимости остаются доступны доверенным вызовам и никогда не попадают в виджет, ассистента и ответы ключей без права.
Индекс → Настройки поиска → Приватные поля (settings.search.privateFields, до
64 полей). При сохранении проверяется, что поля есть в схеме и что настройки по
умолчанию (query_by, facet_by, sort_by, подсветка) и профили их не
используют — иначе PRIVATE_FIELD.
| Кто вызывает | Приватные поля |
|---|---|
API-ключ со scope documents:read_private (или *) | Да |
| API-ключ без этого scope | Нет |
Виджет (/embed/*) | Никогда |
| Ассистент, answer, RAG | Никогда |
GET /documents/export | Только со scope, иначе поля вырезаются из каждой строки |
Скачивание снимка (GET /indexes/{slug}/snapshots/{id}) | Только со scope, иначе download равен null |
Ограниченные ключи (POST /indexes/{slug}/scoped-key) | Для индекса с приватными полями не выпускаются вовсе, если у выпускающего ключа нет documents:read_private (400 PRIVATE_FIELDS_PRESENT): браузер с таким ключом мог бы фильтровать по приватному полю и читать found |
| Консоль | Владельцы и админы — да, участники — нет (документы, открытые участником, приходят без них) |
Без доступа поле исчезает из документа в хитах, подсветки, text-match, счётчиков
фасетов, групп, explain, GET /documents/{id} и экспорта; в реранкер оно не
отправляется.
Запрос, который называет приватное поле в query_by, filter_by, sort_by,
facet_by, include_fields или group_by без scope, отклоняется с 400
PRIVATE_FIELD (details.fields, details.params): фильтр cost_price:<10
раскрывал бы значение через состав выдачи. POST /embed/search отвечает так же.
Проверяется то, что получил бы движок: facetFilters сначала объединяются с
filter_by, а имена полей сравниваются после удаления кавычек, пробелов и ! —
" cost_price:10" отклоняется так же, как cost_price:10. Поиск по значениям
фасета (/facets/{attribute}/search) и /assistant/native применяют то же правило.