搜尋的基礎是對文字資訊進行分析,lucene的分析工具在org.apache.lucene.analysis包中。分析器負責對文字進行分詞、語言處理得到詞條,建索引和搜尋的時候都需要用到分析器,兩者應當是同乙個,否則沒法很好的匹配。
lucene的分析器往往包括乙個分詞器(tokenizer)和多個過濾器(tokenfilter),過濾器負責對切出來的詞進行處理,如去掉敏感詞、轉換大小寫、轉換單複數等。tokenstream方法中往往是先使用乙個tokenizer,接著使用多個tokenfilter,lucene自帶的standardanalyzer就使用了standardtokenizer with standardfilter, lowercasefilter and stopfilter。抽象基類結構圖如下。
注:停詞-頻繁使用但沒有意義的詞,在建索引或搜尋時忽略掉。英語中的冠詞、介詞、連詞(an/this/and),中文中的"的/也/為"。
以"hello, this is a test case. 你好,這是乙個測試的例項。created on 20140707"為例。
如何獲取切詞後的token
之前
analyzer analyzer = new maxwordanalyzer();
tokenstream stream = analyzer.tokenstream("", new stringreader("hello, this is a test case. " +
"你好,這是乙個測試的例項。" + "created on 20140707"));
string out = "";
while (stream.incrementtoken())
system.out.println(out);
之後
analyzer analyzer = new standardanalyzer();
tokenstream stream = analyzer.tokenstream("", new stringreader("hello, this is a test case. " +
"你好,這是乙個測試的例項。" + "created on 20140707"));
string out = "";
while(stream.incrementtoken())
system.out.println(out);
mmseg4j詞典詞典要求utf-8編碼,可以在例項化analyzer時指定詞典路徑,也可以設定mmseg.dic.path來指定詞典路徑,作者說自己會預設從當前目錄下的data目錄讀取詞典檔案,但是我測試好像不行。如果不指定路徑,倒是會從mmseg4j的jar包中的data目錄載入詞典。
chars.dic每行是乙個單個字和對應頻率,中間用空格分開,一般不用關心。猜測是不是低頻率的字可以認為是亂碼,丟棄不建索引呢。
units.dic每行是乙個單位的字,如分、畝,用以單獨切分。
words***.dic是自定義詞庫檔案。
使用mmseg4j時需要3個包:mmseg4j-core.jar包含詞庫檔案,mmseg4j-analysis.jar是一些analysis(如maxwordanalyzer),mmseg4j-solr.jar是一些solr使用的功能。
Lucene分析器的實現
public abstract class analyzer public int getpositionincrementgap string fieldname string content stringreader reader new stringreader content analyze...
lucene 同義詞分析器
這個分析器用synonymfilter過濾器對standardanalyzer類進行封裝,當向這個過濾器輸入各個項時,會對這些項進行緩衝,並使用棧儲存這些項的同義詞 public class synonymfilter extends tokenfilter publicstatic final s...
分析與分析器
分析 包含下面的過程 分析器執行上面的工作。分析器 實際上是將三個功能封裝到了乙個包裡 字元過濾器 首先,字串按順序通過每個 字元過濾器 他們的任務是在分詞前整理字串。乙個字元過濾器可以用來去掉html,或者將 轉化成 and 分詞器其次,字串被 分詞器分為單個的詞條。乙個簡單的分詞器遇到空格和標點...