1. Проверять ничего не надо, если данные не нужны, запрос на обновление всего документа аналогичен запросу на добавление. Запрос ниже либо создаст новый документ, либо полностью заменит существующий.
PUT /компании/компания/{_id}
{
"навание": "SpaceX",
"работники": ...,
}
Если "hash" уникален для каждой копании, его можно использовать в качестве _id
PUT /компании/компания/{hash}
{
...
}
В более ранних версиях (до 1.5) можно было использовать alias для поля _id, которое может генерироваться автоматически:
"mappings": {
"компания": {
// в текущей версии: 2.3 depricated - сказывалось на производительности
"_id": {"path": "hash"},
"properties": {
"навание": {
"type": "string"
},
...
}
}
}
2. В эластике нет, как таковых массивов, есть вложенные объекты. Любое поле документа может содержать множество значений, но
значения должны быть одного типа. Тип может быть nested или object, nested позволяет производить более удобный поиск при множестве вложенных объектов.
Если правильно понимаю, и должности разные, то будет удобнее использовать nested. Иначе object.
"mappings": {
"компания": {
"properties": {
"работники": {
"type": "nested",
"properties": {
"должность": {
"type": "string"
},
"имя": {
"type": "string"
}
}
}
}
}
}
// создание/обновление
PUT /компании/компания/{_id}
{
"название": "...",
"hash": "...",
"работники": [
{
"должность": "манагер",
"имя": ["Анатолий", "Андрей"]
},
{
"должность": ["управляющий", "заместитель"]
"имя": "Дмитрий"
},
{
"должность": "кассир",
"имя": ["Татьяна", "Анастасия"]
},
]
}
// примерный поиск
GET /компании/компания/_search
{
"query": {
"nested": {
"path": "работники",
"query": {
"bool": {
"must": [
{ "match": { "работники.должность": "управляющий" }},
{ "match": { "работники.должность": "кассир" }}
]
}
}
}
}
}