亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

多線程中elasticsearch插入時如何保證唯一性?

多線程中elasticsearch插入時如何保證唯一性?

繁星淼淼 2023-12-13 16:27:04
我們有一些elasticsearch的文檔。文檔的唯一性是由一些字段共同決定的,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":"keyword" },"pt_longitude":{ "type":"文本"},"pt_latitude":{"type":"text" },"rd_code":{ "type":"text" }, "rd_name":{ "type":"keyword"}, "area_code": {“類型”:“關鍵字”} ...等等 }}唯一性由area_code、pt_longitude 和pt_latitude 確定。插入文檔時我會根據area_code、pt-longitude、pt_latitude判斷是否存在,不存在則插入。java多線程運行時如何保證文檔的唯一性?這個問題困擾了我一段時間。誰能幫助我,我將非常感激。
查看完整描述

3 回答

?
千萬里不及你

TA貢獻1784條經驗 獲得超9個贊

僅通過索引中的屬性無法以任何方式保證不存在此類文檔。即使您檢查它是否存在于索引中但沒有看到它,從發出該操作的響應到 ES 接受您的索引請求之間也存在一段時間。

所以基本上你只有兩種方法:

  • 保證索引操作的單次執行(漫長且不那么簡單的方法,因為我們沒有一次性系統)

  • 將文檔唯一屬性轉換為文檔 ID,因此即使索引操作重疊,它們也只會將相同的值寫入同一文檔(或者第二個及后續操作將失敗,具體取決于請求選項)。

后一個非常簡單,您有一些開箱即用的選項:

  • 按確定的順序獲取所有唯一屬性并連接它們的字符串表示形式(丑陋)

  • 按確定的順序獲取所有唯一屬性,連接它們的字節值并使用 Base64 進行編碼(不太難看)

  • 按確定的順序獲取所有唯一屬性,將它們傳遞給散列函數(md5、sha-X 系列,無論您喜歡什么)并使用結果的字符串表示形式。


查看完整回答
反對 回復 2023-12-13
?
九州編程

TA貢獻1785條經驗 獲得超4個贊

常見的情況可能是您以某種方式發送了文檔(例如 kafka)并希望確保沒有重復項。據我所知,ElasticSearch 中沒有這樣的方法,盡管你可以在這里嘗試一個技巧:

  • ElasticSearch 允許指定自定義文檔 ID

  • 文檔ID的長度被限制為512字節,不能用于正常的“處理”

您可能希望根據您的字段(如數據庫中的主鍵)創建一個 ID。如果使用 _create ,那么僅當您的文檔尚不存在時才會創建它。

但還有一些問題需要解決:如何生成ID?簡單的串聯可以工作,但前提是您確定總長度不會超過 512B。否則可以使用校驗和 - 但沖突的可能性很小。如果收到幾乎相同的文檔該怎么辦(您的密鑰相同,但存在其他一些差異)。Elastic 只允許“替換”或“不替換”。您需要處理其他場景。


查看完整回答
反對 回復 2023-12-13
?
繁花不似錦

TA貢獻1851條經驗 獲得超4個贊

如果您檢測到插入,為什么不在插入完成后(和索引刷新...)檢查是否沒有重復項。第二種解決方案是使用批量插入更新數據包寫入每個 X(= 將新文檔存儲在共享區域的列表中,因此您可以檢查您的文檔是否尚未存在,并每 10 秒寫入此列表例子)。



查看完整回答
反對 回復 2023-12-13
  • 3 回答
  • 0 關注
  • 355 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號