2013-12-04 5 views
0

У меня есть сценарий, в котором я храню URL-адреса в документах в определенном индексе в Elasticsearch. Иногда я получаю существующий URL несколько раз. Я хочу использовать Elasticsearch для увеличения количества раз, когда я сталкиваюсь с определенным URL. Это можно выполнить с помощью API обновлений с помощью скриптов. Однако это иногда кажется медленным и сложным.Ускорение обновления документа в Elasticsearch

Есть ли способ в Elasticsearch увеличить документ при обновлении существующего документа? Если да, то я думаю, что могу использовать это для измерения хитов, так как я могу увеличивать каждый раз, когда сталкиваюсь с существующим URL-адресом, и это решит все мои проблемы.

ответ

0

Если вы обновляете повышение документа при обновлении, вы все равно должны удалить + переопределить документ. Это не спасет вас от какой-либо производительности, но вы потеряете гибкость из-за повышения индекса и уменьшения точности.

Было бы проще просто увеличивать поле, а затем использовать это поле в качестве пользовательского значения повышения позже (с помощью функции function_score , custom_score и т. д.). Такие же накладные расходы, но и большая гибкость. Если вы обнаружите, что слишком медленно обновлять весь документ, вы можете разделить счетчик на свой собственный тип документа, который предназначен для счетчиков. Поскольку документы будут содержать только одно поле, они будут обновляться очень быстро.

+0

Так что это может сработать, но я не уверен. Надо попробовать. Но когда я использовал счетчики в тех же документах, что и URL, я заметил много конфликтов версий. Моя настройка состоит в том, что у меня есть 3 узла с двумя узлами данных и один узел без данных, и я пишу на не-узел данных (который также является главным). Причина конфликтов версий может заключаться в том, что узел не-данных действует как LB в кластере, и когда встречаются два URL-адреса, мы пытаемся увеличить счетчик, но это может происходить одновременно на двух разных узлах, что приводит к конфликтам версий. Наша скорость индексирования/обновления составляет около 8 К/сек. – vaidik

+0

Обновления документа происходят только на основном осколке, поэтому на самом деле не важно, сколько узлов находится в вашем кластере или куда вы отправляете запрос. Запрос обновления всегда будет перенаправлен на единственный первичный осколок, который содержит документ. Конфликт версий связан с тем, что ES использует оптимистичный контроль параллелизма, и два обновления гоняются друг за другом на одном и том же осколке. Увеличьте свой «retry_on_conflict», и обновления в конечном итоге будут «прилипать». – Zach

Смежные вопросы