lucene索引日期和數字

1.用途。spa

    索引數字的場景主要有兩種:一是把它們看成字符串同樣處理,好比「要是擱之前,術士能暴擊10000多,有木有!」中的"10000",它和其它的詞沒什麼區別,你能夠把它僅僅想成一個字符串;另外一種場景則是某個域只索引數字,且能夠搜索數字的範圍等,好比設計了某個Field存儲郵件的大小,如今要搜索大小在3M-10M的郵件。設計

    對於第一種狀況,你要作的僅僅是選一個不會對數字進行分詞的分析器。這種分析器不少,好比以前咱們用過的WhitespaceAnalyzer和StandardAnalyzer。固然WhitespaceAnalyzer分析器可能僅僅對英語之類的語言還有點用處。對於第二種狀況,你不須要爲這些專門設計用來存儲數字的域進行分詞,指定成Field.Index.NOT_ANALYZED就能夠了。不過你必須清楚的是,Lucene內部處理的仍然只是String類型!即"10"是排在"2"前面的!如果想支持範圍搜索,你須要爲數字增長前置0, 即須要索引"02",這樣"02"便排在"10"前面了!code

doc.add(new NumericField("attachs",Field.Store.YES,true).setIntValue(attachs[i]));   
doc.add(new NumericField("date",Field.Store.YES,true).setLongValue(dates[i].getTime()));  

 

2.  索引數字的場景主要有兩種:一是把它們看成字符串同樣處理,好比「要是擱之前,術士能暴擊10000多,有木有!」中的"10000",它和其它的詞沒什麼區別,你能夠把它僅僅想成一個字符串;另外一種場景則是某個域只索引數字,且能夠搜索數字的範圍等,好比設計了某個Field存儲郵件的大小,如今要搜索大小在3M-10M的郵件。blog

    對於第一種狀況,你要作的僅僅是選一個不會對數字進行分詞的分析器。這種分析器不少,好比以前咱們用過的WhitespaceAnalyzer和StandardAnalyzer。固然WhitespaceAnalyzer分析器可能僅僅對英語之類的語言還有點用處。對於第二種狀況,你不須要爲這些專門設計用來存儲數字的域進行分詞,指定成Field.Index.NOT_ANALYZED就能夠了。不過你必須清楚的是,Lucene內部處理的仍然只是String類型!即"10"是排在"2"前面的!如果想支持範圍搜索,你須要爲數字增長前置0, 即須要索引"02",這樣"02"便排在"10"前面了!排序

 

 

3。日期類型的使用場景可謂多之又多:郵件的寄出、收到日期;文件的建立日期、最後修改日期;HTTP響應中的最後修改日期等等。總之,絕大多數狀況下,你會有處理日期的遭遇!Don't worry! Lucene爲咱們裝備了一個處理日期的利器:DateTools. 經過它,咱們能夠便捷的把Date型轉換成String型索引

//轉自:BuN_Ny
//http://bun-ny.iteye.com/blog/1075632

Document doc = new Document(); doc.add(new Field("indexDate", DateTools.dateToString(new Date(), DateTools.Resolution.DAY), Field.Store.YES, Field.Index.NOT_ANALYZED));

 DateTools 能夠把日期和時間轉換成 YYYYMMDDhhmmss 的格式,並根據指定的resolution去除相應後綴。好比你指定了Resolution.DAY,2012年12月21日就會被轉換成20121221,時分秒部分會被去除掉。這麼一來,就很容易發現,即使是按字符串進行排序、比較,也能獲得和日期相同的效果。字符串"20121221"是大於"20121121"的,而其對應的日期也是如此。採用這種方式處理日期是否是很簡單?參數resolution容許你截取對你的應用有意義的日期部分,精確度從Resolution.MILLISECOND(毫秒)到Resolution.YEAR(年),可是值得注意的是,更高的精度就須要付出更大的代價!字符串

    提醒你一下,若是你的應用中須要搜索一個YYYYMMDD範圍內的數據,而在展現的時候又但願把時間部分(hhhmmss)也帶上,你能夠嘗試建立兩個域,一個索引到Resolution.DAY範圍,另外一個僅僅設置Store.get

相關文章
相關標籤/搜索