Lucene 03

Stella981
• 阅读 521

[TOC]

1 分词器概述

1.1 分词器简介

在对文档(Document)中的内容进行索引前, 需要对域(Field)中的内容使用分析对象(分词器)进行分词.

**分词的目的是为了索引, 索引的目的是为了搜索. **

  • 分词的过程是 先分词, 再过滤:
  • 分词: 将Document中Field域的值切分成一个一个的单词. 具体的切分方法(算法)由具体使用的分词器内部实现.
  • 过滤: 去除标点符号,去除停用词(的、是、is、the、a等), 词的大写转为小写.
  • 分词流程图:
Lucene 03
  • 停用词说明: 停用词是指为了节省存储空间和提高搜索效率, 搜索引擎在索引内容或处理搜索请求时会自动忽略的字词, 这些字或词被称为"stop words". 如语气助词、副词、介词、连接词等, 通常自身没有明确的含义, 只有放在一个上下文语句中才有意义(如:的、在、啊, is、a等). 例如: ​ 原始文档内容: Lucene is a Java full-text search engine ​ 分析以后的词: lucene java full text search engine

1.2 分词器的使用

(1) 索引流程使用

流程: 把原始数据转换成文档对象(Document), 再使用分词器将文档域(Field)的内容切分成一个一个的词语.

目的: 方便后续建立索引.

(2) 检索流程使用

流程: 根据用户输入的查询关键词, 使用分词器将关键词进行分词以后, 建立查询对象(Query), 再执行搜索.

注意: 索引流程和检索流程使用的分词器, 必须统一.

1.3 中文分词器

1.3.1 中文分词器简介

英文本身是以单词为单位, 单词与单词之间, 句子之间通常是空格、逗号、句号分隔. 因而对于英文, 可以简单的以空格来判断某个字符串是否是一个词, 比如: I love China, love和China很容易被程序处理.

但是中文是以字为单位的, 字与字再组成词, 词再组成句子. 中文: 我爱中国, 电脑不知道“爱中”是一个词, 还是“中国”是一个词?所以我们需要一定的规则来告诉电脑应该怎么切分, 这就是中文分词器所要解决的问题.

常见的有一元切分法“我爱中国”: 我、爱、中、国. 二元切分法“我爱中国”: 我爱、爱中、中国.

1.3.2 Lucene提供的中文分词器

  • StandardAnalyzer分词器: 单字分词器: 一个字切分成一个词, 一元切分法.

  • CJKAnalyzer分词器: 二元切分法: 把相邻的两个字, 作为一个词.

  • SmartChineseAnalyzer分词器: 通常一元切分法, 二元切分法都不能满足我们的业务需求. 而SmartChineseAnalyzer对中文支持较好, 但是扩展性差, 针对扩展词库、停用词均不好处理.

**说明: Lucene提供的中文分词器, 只做了解, 企业项目中不推荐使用. **

1.3.3 第三方中文分词器

  • paoding: 庖丁解牛分词器, 可在https://code.google.com/p/paoding/下载. 没有持续更新, 只支持到lucene3.0, 项目中不予以考虑使用.

  • mmseg4j: 最新版已从https://code.google.com/p/mmseg4j/移至https://github.com/chenlb/mmseg4j-solr. 支持Lucene4.10, 且在github中有持续更新, 使用的是mmseg算法.

  • IK-analyzer: 最新版在https://code.google.com/p/ik-analyzer/上, 支持Lucene 4.10. 从2006年12月推出1.0版开始, IKAnalyzer已经推出了4个大版本. 最初是以开源项目Luence为应用主体的, 结合词典分词和文法分析算法的中文分词组件. 从3.0版本开始, IK发展为面向Java的公用分词组件, 独立于Lucene项目, 同时提供了对Lucene的默认优化实现. **适合在项目中应用. **

#2 IK分词器的使用

说明: 由于IK分词器是对Lucene分词器的扩展实现, 使用IK分词器与使用Lucene分词器是一样的. Lucene 03

2.1 配置pom.xml文件, 加入IK分词器的依赖

<project>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!-- mysql版本 -->
        <mysql.version>5.1.44</mysql.version>
        <!-- lucene版本 -->
        <lucene.version>4.10.4</lucene.version>
        <!-- ik分词器版本 -->
        <ik.version>2012_u6</ik.version>
    </properties>
    
    <dependencies>
        <!-- ik分词器 -->
        <dependency>
            <groupId>com.janeluo</groupId>
            <artifactId>ikanalyzer</artifactId>
            <version>${ik.version}</version>
        </dependency>
    </dependencies>
</project> 

2.2 修改索引流程的分词器

Lucene 03

2.3 修改检索流程的分词器

Lucene 03

2.4 重新创建索引

使用Lucene默认的标准分词器(一元分词器): Lucene 03

使用ik分词器之后(对中文分词支持较好): Lucene 03

3 扩展中文词库

说明: 企业开发中, 随着业务的发展, 会产生一些新的词语不需要分词, 而需要作为整体匹配, 如: 尬聊, 戏精, 蓝瘦香菇; 也可能有一些词语会过时, 需要停用.

-- 通过配置文件来实现.

3.1 加入IK分词器的配置文件

Lucene 03

