lucene分词器中的Analyzer,TokenStream, Tokenizer, TokenFilter
分词器的核心类:
Analyzer:分词器
TokenStream:
分词器做优点理之后得到的一个流。这个流中存储了分词的各种信息,能够通过TokenStream有效的获取到分词单元。
下面是把文件流转换成分词流(TokenStream)的过程
首先,通过Tokenizer来进行分词,不同分词器有着不同的Tokenzier,Tokenzier分完词后,通过TokenFilter对已经分好词的数据进行过滤,比方停止词。过滤完之后,把全部的数据组合成一个TokenStream;下面这图就是把一个reader转换成TokenStream:
这个TokenStream中存有一些属性,这些属性会来标识这个分词流的元素。
在这个流里 有非常多属性。
以下截了lucene4.10.1源代码中的图:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHU5NDgxNjI5OTk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
当中有3个重要的属性,CharTermAttribute(保存相印的词汇),OffsetAttribute(保存各个词汇的偏移量)。PositionIncrementAttribute(保存各个词与词之间的位置增量,假设为0。能够做同义词搜索)。
是由这3个属性来控制这些分词信息
Tokenzier
主要负责接收Reader。将Reader进行分词操作。有例如以下一些实现类
TokenFilter 将分词的出来的单元,进行各种各样的过滤。
代码例如以下:
<span style="font-size:14px;">package hhc; import java.io.IOException;
import java.io.StringReader; import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
import org.apache.lucene.analysis.tokenattributes.PositionIncrementAttribute;
import org.apache.lucene.analysis.tokenattributes.TypeAttribute; public class AnalyzerUtil { /**
* 输出字符分词信息
*
* @param str
* @param a
*/
public static void displayAllToken(String str, Analyzer a) {
try {
// 全部的分词器都必须含有分词流
TokenStream stream = a.tokenStream("content", new StringReader(str));// 放回一个TokenStream;
/**
* 创建一个属性,这个属性会加入到流里。随着这个TokenStream流添加
* 这个属性中保存中全部的分词信息
*/
CharTermAttribute cta=stream.addAttribute(CharTermAttribute.class);
//位置增量的属性,存储词之间的距离
PositionIncrementAttribute pia = stream.addAttribute(PositionIncrementAttribute.class);
//储存每一个词直接的偏移量
OffsetAttribute oa = stream.addAttribute(OffsetAttribute.class);
//使用的每一个分词器直接的类型信息
TypeAttribute ta = stream.addAttribute(TypeAttribute.class);
for (; stream.incrementToken();) {
System.out.print(pia.getPositionIncrement()+":");
System.out.print(cta+":["+oa.startOffset()+"-"+oa.endOffset()+"]-->"+ta.type()+"\n");
}
System.out.println();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
</span>
測试:
<span style="font-size:14px;"> @Test
public void hhcTest(){
Analyzer a1 =new StandardAnalyzer(Version.LUCENE_35);
Analyzer a2 =new StopAnalyzer(Version.LUCENE_35);
Analyzer a3 =new SimpleAnalyzer(Version.LUCENE_35);
Analyzer a4 =new WhitespaceAnalyzer(Version.LUCENE_35); String txt ="how are you think you";
AnalyzerUtil.displayAllToken(txt, a1);
AnalyzerUtil.displayAllToken(txt, a2);
AnalyzerUtil.displayAllToken(txt, a3);
AnalyzerUtil.displayAllToken(txt, a4);
}</span>
lucene分词器中的Analyzer,TokenStream, Tokenizer, TokenFilter的更多相关文章
- Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息
Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息 在此回复牛妞的关于程序中分词器的问题,其实可以直接很简单的在词库中配置就好了,Lucene中分词的所有信息我们都可以从 ...
- Lucene系列三:Lucene分词器详解、实现自己的一个分词器
一.Lucene分词器详解 1. Lucene-分词器API (1)org.apache.lucene.analysi.Analyzer 分析器,分词器组件的核心API,它的职责:构建真正对文本进行分 ...
- 学习笔记(三)--Lucene分词器详解
Lucene-分词器API org.apache.lucene.analysi.Analyzer 分析器,分词器组件的核心API,它的职责:构建真正对文本进行分词处理的TokenStream(分词处理 ...
- Lucene分词器
Lucene分析器的基类为Analyzer,Analyzer包含两个核心组件:Tokenizer和 TokenFilter.自定义分析器必须实现Analyzer类的抽象方法createComponen ...
- lucene分词器与搜索
一.分词器 lucene针对不同的语言和虚伪提供了许多分词器,我们可以针对应用的不同的需求使用不同的分词器进行分词.我们需要注意的是在创建索引时使用的分词器与搜索时使用的分词器要保持一致.否则搜索的结 ...
- lucene 分词器
分词器 作用:切分关键词的. 在什么地方使用到了:在建立索引和搜索时. 原文:An IndexWriter creates and maintains an index. 1,切分: An Index ...
- Lucene中TokenStream,Tokenizer,TokenFilter,TokenStreamComponents与Analyzer
TokenStream extends AttributeSource implements Closeable: incrementToken,end,reset,close Tokenizer直接 ...
- Lucene.net(4.8.0) 学习问题记录二: 分词器Analyzer中的TokenStream和AttributeSource
前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移.因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3 ...
- Lucene.net(4.8.0)+PanGu分词器问题记录一:分词器Analyzer的构造和内部成员ReuseStategy
前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移.因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3 ...
随机推荐
- [LeetCode] Path Sum II 深度搜索
Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...
- 64位linux 汇编
c源码:testg.c 1 #include<stdio.h> 2 3 #define s ...
- input上报流程分析【转】
转自:http://blog.chinaunix.net/uid-28320320-id-3389196.html .参考文章 [Andorid]input系统的事件处理 .源码分析 linux )查 ...
- eWebEditor不支持IE7以上版本Bug修改
修改: \Include\Editor.js //把此行 if (element.YUSERONCLICK) eval(element.YUSERONCLICK + "anonymous() ...
- js中eval()和$.parseJSON()的区别
之前自己一直对ajax不是特别的熟悉,所以一般都很少用这个去写功能,但是最近这个项目中用到了,用ajax异步传数据,json传数据这个时候就需要去解析传过来的数据了,eval()和$.parseJSO ...
- docker下使用DB2
1.查询可安装的db2镜像 benjamin@docker:~$ docker images |grep -i db2 ibmcom/db2express-c latest 7aa154d9b73c ...
- 使用 Jmeter 做 Web 接口测试-详解
接口测试概述 定义 WIKI定义:接口测试作为集成测 试的一部分,通过直接控制API来判断系统的功能性,可靠性,性能与安全性.API测试是没有界面的,执行在通讯 层.API 测试在自动化测试中有着重要 ...
- 关于npm无法安装依赖包以及安装包缓慢的解决方法
因为npm的服务器在国外,导致我们使用npm安装第三方包缓慢.而且有的第三方包是被墙的. 因此,作为墙内人,必须解决这个问题,否则开发起来实在是太坑了! 推荐大家使用淘宝的镜像(cnpm),它以每10 ...
- Delphi中@,^,#,$分别表示什么?
@:取址运算符; var int:integer; p:^integer; new(P); int:=24; p:=@int; dispose(P); ^:指针的引用解析操作符; var pint:^ ...
- setTimeout改变this指向(****************************************)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...