1.前言
前一陣把博客換了個模版,模版提供了一個搜索按鈕,這讓我想起一直以來都想折騰的全文搜索技術,於是就用lucene6.2.1加上HanLP的分詞插件做了這么一個模塊CSearch。
效果看這里:https://chulung.com/search
源碼:CSearch
2.關於分詞
索引的一個核心功能便是分詞,lucene自帶的分詞是基於英語的,所以中文分詞用其他插件比較好。
網上很多都是推薦IK-Analyzer,不過這個插件很久沒更新了,用lucene6的話重構才能用:IK-Analyzer-6,這個是我重構的版本。
但在查閱分詞的方面的資料的時候無意中發現了HanLP(Han Language Processing),這個漢語言處理包比較新,提供了lucene的分詞插件,資料什么的也更詳細,所以我就更換過來了。
3.代碼中的一些坑
在敲代碼時還是遇到了一些比較坑的問題,由於網上基本沒有lucene6的中文教程,老的lucene3,4那時的教程很多兼容不上了。
- 實時查詢的DirectoryReader獲取
使用IndexWriter新增索引后存在搜索不到的問題,這是因為在getReader時要使用openIfChanged方法,才能保證做到更新后實時查詢。
private DirectoryReader getReader() throws Exception {
if (reader==null){
this.reader=DirectoryReader.open(fsDirectory);
}
//有更新則重新打開,讀入新增加的增量索引內容,滿足實時查詢需求
DirectoryReader newReader = DirectoryReader.openIfChanged((DirectoryReader)reader, getIndexWriter(), false);
if (newReader != null) {
reader.close();
reader = newReader;
}
return reader;
}
- 高亮插件結果錯位問題
文檔中的\r\n字符會導致高亮結果錯1位,比如高亮”插件”會變成高”亮插”件,因此需要replace空白字符。
String context = doc.get(CONTEXT).replaceAll("\\s*", "");
String highContext = highlighter.getBestFragment(analyzer, CONTEXT, context);
作者:初龍
原文鏈接:https://chulung.com/article/lucene6+hanlp-chinese-word-segmentation
本文由MetaCLBlog於2017-07-17 09:10:15自動同步至cnblogs
本文基於 知識共享-署名-非商業性使用-禁止演繹 4.0 國際許可協議發布,轉載必須保留署名及鏈接。