全文索引(三)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 ...
随机推荐
- chrome浏览器默认样式覆盖input背景
问题描述:input表单添加了背景图片,结果自动填充是,编程了一个淡黄色矩形方框. 解决方案:网上查询了很多的解决方式,基本都不管用,这里我简单说两个. 1.去除黄色背景 input:-webkit- ...
- 使用ImageMagick和Tesseract进行简单数字图像识别
使用ImageMagick和Tesseract进行简单数字图像识别 由于直接使用 tesseract 进行识别,识别率很低, ImageMagick 安装.配置及使用: 平台:winXP 1. 安装I ...
- 配置.NET程序中最大HTTP并发连接数(默认为2)
方式一:代码 ServicePointManager.DefaultConnectionLimit = 方式二:配置 <system.net> <connectionManageme ...
- UVA 11426 GCD Extrme (Ⅲ)
给定一个整数N(1<N<=4000000)的整数求∑GCD(i,j)i=1,2,3....j-1,2<=j<=n的值.参考了一下网上的题解,复述一下我理解后的思路,加深理解: ...
- 李洪强iOS开发Swift篇—05_元组类型
李洪强iOS开发Swift篇—05_元组类型 一.元组类型介绍 1.什么是元组类型 元组类型由 N个 任意类型的数据组成(N >= 0),组成元组类型的数据可以称为“元素” 示例: let po ...
- 【踩坑记】从HybridApp到ReactNative
前言 随着移动互联网的兴起,Webapp开始大行其道.大概在15年下半年的时候我接触到了HybridApp.因为当时还没毕业嘛,所以并不清楚自己未来的方向,所以就投入了HybridApp的怀抱. Hy ...
- perl 监控mysql 事务和锁
use DBI; use Net::SMTP; use HTTP::Date qw(time2iso str2time time2iso time2isoz); # mail_user should ...
- Java 多维数组 按某列 排序
public MetaCell[][] getByColumn(final int columnIndex, int decisionIndex) {//[注意]final咯 ...
- 如何编译Support7Demos测试appcompat
目录(?)[-] 简介 在Eclipse中编译 使用Gradle编译 简介 Google发布的API-18中带上的support-v7包含了appcompat组件,可以在小于API-11的androi ...
- 比较详细的利用虚拟机对SD卡FAT32+EXT4+Ext4分区图解教程
如果大家嫌虚拟机复杂,我这里提供一个我没用虚拟机之前的分区方法:这个方法实际是可行的 我在没有用虚拟机之前,我是这样操作的1.首先在分区软件分好fat32+ext2+ext22.然后用recovery ...