AACSearch
Руководства

Приватные поля

Поля вроде себестоимости остаются доступны доверенным вызовам и никогда не попадают в виджет, ассистента и ответы ключей без права.

Индекс → Настройки поиска → Приватные поля (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 применяют то же правило.