分析器介绍

搜索的基础是对文本信息进行分析,Lucene的分析工具在org.apache.lucene.analysis包中。分析器负责对文本进行分词、语言处理得到词条,建索引和搜索的时候都需要用到分析器,两者应当是同一个,否则没法很好的匹配。

Lucene的分析器往往包括一个分词器(Tokenizer)和多个过滤器(TokenFilter),过滤器负责对切出来的词进行处理,如去掉敏感词、转换大小写、转换单复数等。tokenStream方法中往往是先使用一个Tokenizer,接着使用多个TokenFilter,Lucene自带的StandardAnalyzer就使用了StandardTokenizer with StandardFilter, LowerCaseFilter and StopFilter。抽象基类结构图如下。

注:停词-频繁使用但没有意义的词,在建索引或搜索时忽略掉。英语中的冠词、介词、连词(an/this/and),中文中的"的/也/为"。

常用分词器

以"Hello, this is a test case. 你好,这是一个测试的实例。created on 20140707"为例。

  • StandardAnalyzer:按空格、标点符号切词,中文逐字切割,忽略停词。

    [hello][test][case][你][好][这][是][一][个][测][试][的][实][例][created][20140707]
  • StopAnalyzer:空格、标点切分中英文,忽略停词,忽略数字。
    [hello][test][case][你好][这是一个测试的实例][created]
  • SimpleAnalyzer:空格、标点切分中英文,忽略数字。
    [hello][this][is][a][test][case][你好][这是一个测试的实例][created][on]
  • WhitespaceAnalyzer:空格切分中英文。
    [Hello,][this][is][a][test][case.][你好,这是一个测试的实例。created][on][20140707]

中文分词器

  • 单字分词:如StandardAnalyzer
  • 二分法:每2个字做为一个词语进行切分,可以减少每个词条后位置信息的长度。如CJKAnalyzer
    [hello][test][case][你好][这是][是一][一个][个测][测试][试的][的实][实例][created][20140707]
  • 词典分词:构造一个常用词典对文本进行词语切分,如mmseg4j的MaxWordAnalyzer
    [hello][this][is][a][test][case][你好][这是][一个][测试][的][实例][created][on][20140707]

一些技巧

如何获取切词后的Token
 //lucene3.5之前
Analyzer analyzer = new MaxWordAnalyzer();
TokenStream stream = analyzer.tokenStream("", new StringReader("Hello, this is a test case. " + "你好,这是一个测试的实例。" + "created on 20140707"));
stream.reset();
String out = "";
while (stream.incrementToken()) {
out += "[" + stream.getAttribute(TermAttribute.class).term() + "]";
}
System.out.println(out);
//lucene3.5之后
Analyzer analyzer = new StandardAnalyzer();
TokenStream stream = analyzer.tokenStream("", new StringReader("Hello, this is a test case. " + "你好,这是一个测试的实例。" + "created on 20140707"));
stream.reset();
String out = "";
while(stream.incrementToken()){
out += "[" + stream.getAttribute(CharTermAttribute.class).toString() + "]";
}
System.out.println(out);

mmseg4j词典

词典要求utf-8编码,可以在实例化Analyzer时指定词典路径,也可以设置mmseg.dic.path来指定词典路径,如果不指定路径,默认从mmseg4j-core.jar中的data目录下加载词典。即使指定了新路径,mmseg4j-core下的words.dic也会被加载。

chars.dic每行是一个单个字和对应频率,中间用空格分开,一般不用关心。

units.dic每行是一个单位的字,如分、亩,用以单独切分。

words.dic是核心词库,一行一条,可以下载搜狗的词库http://www.sogou.com/labs/dl/w.html。

wordsxxx.dic是自定义词库文件。

使用mmseg4j时需要3个包:mmseg4j-core.jar包含词库文件,mmseg4j-analysis.jar是一些analysis(如MaxWordAnalyzer),mmseg4j-solr.jar是一些solr使用的功能。

