lucene學習我不得不承認這門技術是我目前接觸的最有難度的一門技術,也許是因爲我最近比較浮躁吧,也也是因爲我沒有找到,官方的說明文檔和網絡上比較不錯的視頻教程,不是有的講解人普通話說得跟方言似的,英文讀的跟3歲小孩似的,比如宋亮,他的lucene3.5的教程簡直讓我難以忍受
所以還是自己摸索摸索吧
上一篇lucene初探(一),講解了簡單的lucene文件查詢,貌似lucene和solr配合更能發揮lucene的作用
也許是因爲我現在的知識都沒有系統的掌握,現在學習起來有點喫力,所以現在決定,先暫時放一放,lucene的學習,系統複習,web基礎知識,和web前端框架的學習
言歸正傳,lucene自帶分詞器比較:
這邊播客講的比較系統大部分都涉及到了,但是沒有什麼用,所以我們只介紹一些實用的
http://blog.csdn.net/chs_jdmdr/article/details/7359773
導入所需jar包:
測試代碼:
package com.leige.demo;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.core.SimpleAnalyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
import org.apache.lucene.analysis.tokenattributes.PositionIncrementAttribute;
import org.apache.lucene.analysis.tokenattributes.TypeAttribute;
import org.apache.lucene.util.Version;
public class AnalyzerTest {
public static void main(String[] args) {
try {
/*
* simpleAnalyzer分詞,根據標點符號分詞SimpleAnalyzer simple=new SimpleAnalyzer(Version.LUCENE_40);
* StandardAnalyzer standard=new StandardAnalyzer(Version.LUCENE_40);標準分詞只會將中文分爲一個個單字
* WhitespaceAnalyzer wAnalyzer=new WhitespaceAnalyzer(Version.LUCENE_40);//英文分詞,根據空格
* ChineseAnalyzer analyzer=new ChineseAnalyzer(); //已經過時,一元分詞
* CJKAnalyzer analyzer=new CJKAnalyzer(Version.LUCENE_40);//二元分詞
*/
SimpleAnalyzer simpleAnalyzer=new SimpleAnalyzer(Version.LUCENE_40);
displayTokens(simpleAnalyzer,new File("F:\\lucene\\example\\news.txt"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void displayTokens(Analyzer analyzer,File file) throws IOException {//打印分詞結果,我也不懂,網上抄的,我就想用
TokenStream tokenStream = analyzer.tokenStream("text2", new FileReader(file));
displayTokens(tokenStream);
}
public static void displayTokens(TokenStream tokenStream) throws IOException {
OffsetAttribute offsetAttribute = tokenStream.addAttribute(OffsetAttribute.class);
PositionIncrementAttribute positionIncrementAttribute = tokenStream.addAttribute(PositionIncrementAttribute.class);
CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class);
TypeAttribute typeAttribute = tokenStream.addAttribute(TypeAttribute.class);
tokenStream.reset();
int position = 0;
System.out.println("分詞結果");
while (tokenStream.incrementToken()) {
int increment = positionIncrementAttribute.getPositionIncrement();
if(increment > 0) {
position = position + increment;
System.out.print(position + ":");
}
int startOffset = offsetAttribute.startOffset();
int endOffset = offsetAttribute.endOffset();
String term = charTermAttribute.toString();
System.out.println("[" + term + "]" + ":(" + startOffset + "-->" + endOffset + "):" + typeAttribute.type());
}
}
}
lucene自帶分詞比較:
分詞文本:
**仔細想想我上一次熬夜看書是高中 的時候幾年來再一次熬夜看書久違了的感覺,《偷影子的人》,就是有這種感覺讓你一發不可收拾的想讀下去那種愛情,親情,友情我們也許一輩子都不會遇到但是每一種感情都沒有可比性雖然書裏的那種很令人豔羨 重要的是我們可以想主人公一樣活的問心無永遠天真,富有想象力有時候不那麼成熟或許會好一點
**
分詞器 | 分詞類型 | 分詞結果 |
---|---|---|
simpleAnalyzer | 根據標點符號分詞或者宮格分詞 | 結果1 |
StandardAnalyzer | 一元分詞 | 一個一個分詞,沒有必要貼出來 |
ChineseAnalyzer | 一二元分詞 | 沒有必要貼出來 |
WhitespaceAnalyzer | 空格分詞,主要用在英文 | 沒有必要貼出來 |
CJKAnalyzer | 二元分詞 | 沒有必要貼出來 |
結果1:
總結,lucene不帶任何插件的話,還是simpleAnalyzer比較好,可以根據標點符號分詞,不會造成索引項過多,搜索也比較快
插件分詞,最好的就是mmseg4j分詞,使用的是搜狗的詞庫,而且一直在更新,podding分詞,好像沒有更新了
我作爲小白,我只用最好的一個就可以了
mmseg4j使用,
引入jar包,
使用,只要指定分詞器和自己的自定義詞庫地址就好
MMSegAnalyzer analyzer=new MMSegAnalyzer(new File("F:\\lucene\\example\\data"));
注意詞庫命名方式必須爲:wordsXXX.dic
所以如果沒有什麼特殊的要求,lucene自帶的simple分詞器,就可以滿足簡單的需求