zoukankan      html  css  js  c++  java
  • 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;
    }
    
    • 高亮插件结果错位问题
      文档中的 字符会导致高亮结果错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 国际许可协议发布,转载必须保留署名及链接。

  • 相关阅读:
    NYOJ题目22 素数求和
    最大连续子序列&&MAX SUM
    Computer Transformation
    #转 二分查找
    吃巧克力
    公司年会
    亲和串
    开门人和关门人
    找新朋友
    big number
  • 原文地址:https://www.cnblogs.com/wchukai/p/6084125.html
Copyright © 2011-2022 走看看