Ответ 1
API справочного документа 1.x говорит, что вы можете оставить идентификатор, и он будет сгенерирован автоматически. Используйте POST вместо put, и op_type будет автоматически настроен на создание.
Мне нужно сохранить уникальный идентификатор auto increment вместе с остальными полями моего документа в ElasticSearch. Есть ли в ElasticSearch, чтобы получить их.
Я нашел это в качестве потенциального решения: http://blogs.perl.org/users/clinton_gormley/2011/10/elasticsearchsequence---a-blazing-fast-ticket-server.html
Но я просто удивляюсь, есть ли лучший способ?
API справочного документа 1.x говорит, что вы можете оставить идентификатор, и он будет сгенерирован автоматически. Используйте POST вместо put, и op_type будет автоматически настроен на создание.
Здесь другой способ использования elasticsearch для создания iids
:
Основное преимущество заключается в том, что iid
может быть скопирован с помощью простых дампов, где реализация с использованием _version
elasticsearch не может выполнить резервное копирование версии.
Он позволяет запросить большую часть iids, чтобы свести к минимуму количество требуемых запросов.
Запрос на получение основной части 10 iids
будет выглядеть следующим образом:
curl -XPOST "http://localhost:9200/sequence/sequence/1/_updatefields=iid&retry_on_conflict=5" -d '{
"script": "ctx._source.iid += bulk_size",
"params": {
"bulk_size": 10
},
"lang": "groovy",
"upsert": {
"iid": 0
}
}'
Ему нужно это (оптимизированное) отображение для индекса:
curl -XPOST http://localhost:9200/sequence/_mapping -d '{
"settings": {
"number_of_shards": 1,
"auto_expand_replicas": "0-all"
},
"mappings": {
"sequence": {
"_all": {
"enabled": 0
},
"_type": {
"index": "no"
},
"dynamic": "strict",
"properties": {
"iid": {
"type": "string",
"index": "no"
}
}
}
}
}'
Более подробное описание можно найти здесь:
Как и в Elasticsearch v1.1.0, нет встроенной поддержки автоинкрементных идентификаторов, насколько я знаю. Также официальная документация не упоминает никаких функций, подобных этой.
В блоге, который вы упомянули, используется приемлемый подход. Он имеет преимущество в сохранении последнего идентификатора, который использовался в Elasticsearch. По сравнению с, например, сохраняя значение auto-incremented в Redis или любом другом внешнем источнике данных, вам не нужно беспокоиться о сбое системы в производстве. Тогда нет двух источников данных, которые могут быть не синхронизированы.
Кстати, я реализовал node.js-модуль на основе этого подхода.
В зависимости от того, чего вы хотите достичь, это может быть вариант - он все еще находится на очень ранних этапах разработки: https://github.com/elastic/elasticsearch/issues/10708