分词器的核心类:

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的更多相关文章

  1. Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息

    Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息 在此回复牛妞的关于程序中分词器的问题,其实可以直接很简单的在词库中配置就好了,Lucene中分词的所有信息我们都可以从 ...

  2. Lucene系列三:Lucene分词器详解、实现自己的一个分词器

    一.Lucene分词器详解 1. Lucene-分词器API (1)org.apache.lucene.analysi.Analyzer 分析器,分词器组件的核心API,它的职责:构建真正对文本进行分 ...

  3. 学习笔记(三)--Lucene分词器详解

    Lucene-分词器API org.apache.lucene.analysi.Analyzer 分析器,分词器组件的核心API,它的职责:构建真正对文本进行分词处理的TokenStream(分词处理 ...

  4. Lucene分词器

    Lucene分析器的基类为Analyzer,Analyzer包含两个核心组件:Tokenizer和 TokenFilter.自定义分析器必须实现Analyzer类的抽象方法createComponen ...

  5. lucene分词器与搜索

    一.分词器 lucene针对不同的语言和虚伪提供了许多分词器,我们可以针对应用的不同的需求使用不同的分词器进行分词.我们需要注意的是在创建索引时使用的分词器与搜索时使用的分词器要保持一致.否则搜索的结 ...

  6. lucene 分词器

    分词器 作用:切分关键词的. 在什么地方使用到了:在建立索引和搜索时. 原文:An IndexWriter creates and maintains an index. 1,切分: An Index ...

  7. Lucene中TokenStream,Tokenizer,TokenFilter,TokenStreamComponents与Analyzer

    TokenStream extends AttributeSource implements Closeable: incrementToken,end,reset,close Tokenizer直接 ...

  8. Lucene.net(4.8.0) 学习问题记录二: 分词器Analyzer中的TokenStream和AttributeSource

    前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移.因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3 ...

  9. Lucene.net(4.8.0)+PanGu分词器问题记录一:分词器Analyzer的构造和内部成员ReuseStategy

    前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移.因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3 ...

随机推荐

  1. 背景.jpg

  2. BZOJ1709超级弹珠

    1709: [Usaco2007 Oct]Super Paintball超级弹珠 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 352  Solved:  ...

  3. ToolTip特效 JavaScript 盗取厦门人才网的特效

    原文发布时间为:2009-05-17 -- 来源于本人的百度文章 [由搬家工具导入] 源代码:http://www.xmaspx.com/Services/FileAttachment.ashx?At ...

  4. sgu 275 To xor or not to xor 线性基 最大异或和

    题目链接 题意 给定\(n\)个数,取其中的一个子集,使得异或和最大,求该最大的异或和. 思路 先求得线性基. 则求原\(n\)个数的所有子集的最大异或和便可转化成求其线性基的子集的最大异或和. 因为 ...

  5. 【MFC - 菜单】在对话框程序中添加菜单栏(CMenu)(转)

    原文转自 http://lishiqiang1988.blog.163.com/blog/static/41147912201382104631547/ VS2010的MFC对话框程序中添加菜单栏的过 ...

  6. MOSFET 符號解說

    符號 上面這個是 空乏型 的 MOSFET 符號 (有做過修改), 一個是 P channel, 一個是 N channel, 空乏型本身就有通道,所以中間是沒有斷掉的直線, P 代表 + , 有外放 ...

  7. AC日记——队列安排 洛谷 P1160

    队列安排 思路: 链表裸题: 来,上代码: #include <cstdio> #include <cstring> #include <iostream> usi ...

  8. webview reload 错误 Error Domain=WebKitErrorDomain Code=102 "Frame load interrupted"

    在某个特定的场合先需要对WKWebView进行一次reload,但是直接回走到失败的代理方法中并报如下的错误 Error Domain=WebKitErrorDomain Code=102 " ...

  9. Codeforces Gym100971 L.Chess Match (IX Samara Regional Intercollegiate Programming Contest Russia, Samara, March 13)

    这个题就是两个队,看最多能赢的个数,然后比较一下,看两个队是都能赢彼此,还是只有一个队赢的可能性最大.表达能力不好,意思差不多... 和田忌赛马有点像,emnnn,嗯. 代码: 1 #include& ...

  10. go 函数回调