簡體   English   中英

如何使用Lucene生成唯一ID?

[英]How do I generate a unique id using Lucene?

我正在使用Lucene存儲(以及索引)各種文檔。

每個文檔都需要一個持久的唯一標識符(用作URL的一部分)。

如果我使用的是SQL數據庫,我可以使用integer primary key auto_increment (或類似)字段為添加的每條記錄自動生成唯一ID。

Lucene有沒有辦法做到這一點?

我知道Lucene中的文檔已編號,但已注意到這些數字會隨着時間的推移重新分配。

(我使用的是Lucene 3.0.3的Java版本。)

正如larsmans所說,你需要將它存放在一個單獨的領域。 我建議您將字段編入索引以及存儲,並使用KeywordAnalyzer對其進行索引。 您可以將計數器保留在內存中並為每個新文檔更新它。

剩下的就是持久性問題 - 如何在Lucene進程停止時存儲最大id。 一種可能性是使用保存最大id的文本文件。

我相信靈活索引將允許您將最大ID添加到索引作為“全局”字段。 如果您願意使用Lucene的主干,您可以嘗試靈活的索引以確定它是否符合要求。

對於類似的情況,我使用以下算法(與Lucene無關,但無論如何都可以使用它)。

  • 創建新的AtomicLong System.currentTimeMillis()System.nanoTime()獲得的初始值開始
  • 通過在AtomicLong上調用.incrementAndGet.getAndIncrement生成每個下一個ID。
  • 如果系統重新啟動, AtomicLong將在啟動期間再次初始化為當前時間戳。

優點:簡單,有效,線程安全,無阻塞。 如果你需要集群id支持,只需在現有的long上添加hi / lo算法的空間或者犧牲一些高字節。

缺點:如果添加新實體的頻率超過1 / ms(對於System.currentTimeMillis() )或1 / ns(對於System.nanoTime() ),則System.nanoTime() 不容忍時鍾異常。

可以考慮使用UUID作為另一種替代方案。 UUID中重復的概率實際上是不存在的

嘗試在要編制索引的數據源中查找唯一值,並將其存儲在lucene文檔中。 數據源可以是mysql數據庫,文件系統中的文件等。

例如,如果要從mysql數據庫索引內容,則可以使用tablename和主鍵id“ tablename_rowID ”組合唯一的id。

假設您正在從兩個表的“頁面”和“注釋”表中索引; 對於pages表中的每一行,您可以使用“page_28”為頁面表中id為28的行生成唯一ID。 同樣,假設您在注釋表中索引第36行,您的唯一ID將是“comment_36”。

如果所有選項都失敗了,那么我會堅持使用UUID。 通過一些額外的偏執,這可能是附加到now()的時間戳的UUID。

編輯 :一些評論者提出了這種方法可能存在的問題,我沒有時間對其進行徹底的測試。 我將它留在這里,因為Yuval F.指的是它。 請不要不必要地投票。

給定一個IndexWriter w ,您可以使用w.maxDoc() + 1作為id並將其(作為字符串)存儲在單獨的Field 確保存儲 Field

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM