lucene分词器中的Analyzer,TokenStream, Tokenizer, TokenFilter

news/2024/5/19 16:01:53 标签: lucene, TokenStream, Analyzer, Tokenizer, 分词器
分词器的核心类:
Analyzer: 分词器
TokenStream: 分词器做好处理之后得到的一个流。这个流中存储了分词的各种信息,可以通过TokenStream有效的获取到分词单元。
以下是把文件流转换成分词流(TokenStream)的过程

首先,通过Tokenizer来进行分词,不同分词器有着不同的Tokenzier,Tokenzier分完词后,通过TokenFilter对已经分好词的数据进行过滤,比如停止词。过滤完之后,把所有的数据组合成一个TokenStream;以下这图就是把一个reader转换成TokenStream

这个TokenStream中存有一些属性,这些属性会来标识这个分词流的元素。


在这个流里 有很多属性。下面截了lucene4.10.1源码中的图:


     其中有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>



http://www.niftyadmin.cn/n/1375948.html

相关文章

How do you simple use git repository

http://www.bootcss.com/p/git-guide/ This is a good page. 本文转自ting2junshui51CTO博客&#xff0c;原文链接&#xff1a;http://blog.51cto.com/ting2junshui/1730464 &#xff0c;如需转载请自行联系原作者

lucene构建同义词分词器

lucene4.0版本以后 已经用TokenStreamComponents 取代了TokenStream流。里面包括了filter和tokenizer 在较复杂的lucene搜索业务场景下&#xff0c;直接网上下载一个作为项目的分词器&#xff0c;是不够的。那么怎么去评定一个中文分词器的好与差&#xff1a;一般来讲&#xff…

mysql备份策略之我理解

备份策略&#xff0c;我个人感觉应该做到以下几点&#xff1a; 1、 备份的定位&#xff1a;是故障恢复用还是数据归档用&#xff1b;2、 备份数据量&#xff1a;数据量有多少&#xff0c;需要的空间&#xff0c;备份时间&#xff0c;采用的备份方式&#xff1b;3、 备份存储&a…

lucene自定义评分域

搜索查询业务场景&#xff1a; 1&#xff1a;搜索一组数据&#xff0c;这些数据录入时间在3个月之内&#xff1b;提高权重。1年以内&#xff0c;权重不变&#xff1b;1年以前&#xff0c;降低查询权重&#xff1b; 2&#xff1a;如果 是vip客户&#xff0c;提高该用户下所在查…

关于堆叠技术

堆叠技术 堆叠(Stack)和级联(Uplink)是多台交换机或集线器连接在一起的两种方式。它们的主要目的是增加端口密度。但它们的实现方法是不同的。简单地说&#xff0c;级联可通过一根双绞线在任何网络设备厂家的交换机之间&#xff0c;集线器之间&#xff0c;或交换机与集线器之间…

lucene自定义过滤器Filter

业务场景&#xff1a; 1&#xff1a;假设数据库中的字段给删了&#xff0c;如果 重建索引的话&#xff0c;就开销比较大。这个时候就可以考虑自定义过滤器 2&#xff1a;控制部分查询权限 为了避免频繁重构索引&#xff0c;我们可以在查询的时候定义一个自己的过滤器 &#…

flask 报错 AttributeError: module 'Include.route' has no attribute 'name'

代码如图: 后来发现,是要把模块下的 声明的 Blueprint() 对象导入 导入进去就行了 或者把导包方式修改为: 转载于:https://www.cnblogs.com/aizm/p/10463145.html

dictmatch及多模算法串讲(一)

多模式匹配在这里指的是在一个字符串中寻找多个模式字符字串的问题。一般来说&#xff0c;给出一个长字符串和很多短模式字符串&#xff0c;如何最快最省的求出哪些模式字符串出现在长字符串中是我们所要思考的。该算法广泛应用于关键字过滤、入侵检测、病毒检测、分词等等问题…