Если в базе данных SQL строки данных хранятся в таблицах, то в OpenSearch данные хранятся в виде нескольких документов внутри индекса. Однако на этом аналогия заканчивается, так как работа с документами и индексами в OpenSearch существенно отличается от работы с реляционными базами данных.
Например, документами могут быть:
- Продукты в индексе электронной коммерции
- Строки журнала в приложении для регистрации данных
- Строки счета-фактуры в системе выставления счетов-фактур
Поля документа
Каждый документ представляет собой JSON-структуру, которая в конечном итоге рассматривается как набор пар "ключ:значение". Эти пары затем индексируются способом, определяемым отображением документа. Картография определяет тип данных поля: текст, ключевое слово, плавающая величина, время, геоточка или другие типы данных.
Документы OpenSearch называются бессхемными, поскольку OpenSearch не требует предварительного определения структуры полей индекса, равно как и не требует, чтобы все документы в индексе имели одинаковую структуру. Однако если поле сопоставлено с определенным типом данных, то все документы в индексе должны поддерживать этот тип сопоставления.
Каждое поле может быть отображено в индексе более чем одним способом. Это может быть полезно, поскольку нам может потребоваться структура ключевых слов для агрегирования и в то же время сохранять структуру анализируемых данных, позволяющую осуществлять полнотекстовый поиск по отдельным словам в поле.
Источник документа
Источник документа OpenSearch состоит из исходных данных в формате JSON до их индексации. Эти данные извлекаются при выполнении поискового запроса.
Документы и архитектура индексов
Обратите внимание, что в разных приложениях "документ" может рассматриваться по-разному. Например, в системе выставления счетов мы можем иметь архитектуру, в которой счета хранятся как документы (1 документ на счет), или индексную структуру, в которой хранится множество документов в виде "строк счета" для каждого счета. Выбор зависит от того, как мы хотим хранить, отображать и запрашивать данные.
Примеры
Создание документа в пользовательском индексе:
1 2 3 4 5 6 |
В приведенном выше запросе мы не указали ID документа, поэтому операция индексации генерирует уникальный ID документа. Здесь _doc - это тип документа.
1 2 3 4 5 6 |
В приведенном выше запросе документ будет создан с идентификатором 1.
Для получения документа из индекса по идентификатору можно использовать следующий запрос 'GET':
1 | GET /users/_doc/1 |
Ниже приведен результат, который содержит документ (в поле _source) в качестве метаданных:
1 2 3 4 5 6 7 8 9 10 11 12 | { "_index": "users", "_type": "_doc", "_id": "1", "_version": 1, "_seq_no": 1, "_primary_term": 1, "found": true, "_source": { "name": "Petey", "lastname": "Cruiser", } } |