lucene6+HanLP中文分詞


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 國際許可協議發布,轉載必須保留署名及鏈接。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM