3 回答

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超9個(gè)贊
僅通過索引中的屬性無法以任何方式保證不存在此類文檔。即使您檢查它是否存在于索引中但沒有看到它,從發(fā)出該操作的響應(yīng)到 ES 接受您的索引請(qǐng)求之間也存在一段時(shí)間。
所以基本上你只有兩種方法:
保證索引操作的單次執(zhí)行(漫長(zhǎng)且不那么簡(jiǎn)單的方法,因?yàn)槲覀儧]有一次性系統(tǒng))
將文檔唯一屬性轉(zhuǎn)換為文檔 ID,因此即使索引操作重疊,它們也只會(huì)將相同的值寫入同一文檔(或者第二個(gè)及后續(xù)操作將失敗,具體取決于請(qǐng)求選項(xiàng))。
后一個(gè)非常簡(jiǎn)單,您有一些開箱即用的選項(xiàng):
按確定的順序獲取所有唯一屬性并連接它們的字符串表示形式(丑陋)
按確定的順序獲取所有唯一屬性,連接它們的字節(jié)值并使用 Base64 進(jìn)行編碼(不太難看)
按確定的順序獲取所有唯一屬性,將它們傳遞給散列函數(shù)(md5、sha-X 系列,無論您喜歡什么)并使用結(jié)果的字符串表示形式。

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超4個(gè)贊
常見的情況可能是您以某種方式發(fā)送了文檔(例如 kafka)并希望確保沒有重復(fù)項(xiàng)。據(jù)我所知,ElasticSearch 中沒有這樣的方法,盡管你可以在這里嘗試一個(gè)技巧:
ElasticSearch 允許指定自定義文檔 ID
文檔ID的長(zhǎng)度被限制為512字節(jié),不能用于正常的“處理”
您可能希望根據(jù)您的字段(如數(shù)據(jù)庫中的主鍵)創(chuàng)建一個(gè) ID。如果使用 _create ,那么僅當(dāng)您的文檔尚不存在時(shí)才會(huì)創(chuàng)建它。
但還有一些問題需要解決:如何生成ID?簡(jiǎn)單的串聯(lián)可以工作,但前提是您確定總長(zhǎng)度不會(huì)超過 512B。否則可以使用校驗(yàn)和 - 但沖突的可能性很小。如果收到幾乎相同的文檔該怎么辦(您的密鑰相同,但存在其他一些差異)。Elastic 只允許“替換”或“不替換”。您需要處理其他場(chǎng)景。

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超4個(gè)贊
如果您檢測(cè)到插入,為什么不在插入完成后(和索引刷新...)檢查是否沒有重復(fù)項(xiàng)。第二種解決方案是使用批量插入更新數(shù)據(jù)包寫入每個(gè) X(= 將新文檔存儲(chǔ)在共享區(qū)域的列表中,因此您可以檢查您的文檔是否尚未存在,并每 10 秒寫入此列表例子)。
添加回答
舉報(bào)