[英]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()
。 不容忍時鍾異常。
嘗試在要編制索引的數據源中查找唯一值,並將其存儲在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.