分析器介绍

搜索的基础是对文本信息进行分析,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. Server.mappath用法

    1.Server.MapPath ("/") 应用程序根目录所在的位置 如 C:\qq\qqroot\ 2.Server.MapPath ("./") 表示所在 ...

  2. vs2013卸载后重新安装不能用了,如何解决

    vs2013卸载后重新安装不能用了 据说VS卸载后有残留文件,估计是注册文件没删除,弄了很多方法,最后只有重装.你可以下载一个cclearn清理注册表,再装试试 我卸载完用360清理了一下 之后再安装 ...

  3. GPT分区磁盘上优盘安装win10的方法

    刚买的acer笔记本安装的是win8,之后硬盘安装升级到win10.今天想格式化安装win10这样自带的软件可以去除,但是nt6 hdd在win10上无法使用,本来想先安装win7再通过nt6 hdd ...

  4. XAMARIN +VS2015 ANDROID 开发判断gps 是否打开。

    在获取位置的时候首先要判断gps是否打开,如果没有打开就要提示打开,当然最友好的就是直接调转到打开界面. LocationManager alm = (LocationManager)this.Get ...

  5. node学习笔记(四)

    //Node.js标准库提供了http模块,其中封装了一个高效的http服务器和一个简易的http客户端 //http.Server是一个基于事件的HTTP服务器,它的核心由Node.js下层c++部 ...

  6. mysql远程快速导出csv格式数据工具

    如需转载,请经本人同意. 之前本人曾经写过一个使用 select ....into outfile原理导出数据的脚本,但该脚本值适用于本地快速导出,并不支持远程服务,故又编写了下面这个支持远程导出的脚 ...

  7. CentOS 7下MySQL安装配置

    安装: #centos 7 yum install -y mariadb mariadb-server mariadb-devel #debian 8 apt-get install nginx ma ...

  8. html给div加超链接的方法

    1.通过window.open函数 <div onclick="window.open('www.baidu.com')">在新窗口跳转至百度</div> ...

  9. 第十四章:降维:奇异值分解SVD

  10. easyui datagrid中关联combox

    datagrid中列上关联combobox{ field: 'SysCode', title: '系统代码', width: 150, align: 'left', editor: { type: ' ...