Как обеспечить уникальность, когда в многопоточности вставлен эластичный поиск? - PullRequest
0 голосов
/ 25 октября 2019

У нас есть несколько документов из эластичного поиска. Уникальность документа определяется некоторыми полями вместе, как обеспечить уникальность, когда многопоточность Java определяет, существует ли она и вставлена.

Я не знал, какой хороший метод у меня был раньше, поэтому я написалметод: я думаю, если он существует, если он не существует, я вставляю его, и этот метод модифицируется с помощью syncronized. Но я обнаружил, что это очень неэффективная практика.

/**
 * @param document
 */
synchronized void selectAndInsert(Map<String, Object> document){
    //Determine if it exists, insert it if it does not exist
}

Мое сопоставление выглядит следующим образом: {"properties": {"pt_number": {"type": "keyword"}, "pt_name":{"type": "ключевое слово"}, "pt_longitude": {"type": "text"}, "pt_latitude": {"type": "text"}, "rd_code": {"type": "text"}, "rd_name": {"type": "keyword"}, "area_code": {"type": "keyword"} ... и т. д.}}

Уникальность определяется area_code, pt_longitudeи pt_latitude. Когда документ будет вставлен, я буду судить, существует ли он в соответствии с area_code, pt-longitude, pt_latitude, и вставить, если он не существует. Как я могу гарантировать уникальность документа, когда работает многопоточность Java?

Этот вопрос мучает меня в течение некоторого времени. Кто может мне помочь, буду очень признателен.

Ответы [ 2 ]

0 голосов
/ 25 октября 2019

Невозможно гарантировать, что такого документа нет, просто по свойствам в индексе. Даже если вы проверите его присутствие в индексе и не видите его, между ответом на эту операцию и вашим запросом на индексирование, принятым ES, есть некоторое время.

Таким образом, в основном у вас есть только два способа:

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

Последнее довольно просто, у вас есть несколько вариантов из коробки:

  • Возьмите все уникальные свойства в определенном порядке и объедините их строковые представления (некрасиво)
  • Возьмите все уникальные свойства в определенном порядке, объедините их байтовые значения и закодируйте, используя Base64 (менее уродливо)
  • Возьмите все уникальные свойства в определенном порядке, передайте их через функцию хеширования (семейства md5, sha-X, что угодно, что выlike) и использовать строковое представление результата.
0 голосов
/ 25 октября 2019

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

...