全文索引(三)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 ...
随机推荐
- Memcached(三)Memcached配置参数初解
一.基本参数在我们第一次安装Memcached时,一般都是用过这个命令: memcached -m 512 -u root -d -l 127.0.0.1 -p 11211 我们先来解释这几个参数的含 ...
- Socket实现简单的聊天通信
最近学习了Socket后,感觉Socket挺好玩的,在博客中看到socket在实时聊天功能的很强大,于是乎就做了一个简单的聊天功能,今天贴出来,能够与大家一起共享,有不对之处,能够给予指出,谢谢! 服 ...
- Android使用SAX解析xml
一.理论准备 SAX采用事件驱动机制来解析XML文档,每当SAX解析器发现文档开始.元素开始.文本.元素结束.文档结束等事件时,就会向外发送一次事件,而开发者则可以通过编写事件监听器处理这些事 ...
- 【BZOJ 3476】 线段树===
59 懒惰的奶牛贝西所在的牧场,散落着 N 堆牧草,其中第 i 堆牧草在 ( Xi,Yi ) 的位置,数量有 Ai 个单位.贝西从家移动到某一堆牧草的时候,只能沿坐标轴朝正北.正东.正西.正南这四个 ...
- CAS单点登录配置[3]:服务器端配置
在准备工作,证书生成等工作完成后,本篇介绍服务器端的配置. JDK配置 1 我们将生成的cacerts文件分别拷贝到JDK目录下的jre/lib/security目录下及JRE对应的目录中,如果之前存 ...
- POJ_3280_Cheapest_Palindrome_(动态规划)
描述 http://poj.org/problem?id=3280 n 种小写字母构成长度为 m 的串,现在要通过增删字母使串回文,给出每种字母增和删的费用,求最小花费. Cheapest Palin ...
- WordPress NOSpam PTI插件‘comment_post_ID’参数SQL注入漏洞
漏洞名称: WordPress NOSpam PTI插件‘comment_post_ID’参数SQL注入漏洞 CNNVD编号: CNNVD-201309-388 发布时间: 2013-09-24 更新 ...
- (转载)struct 与typdef struct的区别
(转载)http://blog.csdn.net/piratejk/article/details/3491226 1. 基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字. ...
- HDU-2975 Billboard
Billboard Time Limit : 20000/8000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Su ...
- ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATA
Centos5.5 安装Oracle11g客户端,配置了本地的net服务后,用sqlplus连接报错: tnsnames.ora配置如下 orcl = (DESCRIPTION = (ADDRESS ...