lucene6+HanLP中文分词
Posted 初开之道
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
作者:chulung
原文链接:https://chulung.com/article/53
本文由MetaCLBlog于2016-11-21 01:00:04自动同步至cnblogs
false以上是关于lucene6+HanLP中文分词的主要内容,如果未能解决你的问题,请参考以下文章