lucene6+HanLP中文分词

时间:2023-03-09 05:40:38
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 国际许可协议发布,转载必须保留署名及链接。