全文索引(三)lucene 分词 Analyzer
分词: 将reader通过阅读对象Analyzer字处理,得到TokenStream处理流程被称为分割。
该解释可能是太晦涩。查看示例,这个东西是什么感性的认识。
样品:一段文本“this is jack’s house”,经过分词器处理之后得到可能为jack 、house。
这个过程中:this is 称之为停留词。这种词是不会被存入索引文件的。这个主要通过StopAnalyzer分词器来实现,后面我们会讲。
jack’s 被转换为 jack 。诸如此类coming会被转换为come。全部的形式都会被最为原始的状态。
分词的过程主要由Analyzer类解析实现,而Analyzer通过调用TokenStream及其两个子类TokenFilter、Tokenizer来实现。
总体的结构类图例如以下
一. Analyzer
经常使用的有:
SimpleAnalyzer: 将查询语句转换为语素单元时完毕转换为小写的操作。
StandardAnalyzer :最为经常使用的智能分词器,通过这两个LowerCaseFilter和StopFilterTokenStream。能完毕诸如邮件、字母分析处理。
WhitespaceAnalyzer :以空格为分词符进行分析处理。
如:I am coder—-
Lucene3.5 有9种分词器。继承Analyzer抽象类内部通过tokenStream(String fieldName, Reader reader)方法来处理读取的查询数据,Analyzer和不同子类分词器的实现。应该能看到组合模式的设计。
二. TokenStream
经过分词、过滤处理后的结果流。
主要通过public abstract boolean incrementToken() throws IOException 方法来实现分词后各语素的处理读取操作。
tokenFilter 和 Tokenizer两个子类来实现 去停留词和得到分词单元。
#三. 分词一般处理流程#
分词器主要流程
- 第一步:reader对象读取分词数据
- 第二步:Tokenier 负责将一组数组分解为一个个的单元
如:I am coder—- - 第三步:经过多重过滤器对分词数据进行过滤操作。
过滤的作用是去除停留词,并形态还原,统一大写和小写等。
去除停留词: 就是去除相似in of this 等没有确切含义的词。这些不会被当做分词单元。形态还原则是将过去分词、过去式这种词还原为原来的形态。如:termming-term。
demo
public void createToken(String strContent,Analyzer analyer){
try {
//1.创建TokenStream对象
TokenStream tokenStream=analyer.tokenStream("", new StringReader(strContent));
//charTermAttribute 保存了分词中的各个语素单元
CharTermAttribute cta=tokenStream.addAttribute(CharTermAttribute.class);
//PositionIncrementAttribute 保存分词各个语素单元的位置信息
PositionIncrementAttribute pta=tokenStream.addAttribute(PositionIncrementAttribute.class);
//OffsetAttribute 保存各语素单元的偏移量
OffsetAttribute oab=tokenStream.addAttribute(OffsetAttribute.class);
//读取分词单元的信息
while(tokenStream.incrementToken()){
System.out.println("----------cta---------="+cta);
System.out.println("----------pta---------="+pta);
System.out.println("----------oab---------="+oab);
}
} catch (IOException e) {
e.printStackTrace();
}
}
private LuceneAnalyzerUtil luceneAnalyzer=null;
public testAnalyzer(){
luceneAnalyzer=new LuceneAnalyzerUtil();
}
@Test
public void testCreateToken(){
//标准分词器。作为一般标准的分词器有自己智能的一面,
Analyzer analyzer1=new StandardAnalyzer(Version.LUCENE_35);
Analyzer analyzer2=new StopAnalyzer(Version.LUCENE_35);
Analyzer analyzer3=new ClassicAnalyzer(Version.LUCENE_35);
Analyzer analyzer4=new KeywordAnalyzer();
Analyzer analyzer5=new WhitespaceAnalyzer(Version.LUCENE_35);
luceneAnalyzer.createToken("I am human,I am special", analyzer1);
luceneAnalyzer.createToken("I am human,I am special", analyzer2);
luceneAnalyzer.createToken("I am human,I am special", analyzer3);
luceneAnalyzer.createToken("I am human,I am special", analyzer4);
luceneAnalyzer.createToken("I am human,I am special", analyzer5);
}
总的来讲,lucene的分词器主要做了一个什么样的工作呢?从查询语句分解为一个个查询单元的工作。
这么做的目的是为了lucene在查询时候更好的细粒度的去匹配已创建的索引文件。
全文索引(三)lucene 分词 Analyzer的更多相关文章
- 学习笔记(三)--Lucene分词器详解
Lucene-分词器API org.apache.lucene.analysi.Analyzer 分析器,分词器组件的核心API,它的职责:构建真正对文本进行分词处理的TokenStream(分词处理 ...
- Lucene系列三:Lucene分词器详解、实现自己的一个分词器
一.Lucene分词器详解 1. Lucene-分词器API (1)org.apache.lucene.analysi.Analyzer 分析器,分词器组件的核心API,它的职责:构建真正对文本进行分 ...
- lucene分词器中的Analyzer,TokenStream, Tokenizer, TokenFilter
分词器的核心类: Analyzer:分词器 TokenStream: 分词器做优点理之后得到的一个流.这个流中存储了分词的各种信息,能够通过TokenStream有效的获取到分词单元. 下面是把文件流 ...
- lucene分词多种方法
目前最新版本的lucene自身提供的StandardAnalyzer已经具备中文分词的功能,但是不一定能够满足大多数应用的需要.另外网友谈的比较多的中文分词器还有:CJKAnalyzerChinese ...
- lucene分词器与搜索
一.分词器 lucene针对不同的语言和虚伪提供了许多分词器,我们可以针对应用的不同的需求使用不同的分词器进行分词.我们需要注意的是在创建索引时使用的分词器与搜索时使用的分词器要保持一致.否则搜索的结 ...
- Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息
Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息 在此回复牛妞的关于程序中分词器的问题,其实可以直接很简单的在词库中配置就好了,Lucene中分词的所有信息我们都可以从 ...
- Lucene分词详解
分词和查询都是以词项为基本单位,词项是词条化的结果.在Lucene中分词主要依靠Analyzer类解析实现.Analyzer类是一个抽象类,分词的具体规则是由子类实现的,所以对于不同的语言规则,要有不 ...
- lucene 分词器
分词器 作用:切分关键词的. 在什么地方使用到了:在建立索引和搜索时. 原文:An IndexWriter creates and maintains an index. 1,切分: An Index ...
- 爬虫系统Lucene分词
思路:查询数据库中信息,查询出id和name把那么进行分词存入文件 package com.open1111.index; import java.io.IOException;import java ...
随机推荐
- qt5 基础知识
QWidget wQLineEdit edit; edit.show(); //如果没有这句,编辑框edit将会显示在父窗口的左上角edit.setParent(&w); //以w为父窗口并显 ...
- app应用程序本地化--备用
一.简介 * 使用本地化功能,可以轻松地将应用程序翻译成多种语言,甚至可以翻译成同一语言的多种方言 * 如果要添加本地化功能,需要为每种支持的语言创建一个子目录,称为”本地化文件夹”,通常使用.lpr ...
- m个苹果放在n个筐里,每个筐至少一个,所有的筐都一样,有多少种放法
package com.study; import java.io.BufferedReader; import java.io.IOException; import java.io.InputSt ...
- Why longest path problem doesn't have optimal substructure?
We all know that the shortest path problem has optimal substructure. The reasoning is like below: Su ...
- BZOJ 1668: [Usaco2006 Oct]Cow Pie Treasures 馅饼里的财富
Description 最近,奶牛们热衷于把金币包在面粉里,然后把它们烤成馅饼.第i块馅饼中含有Ni(1<=Ni<=25)块金币,并且,这个数字被醒目地标记在馅饼表面. 奶牛们把所有烤好的 ...
- webkit javascript
http://www.infoq.com/cn/news/2013/02/douglas-interview http://blog.csdn.net/horkychen/article/detail ...
- 【网络流24题】No. 13 星际转移问题 (网络判定 最大流)
[题意] 由于人类对自然资源的消耗, 人们意识到大约在 2300 年之后, 地球就不能再居住了.于是在月球上建立了新的绿地,以便在需要时移民. 令人意想不到的是, 2177 年冬由于未知的原因, 地球 ...
- 最全的微软msdn原版windows系统镜像和office下载地址集锦
随着windows的发展,越来越多的人都热衷于微软的原版系统下载了,相比之前的版本比如winxp版本,windows vista/win7/win8/win8.1/win10后来的版本在安装方面也比较 ...
- 【Xamarin挖墙脚系列:时刻下载最新的Mac环境下的Xamarin安装包】
原文:[Xamarin挖墙脚系列:时刻下载最新的Mac环境下的Xamarin安装包] 打开这两个地址,就能看到最新的安装包了.... http://www.jianshu.com/p/c67c14b3 ...
- Learing WCF Chapter1 WCF Services
WCF ServicesWCF services are the new distributed boundary in an enterprise application—with an empha ...