org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.Token; import org.apache.lucene.analysis.TokenStream...String[] args) { String content = "中华人民共和国"; Analyzer analyzer = new PaodingAnalyzer(); TokenStream...tokenStream2 = analyzer.tokenStream("", new StringReader( content)); Token t; try {...while ((t = tokenStream2.next()) !
对于中文也可以用来剔除标点符号 public TokenStream tokenStream(String fieldName, Reader reader) { return new LowerCaseTokenizer...(reader); } SimpleAnalyzer的TokenStream就是调用了LowerCaseTokenizer的构造函数....除了调用基类的构造函数外(继承自Tokenizer), 另外还有下面两个与Attribute相关的语句, Attribute是Lucene新增的内容(具体是不是3.0新增的就不清楚了), 作用是可以在TokenStream
TokenStream即是从Document的域(field)中或者查询条件中抽取一个个分词而组成的一个数据流。...这些属性都保存在AttributeSource中,而AttributeSource正是TokenStream的父类。...TokenStream的工作流程: 1.实例化TokenStream, 添加属性到AttributeSource,或从AttributeSource中获取属性. 2.调用reset()方法,设置stream...TokenStream的作用是从给入的文本中不断解析出Token,具体的做法是TokenStream有方法incrementToken,每次调用 将产生待分析文本的下一个Token,其实incrementToken...,然后进行分析并填充 属性,这样做无可厚非,但是请考虑TokenStream流的嵌套,也就是说嵌套的内层流获取的属性将作为外层流的分析的输入,如果使用上述方法实现 TokenStream,则必然嵌套流的每层流都将有自己的属性实例
java.io.IOException; import org.apache.lucene.analysis.Token; import org.apache.lucene.index.Payload; /** * TokenStream...与分词器比较最大的区别是它的输入是另一个TokenStream.多个过滤器可以串接起来,形成管道型的流逝过滤器 * * NOTE:子类必须要重写next(Token). */ public...abstract class TokenStream { /** * 返回字节流的下一个Token...* 如果TokenStream缓存了Token,调用rest()会返回缓存的Token */ public void reset() throws IOException {
is another * TokenStream...all of the token {@link Attribute}s for the TokenStream...* The consumer calls {@link TokenStream#reset()}....* The {@code TokenStream}-API in Lucene is based on the decorator pattern....TokenStream() { super(); assert assertFinal(); } /** * A TokenStream that uses the
lucene3.0 lucene中有如下的类层次: org.apache.lucene.util.AttributeSource org.apache.lucene.analysis.TokenStream...Lucene中AttributeSource作为TokenStream父类的原因的 2.1 TokenStream的作用是从给入的文本中不断解析出Token,具体的做法是TokenStream有方法incrementToken...,每次调用将产生待分析文本的下一个Token,其实incrementToken做的事情就是填充我所关心的若干属性,通过这些属性来反馈分析结果,因此自然而然的一种想法是TokenStream的派生类中有若干的属性成员...,每次调用incrementToken都首先清除上一次的属性信息,然后进行分析并填充属性,这样做无可厚非,但是请考虑TokenStream流的嵌套,也就是说嵌套的内层流获取的属性将作为外层流的分析的输入...当我们将TokenStream所关心的属性抽象的由AttributeSource来管理时,我们在进行流的嵌套时,根据对AttributeSource的分析可知,外层流定义自己关心的属性,并不需要在构造函数中实例化该属性
Analyzer内部主要通过TokenStream类实现。Tonkenizer类、TokenFilter类是TokenStream的两个子类。...(2)public abstract TokenStream tokenStream(String fieldName, Reader reader); 该方法需要自定义的分词器去实现,并返回TokenStream...设置为可复用TokenStream,将同一线程中前面时间的TokenStream设置为可复用。那些无必要同一时刻使用多个TokenStream的调用者使用这个方法,可以提升性能。...(4)接着,在tokenStream()方法实现中使用Tonkenizer和TokenFilter,例如StandardAnalyzer类中的tokenStream实现: TokenStream result...,其输入是另一个TokenStream,主要职责是对TokenStream进行过滤,例如去掉一些索引词、替代同义索引词等操作。
StandardAnalyzer(Version.LUCENE_45); String str="I am come from jiangxi fengcheng tongtian . this is a dog"; TokenStream...ts=null; try { ts=sa.tokenStream("content", new StringReader(str)); CharTermAttribute cta=ts.addAttribute
Lucene使用IKAnalyzer分词时报错:”TokenStream contract violation: close() call missing” 解决办法是每次完成后必须调用关闭方法。...如果报错:java.lang.illegalstateexception: tokenstream contract violation: reset()/close() call missing,则要在...tokenStream.incrementToken(),原因是lucene从4.6.0开始tokenstream使用方法更改的问题,在使用incrementtoken方法前必须调用reset方法,详见...tokenStream = null; try { reader = new StringReader(text); tokenStream = analyzer.tokenStream...tokenStream.reset(); while (tokenStream.incrementToken()) { int startOffset
Schindler, Robert Muir) 以上信息可以知道,原来的通过的方法已经不可以提取响应的Token了 StringReader reader = new StringReader(s); TokenStream...ts =analyzer.tokenStream(s, reader); TermAttribute ta = ts.getAttribute(TermAttribute.class); 通过分析Api...文档信息 可知,CharTermAttribute已经成为替换TermAttribute的接口因此我编写了一个样例来更好的从TokenStream中提取Token package com.segment...String show(Analyzer a, String s) throws Exception { StringReader reader = new StringReader(s); TokenStream...ts = a.tokenStream(s, reader); String s1 = "", s2 = ""; boolean hasnext= ts.incrementToken();
tokenStream = new IKAnalyzer().tokenStream("keywords",new StringReader("思想者")); 3 //添加单词信息到...); 5 //重置,设置tokenstream的初始信息 6 tokenStream.reset(); 7 while(tokenStream.incrementToken...()) {//判断是否还有下一个Token 8 System.out.println(attribute); 9 } 10 tokenStream.end(); 11 tokenStream.close...(); 二.代码与原理分析 TokenStream用于访问token(词汇,单词,最小的索引单位),可以看做token的迭代器 1.如何获得TokenStream流 —->对应第一行代码 先获得TokenStreamComponents...,从他获得TokenStream(TokenStreamComponents内部封装了一个TokenStream以及一个Tokenizer,关于Tokenizer下面会具体讲) 可以看到主要是通过reuseStrategy
*/ public static void displayToken(String str,Analyzer a) { try { TokenStream...stream = a.tokenStream(“content”,new StringReader(str)); //创建一个属性,这个属性会添加流中,随着这个TokenStream...public static void displayAllTokenInfo(String str,Analyzer a){ try { TokenStream...stream = a.tokenStream(“content”,new StringReader(str)); //位置增量的属性,存储语汇单元之间的距离
分词器的核心类: Analyzer: 分词器 TokenStream: 分词器做好处理之后得到的一个流。...这个流中存储了分词的各种信息,可以通过TokenStream有效的获取到分词单元。...以下是把文件流转换成分词流(TokenStream)的过程 首先,通过Tokenizer来进行分词,不同分词器有着不同的Tokenzier,Tokenzier分完词后,通过TokenFilter对已经分好词的数据进行过滤...过滤完之后,把所有的数据组合成一个TokenStream;以下这图就是把一个reader转换成TokenStream: 这个TokenStream中存有一些属性,这些属性会来标识这个分词流的元素。...stream = a.tokenStream("content", new StringReader(str));// 放回一个TokenStream; /** * 创建一个属性,这个属性会添加到流里
public static void displayToken(String string, Analyzer analyzer) { try { // 通过分词器获取TokenStream...TokenStream tokenStream = analyzer.tokenStream("content", new StringReader(string));...// TokenStream是一种流,我们要获取流中的东西,就需要一个“碗”,我们将CharTermAttribute比作这个“碗” // 当TokenStream遍历的时候,这个...“碗”也跟着走,我们把“碗”放到流中就是方便获取流中的数据 CharTermAttribute charTermAttribute = tokenStream.addAttribute...(CharTermAttribute.class); while (tokenStream.incrementToken()) { System.out.print
概念 在编写过程宏时,经常需要对TokenStream 进行解析和处理。 而Syn库就是专门用于对TokenStream进行解析。...)->TokenStream{ let input = parse_macro_input!...)->TokenStream{ // 将ItemStruct => DeriveInput let input = parse_macro_input!..., input.ident.to_token_stream()); TokenStream::new() } 通过Syn生成语法树后,后面可用使用quote!...扩展改结构体 #[proc_macro_derive(Hello)] pub fn hello_derive(input: TokenStream)->TokenStream { let input
] pub fn attribute_macro(attr: TokenStream, item: TokenStream) -> TokenStream { // 宏的处理逻辑 //...use proc_macro::TokenStream; #[proc_macro_attribute] pub fn my_attribute(_attr: TokenStream, item: TokenStream...use proc_macro::TokenStream; #[proc_macro_attribute] pub fn my_function(attr: TokenStream, item: TokenStream...use proc_macro::TokenStream; #[proc_macro_attribute] pub fn my_struct(attr: TokenStream, item: TokenStream...use proc_macro::TokenStream; #[proc_macro_attribute] pub fn my_feature(_attr: TokenStream, item: TokenStream
于是我去翻找源码,发现 public TokenStream GetTokenStream(string fieldName, TextReader reader) {...这里,我们可以了解一下,Analyzer的内部.函数 GetTokenStream 是返回Analyzer中的TokenStream,TokenStream是一系列Token的集合。...先不细究TokenStream的具体作用,因为会花很多的篇幅去说。而获取TokenStream 的关键就在reuseStrategy 。...在新版本的Lucene中,Analyzer中TokenStream是可以重复使用的,即在一个线程中建立的Analyzer实例,都共用TokenStream。...return components.TokenStream; } 所以我们在调用Analyzer的时候,Analyzer
thread "main" java.lang.VerifyError: class org.wltea.analyzer.lucene.IKAnalyzer overrides final method tokenStream...(Ljava/lang/String;Ljava/io/Reader;)Lorg/apache/lucene/analysis/TokenStream; 解决:笔者有试着将IKAnlyzer项目的...tokenStream = analyzer.tokenStream("", new StringReader(testData)); tokenStream.addAttribute...()) { TermAttribute termAttribute = tokenStream.getAttribute(TermAttribute.class);...ts = analyzer.tokenStream("", new StringReader(testData)); System.out.println("分词数据:"+testData
,获取TokenStream的方法是由reuseStrategy 类提供的,TokenStream 继承自AttributeSource 那么TokenStream的作用什么呢?...TokenStream的工作流程: 1....创建TokenStream 2.TokenStream.Reset() 3.TokenStream.IncrementToken() 4.TokenStream.End(); ...再回到之前,再初始化TokenStream 和添加完属性之后,必须执行TokenStream的Reset(),才可继续执行TokenStream.IncrementToken()....Reset()函数实际上在TokenStream创建和使用之后进行重置,因为我们之前说过,在Analyzer中所有实例是共用一个TokenStream的所以在TokenStream被使用过一次后,需要Reset
领取专属 10元无门槛券
手把手带您无忧上云