lucene使用小記
幾點小體會,先記下,不知道對不對。網(wǎng)上說lucene是一個半成品,深有體會。
1.lucene是一種全文搜索技術,詞元是一個單詞(word)。試圖搜索一個單詞的一部分或一個字母,是沒有意義的,lucene也不能實現(xiàn)。除非你是想搜索一個單詞的前綴,用PrefixQuery是可以的。說到底,還是在生成索引的時候的分析器(Analyzer)在作怪。
下面有四個英文分析器:
分析器 |
內(nèi)部操作步驟 |
WhitespaceAnalyzer |
在空格處進行語匯單元的切分 |
SimpleAnalyzer |
在非字母字符處切分文本,并將其轉(zhuǎn)換為小寫形式 |
StopAnalyzer |
在非字母字符處切分文本,然后小寫化,再移除停用詞 |
StandardAnalyzer |
基于復雜的語法來實現(xiàn)語匯單元化;這種語法規(guī)則可以識別e-mail地址、首字母縮寫詞、漢語-日語-漢語字符、字母數(shù)字等;小寫化;并移除停用詞 |
切分出來的就是一個一個詞元,也就是你搜索的最小單位了。不難從上面看出,lucene對亞洲字體支持有限。
2.試過用StandardAnalyzer分析日文英文文本。日文可以正常搜索,英文字母只能按單詞搜索。
3.這里說一個奇怪的現(xiàn)象:搜索的時候,比如文本中有"你好bcc",我搜"好bcc"可以正常搜索,搜"好a"竟然也可以搜到。debug代碼,看到查詢的時候,有一個parse方法(下面說明)竟然把后面的"a"去掉了,真正搜的是"好"。但是搜"好b"或"好d"等都搜不到。奇怪奇怪!
4.索引好之后,就可以搜索(Query)了。至于Query也有好多種:
|_______WildcardQuery (通配符查詢)
|______
_PhraseQuery (短語查詢) 可以限定兩個term之間的距離
|_______RangeQuery (范圍查詢)
|_______MultiPhraseQuery (多短語查詢)
|_______FuzzyQuery (模糊查詢)
|_______SpanQuery (跨度查詢)
|_______PrefixQuery (前綴查詢)
查詢的時候,也會用到上面的Analyzer。根據(jù)Analyzer的不同會對查詢的關鍵詞進行一些處理,比如上面的去掉"a"。然后用處理過的關鍵詞進行查詢。
5.這里再說一個題外話:什么時候生成索引合適。總不能每次檢索的時候就來一次從頭到尾的生成索引吧,這顯然不合人類工程動力學原理,呵呵:) 那初步想法是,先確定你要在那里文件里面搜索,每當你的這些文件有變動時,就觸發(fā)對這個文件的索引。比如,新添文件或文件更新了。這樣檢索的時候,就只管檢索。看似這樣耦合度也低哈:)
posted on 2009-10-22 16:34 游雯 閱讀(279) 評論(0) 編輯 收藏 所屬分類: Java技術