Блокировка конкретного документа для редактирования в Solr - PullRequest
0 голосов
/ 01 мая 2019

Есть ли способ заблокировать определенный документ для редактирования / удаления в Solr6 или Solr7?Например, я читаю документ, основываясь на его содержании и вижу, что он должен быть обновлен или удален.Затем я отправляю запрос на обновление / удаление.Но между моментом, когда я читаю документ, и моментом отправки этого запроса, я хочу убедиться, что документ не обновлен и не удален каким-либо другим процессом - «заблокируйте» его для любых изменений.Есть ли способ сделать это?

1 Ответ

1 голос
/ 02 мая 2019

Вы можете использовать функцию оптимистичного параллелизма в Solr.

По сути, вы включаете значение из поля _version_ вашего документа в ваш запрос. Если введенное вами значение _version_ не соответствует значению в документе (т. Е. Документ был обновлен с момента его получения), обновление завершится неудачно и вместо него будет возвращен код ошибки 409 HTTP.

  • Клиент читает документ. В Solr можно получить документ с обработчиком / get, чтобы иметь самую последнюю версию.

  • Клиент изменяет документ локально.

  • Клиент повторно отправляет измененный документ в Solr, например, возможно с обработчиком / update.

  • В случае конфликта версий (код ошибки HTTP 409) клиент начинает процесс заново.

Значение, указанное в поле _version_, может определять, какое поведение вы хотите:

Если содержимое в поле _version_ больше 1 (т. Е. «12345»), то _version_ в документе должно совпадать с _version_ в указателе.

Если содержимое в поле _version_ равно '1', то документ должен просто существовать. В этом случае совпадение версий не происходит, но если документ не существует, обновления будут отклонены.

Если содержимое в поле _version_ меньше 0 (т. Е. -1), тогда документ не должен существовать. В этом случае нет соответствия версии происходит, но если документ существует, обновления будут отклонены.

Если содержимое в поле _version_ равно '0', тогда оно не не имеет значения, совпадают ли версии или документ существует или нет. Если оно существует, оно будет перезаписано; если он не существует, он будет добавлено.

...