Lucene中的範圍搜尋

2021-08-22 05:44:48 字數 1046 閱讀 4880

前兩天做有關lucene的範圍搜尋,覺得應該很簡單,因為之前做過lucene的排序。但一做就發現不那麼回事,做排序程式幾乎不需要改動,但範圍搜尋完全不同。下面就3個方面(整數,浮點數,日期)來說

前提:使用lucene1.9.1,將整數,浮點數和日期全部以如下方式建索引

newfield(key,value,field.store.yes,field.index.un_tokenized));

上文中field.store.yes也可以是

field.store.no,但

field.index.un_tokenized不要改動

1)整數範圍搜尋

下面是個資料樣本1,2,100,150,300,400,1000,如果你將這個資料建在索引庫中,那麼通過範圍搜尋,得出的結果就會令人奇怪,比如你搜100到1000,那麼150,300,400是出不來,你搜1到2,居然1000也會冒出來,後來才發現,這種範圍搜尋沒有把樣本當數字還是當成字元在比較,這和排序完全不同。我沒有找到更好的辦法,只有將在建索引時前面補0,按照上面的例子我寫成0000000001,。。。,0000001001,我把所有的數字變成10位字元,不足前面補0,因為11位是整數(int) 極限,所以我定為10位,而且我感覺超過10位會有問題,雖然我沒試,但在下面的將日期變為long型儲存時(13位)遇到問題,所以我在此沒敢造次。如此這般,整數的問題解決了。

2)浮點數範圍搜尋

很幸運,我這次沒在浮點數上栽跟頭,我無意中將樣本中浮點數都定為定長了,所以不會有問題。

3)時間範圍搜尋

在沒做任何改動之前我們就是將date型的資料tostring()儲存在索引中即yyyy-mm-dd hh-mm-ss.0,這樣的話排序是沒問題,但範圍搜尋就出問題了。

後來我先將所有時間變為long型,這樣不會有錯,因為2023年和2023年之間的所有時間都是13位,而我們的應用範圍絕對在此之間,所以我做了這樣的選擇,但後來發現失敗,範圍搜尋仍然不對,我想也許是溢位?

後來我又將時間定為yyyy-mm-dd的格式,搜尋也出了非常奇怪的問題,我想肯定是因為格式帶了「-"這樣的敏感字元,時間緊迫不得已,我採用yyyymmdd,這樣就好了

Lucene中的範圍搜尋

前兩天做有關lucene的範圍搜尋,覺得應該很簡單,因為之前做過lucene的排序。但一做就發現不那麼回事,做排序程式幾乎不需要改動,但範圍搜尋完全不同。下面就3個方面 整數,浮點數,日期 來說 前提 使用lucene1.9.1,將整數,浮點數和日期全部以如下方式建索引 newfield key,v...

Lucene 搜尋方法(範圍搜尋)

在某些情況下,使用者需要查詢一定範圍內的文件,比如時間,id等。package com.querytype import org.apache.lucene.index.term import org.apache.lucene.search.booleanclause import org.apa...

lucene的學習 範圍查詢

對於lucene的範圍查詢,可以使用rangquery,或者使用rangfilter。但對於rangquery有個缺點,可能導致異常toomanyclause異常。因為對於不同的query,最後都是轉化為termquery.而rangquery,就是將這個範圍內的所有term 每乙個term就是乙個...