Lucene系列-分析器的更多相关文章

  1. Lucene系列-概述

    为了生存,就得干一行爱一行.那就学习下lucene吧. 全文检索介绍 流程: 建索引 准备待搜索文档 文档分词:将文档分成一个个单独的单词,去除标点符号.停词(无意义的冠词介词等),得到token 语 ...

  2. Lucene系列六:Lucene搜索详解(Lucene搜索流程详解、搜索核心API详解、基本查询详解、QueryParser详解)

    一.搜索流程详解 1. 先看一下Lucene的架构图 由图可知搜索的过程如下: 用户输入搜索的关键字.对关键字进行分词.根据分词结果去索引库里面找到对应的文章id.根据文章id找到对应的文章 2. L ...

  3. Lucene系列四:Lucene提供的分词器、IKAnalyze中文分词器集成、扩展 IKAnalyzer的停用词和新词

    一.Lucene提供的分词器StandardAnalyzer和SmartChineseAnalyzer 1.新建一个测试Lucene提供的分词器的maven项目LuceneAnalyzer 2. 在p ...

  4. Lucene系列三:Lucene分词器详解、实现自己的一个分词器

    一.Lucene分词器详解 1. Lucene-分词器API (1)org.apache.lucene.analysi.Analyzer 分析器,分词器组件的核心API,它的职责:构建真正对文本进行分 ...

  5. Lucene之分析器

    什么是分析器? 分析(Analysis)在Lucene中指的是将域(Field)文本转换为最基本的索引表示单元—项(Term)的过程. 分析器(Analyzer)对分析操作进行了封装,通过执行一系列操 ...

  6. Lucene系列-FieldCache

    域缓存,加载所有文档中某个特定域的值到内存,便于随机存取该域值. 用途及使用场景 当用户需要访问各文档中某个域的值时,IndexSearcher.doc(docId)获得Document的所有域值,但 ...

  7. [lucene系列笔记1]lucene6的安装与配置(Windows系统)

    lucene是一个java开源的高效全文检索工具包,最近做项目要用到,把学习的过程记录一下. 第一步:下载安装jdk 1.首先从官网下载jdk(下载之前先查看你的电脑是多少位操作系统,如果是32就下载 ...

  8. Lucene系列-索引文件

    本文介绍下lucene生成的索引有哪些文件组成,每个文件包含了什么信息.基于Lucene 4.10.0. 数据结构 索引(index)包含了存储的文档(document)正排.倒排信息,用于文本搜索. ...

  9. Lucene系列-近实时搜索(1)

    近实时搜索(near-real-time)可以搜索IndexWriter还未commit的内容,介于immediate和eventual之间,在数据比较大.更新较频繁的情况下使用.本文主要来介绍下如何 ...

随机推荐

  1. HTML字体及颜色设置

    字体(FONT)标记(TAGS) 标题字体(Header) <h#> ... </h#> #=1, 2, 3, 4, 5, 6<h1>今天天气真好!</h1& ...

  2. jquery双击事件

    <html> <head><meta http-equiv="Content-Type" content="text/html; chars ...

  3. 用Backbone.js教程系列的链接

    整理了一下用Backbone.js系列教程链接. Backbone.js入门教程 用Backbone.js创建一个联系人管理系统(一) 用Backbone.js创建一个联系人管理系统(二) 用Back ...

  4. svn服务器搭建与使用

  5. 《UML大战需求分析》阅读笔记4

    流程分析利器之二,状态机图. 状态机图也可以叫状态图,也是用来分析流程的,之前的活动图的主体是事件的行为,而状态机图主要描述的是事件的状态. 开始:实心圆点: 结束:点加环:(与活动图一样) 状态:圆 ...

  6. multiple definition of `err_sys' 《UNIX环境高级编程》

    本文地址:http://www.cnblogs.com/yhLinux/p/4079930.html 问题描述: [点击此处直接看解决方案] 在练习<UNIX环境高级编程>APUE程序清单 ...

  7. bond配置

    Bonding的模式一共有7种: #defineBOND_MODE_ROUNDROBIN       0   (balance-rr模式)网卡的负载均衡模式 #defineBOND_MODE_ACTI ...

  8. xUtils 中的BitmapUtils 全面注释

    /** * 加载图片工具类 * @author afu * */ public class BitmapUtils implements TaskHandler { /** * 判断任务是否暂停 */ ...

  9. 近期C#项目中总结

    1. 读写文件操作 using (file = new System.IO.StreamReader(inputfile)) { using (outfile = new System.IO.Stre ...

  10. 在mac下svn冲突或其它什么原因无法更新svn副本或是必须要删除svn信息时,如何清除svn信息

    find . -type d -name ".svn"|xargs rm -rf 出处: http://blog.csdn.net/springsky_/article/detai ...