lucene的事務性引發的問題

2021-08-31 10:11:50 字數 1525 閱讀 4256

終於ok了。。先開心一下。

[b]我的問題和除錯經歷。[/b]

我使用lucene 為資料庫建立索引,在初期的測試中,對資料進行增刪改查我並沒有使用快取,而是直接用indexwriter進行commit。結果每一次commit後我馬上進行搜尋,結果就是不出來。我檢視index 檔案,每一次都已進行了更新。於是我確定commit後,index已經同步了。可是為什麼就是搜尋不到結果了?????

我每一次重新啟動程式,上一次修改的結果都能被搜尋得到,這就說明了搜尋本身沒有問題,。問題的關鍵就是,存在某個問題,使索引更新的效果對我不可以見,寶貴的周五就這樣浪費了。由於週六週日要兼職。沒空。。所以問題一直擱淺到現在。

[b]救贖之道[/b]

我現在發現學習一樣東西基礎越來越重要,要不然乙個小小的錯誤會耽誤你n多的時間,並且你毫無頭緒下手。於是我決定看 lucence3.0 原理分析這個神級 pdf(網路上有下)。看完關於lucene事物性的解析後,。我相信我找到了救贖之道。

原文如下:

所謂事務性,本多指資料庫的屬性,包括acid四個基本要素:原子性(atomicity)、一致性

(consistency)、隔離性(isolation)、永續性(durability)。

我們這裡主要討論隔離性,lucene的indexreader和indexwriter具有隔離性。

• 當indexreader.open開啟乙個索引的時候,相對於給當前索引進行了一次snapshot,此後的任何修改

都不會被看到。

• 僅當indexreader.open開啟乙個索引後,才有可能看到從上次開啟後對索引的修改。

• 當indexwriter沒有呼叫commit的時候,其修改的內容是不能夠被看到的,哪怕indexreader被重新

開啟。• [color=darkred]欲使最新的修改被看到,一方面indexwriter需要commit,一方面indexreader重新開啟。 [/color]

我檢視我的元**:

public static topdocs search(string querystr) [/color] searcher.setsimilarity(new iksimilarity());

queryparser parser = new queryparser(version.lucene_30,"content",new ikanalyzer());

query query = parser.parse(querystr);

topdocs topdocs = searcher.search(query, 100);

return topdocs;

}catch(exception e)

}[color=darkred]private static searcher searcher = null; [/color]

問題就是出在這裡,第一次搜尋的結果總是正確的。。之後要是做了修改都搜尋不到,因為全域性變數維護著search,而search 只是第一次開啟index時候的snapshot.

[b]痛苦的領悟[/b]

學習東西,基礎才是王道!

事務性的特點

原子性 atomicity 原子性是指事務是乙個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。一致性 consistency 事務前後資料的完整性必須保持一致。隔離性 isolation 事務的隔離性是多個使用者併發訪問資料庫時,資料庫為每乙個使用者開啟的事務,不能被其他事務的運算元據所...

事務性的特點

原子性 atomicity 原子性是指事務是乙個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。一致性 consistency 事務前後資料的完整性必須保持一致。隔離性 isolation 事務的隔離性是多個使用者併發訪問資料庫時,資料庫為每乙個使用者開啟的事務,不能被其他事務的運算元據所...

前端事務性任務多次請求的問題

專案上線的時候,遇到乙個詭異的問題 預上線環境不能復現,生產環境必現。而預上線環境和生產環境最大的區別就在於 預上線是單點應用服務,生產環境則是集群部署。request excel data,command,function success stringbuffer temppath new str...