说明: 这些配置文件需要放到类的根路径下.

3.2 增加扩展词演示(扩展: 人民邮电出版社)

说明: 在ext.dic文件中增加"人民邮电出版社": Lucene 03

注意: 不要使用Windows自带的记事本或Word, 因为这些程序会在文件中加入一些标记符号(bom, byte order market), 导致配置文件不能被识别.

增加扩展词之后: Lucene 03

3.3 增加停用词演示(增加: 的、和)

在stopword.dic文件增加停用词(的、和): Lucene 03

增加停用词之前: Lucene 03

增加停用词之后: Lucene 03

注意事项: 修改扩展词配置文件ext.dic和停用词配置文件stopword.dic, 不能使用Windows自带的记事本程序修改, 否则修改以后不生效: 记事本程序会增加一些bom符号. 推荐使用Emacs, Vim, Sublime等编辑器修改.

版权声明

作者: 马瘦风

出处: 博客园 马瘦风的博客

您的支持是对博主的极大鼓励, 感谢您的阅读.

本文版权归博主所有, 欢迎转载, 但请保留此段声明, 并在文章页面明显位置给出原文链接, 否则博主保留追究相关人员法律责任的权利.

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
2年前
java B2B2C多用户商城系统
需求分析:在javashop电商系统中,商品数据是存在elasticsearch中,使用ik分词器分词,ik分词器的词库内置了2万多个。但在实际运维过程中,因为商品的个性化,词库不一定可以满足,为了搜索引擎分词(关键词)更加准确,要求可对分词词库进行手工维护。思路:IK自定义词库是支持远程热加载的。先看下官方的说明:
Johnny21 Johnny21
3年前
elasticsearch教程--Plugins篇
目录概述环境准备认识es插件插件安装插件管理命令彩蛋概述上一篇博文记录了,在地大物博的祖国使用es,不得不考虑中文分词器,es内置的分词器对中文分词的支持可以用惨不忍睹来形容不为过,如果想安装中文分词器,就需要借助es的插件。本文将记录一下项目中如何使用插件,希
可莉 可莉
2年前
11大Java开源中文分词器的使用方法和分词效果对比
本文的目标有两个:1、学会使用11大Java开源中文分词器2、对比分析11大Java开源中文分词器的分词效果本文给出了11大Java开源中文分词的使用方法以及分词结果对比代码,至于效果哪个好,那要用的人结合自己的应用场景自己来判断。11大Java开源中文分词器,不同的分词器有不同的用法,定义的接口也不一样,我们先定义一个统一的接口:!
Stella981 Stella981
2年前
Elasticsearch Mapping之字段类型(field datatypes)
ElasticSearch支持如下数据类型:基本类型string(字符串类型)字符串类型包含text与keyword两种类型。1.text文本类型,在索引文件中,存储的不是原字符串,而是使用分词器对内容进行分词处理后得到一系列的词根,然后一一存储在index的倒排索引中。text类型支持如下
Stella981 Stella981
2年前
Lucene系列六:Lucene搜索详解(Lucene搜索流程详解、搜索核心API详解、基本查询详解、QueryParser详解)
一、搜索流程详解1\.先看一下Lucene的架构图!(https://oscimg.oschina.net/oscnet/f99b42f5233e8afba2477e1f5ba2e087f9f.png) 由图可知搜索的过程如下:  用户输入搜索的关键字、对关键字进行分词、根据分词结果去索引库里面找到对应的文章id、根据
Stella981 Stella981
2年前
Elasticsearch Mapping parameters(主要参数一览)
Elasticsearch在创建类型映射时可以指定映射参数,下面将一一进行介绍。analyzer指定分词器。elasticsearch是一款支持全文检索的分布式存储系统,对于text类型的字段,首先会使用分词器进行分词,然后将分词后的词根一个一个存储在倒排索引中,后续查询主要是针对词根的搜索。analyzer该参数可以在查询、字段、索引级
Stella981 Stella981
2年前
HanLP分词工具中的ViterbiSegment分词流程
本篇文章将重点讲解HanLP的ViterbiSegment分词器类,而不涉及感知机和条件随机场分词器,也不涉及基于字的分词器。因为这些分词器都不是我们在实践中常用的,而且ViterbiSegment也是作者直接封装到HanLP类中的分词器,作者也推荐使用该分词器,同时文本分类包以及其他一些自然语言处理任务包中的分词器也都间接使用了ViterbiSegment
Stella981 Stella981
2年前
ElasticSearch(六):IK分词器的安装与使用IK分词器创建索引
之前我们创建索引,查询数据,都是使用的默认的分词器,分词效果不太理想,会把text的字段分成一个一个汉字,然后搜索的时候也会把搜索的句子进行分词,所以这里就需要更加智能的分词器IK分词器了。1\.ik分词器的下载和安装,测试第一:下载地址:https://github.com/medcl/elasticsearchanalysisi
Stella981 Stella981
2年前
Elasticsearch学习笔记——分词
1.测试Elasticsearch的分词Elasticsearch有多种分词器(参考:https://www.jianshu.com/p/d57935ba514b)Settheshapetosemitransparentbycallingset\_trans(5)(1)standardanalyzer:标准分词器(默认是