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 国际许可协议发布,转载必须保留署名及链接。

lucene6+HanLP中文分词的更多相关文章

  1. 全文检索Solr集成HanLP中文分词

    以前发布过HanLP的Lucene插件,后来很多人跟我说其实Solr更流行(反正我是觉得既然Solr是Lucene的子项目,那么稍微改改配置就能支持Solr),于是就抽空做了个Solr插件出来,开源在 ...

  2. Elasticsearch:hanlp 中文分词器

    HanLP 中文分词器是一个开源的分词器,是专为Elasticsearch而设计的.它是基于HanLP,并提供了HanLP中大部分的分词方式.它的源码位于: https://github.com/Ke ...

  3. 全文检索Solr集成HanLP中文分词【转】

    以前发布过HanLP的Lucene插件,后来很多人跟我说其实Solr更流行(反正我是觉得既然Solr是Lucene的子项目,那么稍微改改配置就能支持Solr),于是就抽空做了个Solr插件出来,开源在 ...

  4. HanLP中文分词Lucene插件

    基于HanLP,支持包括Solr(7.x)在内的任何基于Lucene(7.x)的系统. Maven <dependency> <groupId>com.hankcs.nlp&l ...

  5. elasticsearch教程--中文分词器作用和使用

    概述   本文都是基于elasticsearch安装教程 中的elasticsearch安装目录(/opt/environment/elasticsearch-6.4.0)为范例 环境准备 ·全新最小 ...

  6. 分词工具Hanlp基于感知机的中文分词框架

     结构化感知机标注框架是一套利用感知机做序列标注任务,并且应用到中文分词.词性标注与命名实体识别这三个问题的完整在线学习框架,该框架利用1个算法解决3个问题,时自治同意的系统,同时三个任务顺序渐进,构 ...

  7. hanlp中文自然语言处理的几种分词方法

    自然语言处理在大数据以及近年来大火的人工智能方面都有着非同寻常的意义.那么,什么是自然语言处理呢?在没有接触到大数据这方面的时候,也只是以前在学习计算机方面知识时听说过自然语言处理.书本上对于自然语言 ...

  8. HanLP《自然语言处理入门》笔记--3.二元语法与中文分词

    笔记转载于GitHub项目:https://github.com/NLP-LOVE/Introduction-NLP 3. 二元语法与中文分词 上一章中我们实现了块儿不准的词典分词,词典分词无法消歧. ...

  9. 中文分词工具简介与安装教程(jieba、nlpir、hanlp、pkuseg、foolnltk、snownlp、thulac)

    2.1 jieba 2.1.1 jieba简介 Jieba中文含义结巴,jieba库是目前做的最好的python分词组件.首先它的安装十分便捷,只需要使用pip安装:其次,它不需要另外下载其它的数据包 ...

随机推荐

  1. jsp静态与动态包含的区别和联系

    1. <%@ include file=” ”%>是指令元素.<jsp:include page=” ”/>是行为元素 2. 最终编译成java文件的数目不同. * 静态包含在 ...

  2. 建立LINUX服务器

    建立LINUX服务器:一. 下载UltraISO工具并用该工具制作LINUX启动U盘,制作步骤如下:http://www.linuxidc.com/Linux/2012-11/74695.htm [^ ...

  3. ubuntu 14.04搭建PHP项目基本流程

    首先准备需要安装东西的列表1.apache服务器,2.php,3.mysql,4.几个软件包的链接包,安装方式是以apt-get方式安装; 1.安装apache服务器: apt-get install ...

  4. let 和const与var的不同

    1. let的作用域在代码块中仅限在当前的作用于中 { var str1 = 12; console.log(str1); let str2 = 20; console.log(str2); //20 ...

  5. Socket网络编程之概述理解

    今天主要讲讲什么是socket网络编程 socketde 英文原义是"孔"或者"插座".是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机 ...

  6. Python For嵌套循环 图形打印X型 nested loop -练习题

    For嵌套循环图形打印作业很多是C++语言做的,我觉得Python应该也能做,就来试一试. 原网址C++练习题:http://www.imooc.com/qadetail/216848?t=33880 ...

  7. springboot使用i18n时properties文件中文乱码

    在springboot使用i18n进行国际化文件配置时,文件名为messages_zh_CN.properties的文件中填写中文信息,当使用浏览器进行访问时,出现中文乱码,此时在idea中进行修改s ...

  8. cardview和Palette,ActionBar颜色随图改变

    CardView是一个控件,Palette是取色工具(工具类),本文会对他们进行比较细致的介绍,相信机制的各位看完一定轻而易举地实现ActionBar随图改变的特效. 首先看一下效果图: Gradle ...

  9. C++11 标准新特性: 右值引用与转移语义

    文章出处:https://www.ibm.com/developerworks/cn/aix/library/1307_lisl_c11/ 新特性的目的 右值引用 (Rvalue Referene) ...

  10. Android UsageStatsService(应用使用统计服务)的学习与调研

    一. 简介 UsageStatsService是一个系统服务,其主要通过AMS等,来监测并记录各个应用的使用数据,如上次调用com.android.settings的时间等. UsageStatsSe ...