Lucene系列-分析器
分析器介绍
搜索的基础是对文本信息进行分析,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]
一些技巧
//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系列-分析器的更多相关文章
- Lucene系列-概述
为了生存,就得干一行爱一行.那就学习下lucene吧. 全文检索介绍 流程: 建索引 准备待搜索文档 文档分词:将文档分成一个个单独的单词,去除标点符号.停词(无意义的冠词介词等),得到token 语 ...
- Lucene系列六:Lucene搜索详解(Lucene搜索流程详解、搜索核心API详解、基本查询详解、QueryParser详解)
一.搜索流程详解 1. 先看一下Lucene的架构图 由图可知搜索的过程如下: 用户输入搜索的关键字.对关键字进行分词.根据分词结果去索引库里面找到对应的文章id.根据文章id找到对应的文章 2. L ...
- Lucene系列四:Lucene提供的分词器、IKAnalyze中文分词器集成、扩展 IKAnalyzer的停用词和新词
一.Lucene提供的分词器StandardAnalyzer和SmartChineseAnalyzer 1.新建一个测试Lucene提供的分词器的maven项目LuceneAnalyzer 2. 在p ...
- Lucene系列三:Lucene分词器详解、实现自己的一个分词器
一.Lucene分词器详解 1. Lucene-分词器API (1)org.apache.lucene.analysi.Analyzer 分析器,分词器组件的核心API,它的职责:构建真正对文本进行分 ...
- Lucene之分析器
什么是分析器? 分析(Analysis)在Lucene中指的是将域(Field)文本转换为最基本的索引表示单元—项(Term)的过程. 分析器(Analyzer)对分析操作进行了封装,通过执行一系列操 ...
- Lucene系列-FieldCache
域缓存,加载所有文档中某个特定域的值到内存,便于随机存取该域值. 用途及使用场景 当用户需要访问各文档中某个域的值时,IndexSearcher.doc(docId)获得Document的所有域值,但 ...
- [lucene系列笔记1]lucene6的安装与配置(Windows系统)
lucene是一个java开源的高效全文检索工具包,最近做项目要用到,把学习的过程记录一下. 第一步:下载安装jdk 1.首先从官网下载jdk(下载之前先查看你的电脑是多少位操作系统,如果是32就下载 ...
- Lucene系列-索引文件
本文介绍下lucene生成的索引有哪些文件组成,每个文件包含了什么信息.基于Lucene 4.10.0. 数据结构 索引(index)包含了存储的文档(document)正排.倒排信息,用于文本搜索. ...
- Lucene系列-近实时搜索(1)
近实时搜索(near-real-time)可以搜索IndexWriter还未commit的内容,介于immediate和eventual之间,在数据比较大.更新较频繁的情况下使用.本文主要来介绍下如何 ...
随机推荐
- Windows Desktop 调用 WinRT api
<Reference Include="Windows"> <HintPath>..\..\..\..\..\..\Program Files (x86)\ ...
- WPF Combobox样式
<ControlTemplate x:Key="ComboBoxToggleButton" TargetType="{x:Type ToggleButton}&qu ...
- VS 2010 问题集锦
1.Cannot find or open the PDB file 用vs2010写程序时,经常遇到:按F5,提示命令符一闪而过,且显示“Cannot find or open the PDB fi ...
- Ajax参数详解
1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如 ...
- 猿团YTFCloud生态系统,全面服务创业者
9月15日,YTFCloud已正式开启了内测. 创业者翘首以待的YTFCloud,虽然让部分创业者感受到了它的神奇,但对于更多暂时无法尝试的创业者来说,它依然有一层神秘的面纱. 今天小编就来带你近距离 ...
- Smarty缓存的5个知识点
(1)页面缓存:整个页面全局的缓存 需要4个步骤: ①开启缓存 $smarty->caching = true; ②设置缓存的生命周期 $smarty->cache_lifetime ...
- jQuery - 自定义伪类 [:pseudoclass]
有两种创建伪类的方法, 第一种, $.extend( $.expr[':'], { // 自定义的伪类名称:group group: function(element, index, matches, ...
- 1.iOS直播ijkplayer(第一周)
准备工作: 1.使用的B站的开源框架ijkplayer ,下载地址: https://github.com/Bilibili/ijkplayer ijkplayer 是一个基于 ffplay 的轻量级 ...
- Android--SQLite的使用
1.熟悉了SQLite的一般用法之后,在实际开发中,为了能够更好的管理和维护数据库,我们会封装一个继承自SQLiteOpenHelper类的数据库操作类,然后以这个类为基础,再封装我们的业务逻辑方法. ...
- Android—LayoutInflater学习笔记
LayoutInflater的的主要用处:使用LayoutInflater来载入界面,类似于findViewById()在Activity中加载Widget组件一样.区别在于与LayoutInflat ...