RSS
热门关键字:  数据挖掘  人工智能  数据仓库  搜索引擎  数据挖掘导论

全文检索引擎Lucene源码分析-analysis包

来源: 作者:互联网作品 时间:2007-04-12 点击:

我的毕业设计是基于全文检索引擎工具包Luncene的analysis包而实现的,期间查看了该包的源码并作了一些分析,现在贴出来以供参考。

  注:这里分析的只是analysis包的一些基本类,而不是全部。

  1、Token类: 数据挖掘研究院

  package org.apache.lucene.analysis;

  public final class Token{ 数据挖掘实验室

  String termText;  // 词项文本(the text of the term)

  int startOffset;  // Token在源文本中的起始位置(start in source text)

数据挖掘研究院

  int endOffset;  // Token在源文本中的结束位置(end in source text)

  String type = "word"; //~ Token的词类型,默认是"word"(lexical type, default is "word") 数据挖掘研究院

  //: 附:lexical type:

数据挖掘研究院

  //: single => ASCII 数据挖掘研究院

  //: double => non-ASCII 数据挖掘研究院

  //: word   => default

  private int positionIncrement = 1; // 位移增量,即TokenStream里当前Token与

  //  先前某一个Token之间的位移差,默认为1 数据挖掘实验室

  //~ 第一个构造器 数据挖掘研究院

  public Token(String text, int start, int end){ 数据挖掘实验室

  termText = text;

数据挖掘研究院

  startOffset = start;

  endOffset = end;

数据挖掘研究院

  } 数据挖掘研究院

  //~ 第二个构造器 数据挖掘研究院

  public Token(String text, int start, int end, String type){

  termText = text; 数据挖掘研究院

  startOffset = start; 数据挖掘研究院

  endOffset = end;

数据挖掘研究院

  this.type = type;

  } 数据挖掘研究院

  //~ 设置位移增量方法 数据挖掘实验室

  public void setPositionIncrement(int positionIncrement){ 数据挖掘实验室

  if( positionIncrement < 0 ) 数据挖掘研究院

  throw new IllegalArgumentException( 数据挖掘研究院

  "Increment must be zero or greater: " + positionIncrement);

  this.positionIncrement = positionIncrement; 数据挖掘研究院

  }

数据挖掘研究院

  //~ 获取位移增量

数据挖掘研究院

  public int getPositionIncrement() { return positionIncrement; } 数据挖掘实验室

  //~ 获取词项文本 数据挖掘实验室

  public final String termText() { return termText; } 数据挖掘研究院

  //~ 获取Token的起始位置

  public final int startOffset() { return startOffset; }

  //~ 获取Token的结束位置 数据挖掘实验室

  public final int endOffset() { return endOffset; }

  //~ 获取Token的词类型

  public final String type() { return type; }

数据挖掘研究院

  //~ 重载基类(Object)的toString()方法 数据挖掘研究院

  public final String toString(){ 数据挖掘实验室

  StringBuffer sb = new StringBuffer(); 数据挖掘研究院

  sb.append("(" + termText + ", " + startOffset + ", " + endOffset);

数据挖掘研究院

  if( !type.equals("word") )

数据挖掘研究院

  sb.append(", type=" + type); 数据挖掘研究院

  if( positionIncrement != 1 ) 数据挖掘研究院

  sb.append(", posIncr=" + positionIncrement);

数据挖掘研究院

  sb.append(")"); 数据挖掘研究院

  return sb.toString(); 数据挖掘研究院

  } 数据挖掘研究院

  } ///:~ 数据挖掘研究院

  2、TokenStream类: 数据挖掘研究院

  package org.apache.lucene.analysis;

  import java.io.IOException; 数据挖掘研究院

  /** 数据挖掘研究院

  * 一个TokenStream是枚举tokens的序列,或者从文档的字段、查询文本枚举的序列流

数据挖掘研究院

  * <p> 数据挖掘研究院

  * 这是一个抽象类,具体子类是:

  * <ul>

数据挖掘研究院

  * <li>{@link Tokenizer}, 一个输入参数是一个Reader对象的TokenStream 数据挖掘研究院

  * <li>{@link TokenFilter}, 一个输入参数是另外一个TokenStream对象的TokenStream

数据挖掘研究院

  * </ul> 数据挖掘实验室

  */

数据挖掘研究院

  public abstract class TokenStream {

数据挖掘研究院

  /** 返回流中的下一个Token,或者在遇到EOS时返回null */

数据挖掘实验室

  public abstract Token next() throws IOException; 数据挖掘研究院

  /** 用这个流发布分配的资源 */ 数据挖掘研究院

  public void close() throws IOException {} 数据挖掘研究院

  } ///:~ 数据挖掘研究院

  3、Tokenizer类: 数据挖掘实验室

  package org.apache.lucene.analysis;

  import java.io.Reader;

  import java.io.IOException; 数据挖掘实验室

  /** 数据挖掘实验室

  * 一个Tokenizer是输入参数是一个Reader的TokenStream。 数据挖掘研究院

  * <p>

  * 这是一个抽象类。

数据挖掘研究院

  */ 数据挖掘研究院

  public abstract class Tokenizer extends TokenStream {

  /** Tokenizer的文本源 */

  protected Reader input;

  /** 默认构造器,无参数输入 */

  protected Tokenizer() {}

  /** 输入参数是一个Reader对象引用的构造器,输入的input就是待处理的源文本 */ 数据挖掘研究院

  protected Tokenizer(Reader input) {

  this.input = input;

数据挖掘研究院

  }

  /** 默认关闭输入Reader对象 */ 数据挖掘实验室

  public void close() throws IOException {

  input.close();

  }

  } ///:~ 数据挖掘研究院

  4、TokenFilter类: 数据挖掘实验室

  package org.apache.lucene.analysis;

数据挖掘研究院

  import java.io.IOException;

  /**

数据挖掘实验室

  * 一个TokenFilter是一个输入参数是另外一个TokenStream的TokenStream。

  * <p> 数据挖掘实验室

  * 这是一个抽象类。 数据挖掘实验室

  */ 数据挖掘研究院

  public abstract class TokenFilter extends TokenStream { 数据挖掘研究院

  /** 该Filter的源Tokens */

数据挖掘研究院

  protected TokenStream input;

  /**

数据挖掘研究院

  *  已由TokenFilter(TokenStream)替代

数据挖掘研究院

  * @deprecated

  */ 数据挖掘研究院

  protected TokenFilter() {} 数据挖掘实验室

  /** 构造器,输入参数是一个待过滤的TokenStream对象 */ 数据挖掘研究院

  protected TokenFilter(TokenStream input) {

数据挖掘研究院

  this.input = input; 数据挖掘实验室

  } 数据挖掘研究院

  /** 关闭输入TokenStream */ 数据挖掘研究院

  public void close() throws IOException { 数据挖掘研究院

  input.close(); 数据挖掘研究院

  } 数据挖掘研究院

  } ///:~

  5、Analyzer类 数据挖掘研究院

  package org.apache.lucene.analysis; 数据挖掘研究院

  import java.io.Reader;

  /** 数据挖掘研究院

  * 一个分析器用于建立用来分析文本的TokenStreams,这样它就可以描述一个从文本中析取索引词项的策略

  * <p> 数据挖掘研究院

  * 典型的实现是:首先建立一个Tokenizer,它将打碎字符流,使之从输入时的Reader对象流变成一个个未作 数据挖掘研究院

  * 进一步加工的Token。然后,一个或者多个TokenFilter可能会被应用于Tokenizer的输出 数据挖掘实验室

  * <p> 数据挖掘研究院

  * 警告:你必须在你的子类中重载由该类定义的方法中的一个,否则分析器将会陷入无穷循环。 数据挖掘实验室

  */

  public abstract class Analyzer { 数据挖掘研究院

  /** 数据挖掘研究院

  * 创建一个TokenStream,该TokenStream标记提供的Reader中的所有文本。

数据挖掘研究院

  * 默认实现前向tokenStream(Reader)是为了兼容旧版本。 数据挖掘研究院

  * 重载允许分析器选择基于文档以及/或者字段的策略。

数据挖掘研究院

  * 为了向后兼容,务必能够处理null字段名。

数据挖掘研究院

  */

  public TokenStream tokenStream(String fieldName, Reader reader) {

  //: 为了实现向后兼容 数据挖掘实验室

  return tokenStream(reader); 数据挖掘实验室

  }

数据挖掘实验室

  /** 数据挖掘研究院

  * 创建一个TokenStream,该TokenStream标记提供的Reader中的所有文本。 数据挖掘研究院

  * 仅是为了向后兼容而提供。 数据挖掘研究院

  * @deprecated 用 tokenStream(String, Reader) 替代 数据挖掘实验室

  * @see #tokenStream(String, Reader) 数据挖掘研究院

  */

数据挖掘研究院

  public TokenStream tokenStream(Reader reader) { 数据挖掘研究院

  return tokenStream(null, reader); 数据挖掘实验室

  }

数据挖掘研究院

  /**

  * 如果词项已经被加到某个字段,则在索引该字段实例之前调用。

数据挖掘实验室

  * 这允许定制分析器以便在使用相同字段名的字段实例之间放置一个自动位移增量间隔。 数据挖掘实验室

  * 默认位移增量间隔值为0.拥有一个0值位移增量间隔和典型的默认token位移增量1, 数据挖掘研究院

  * 所有一个字段中的词项,包括字段实例间的词项都会连成一串,这允许精确词组查询匹配,

数据挖掘研究院

  * 而实例则可跨越字段实例边界。 数据挖掘研究院

  * @param fieldName 被索引的字段名

数据挖掘研究院

  * @return 位移增量间隔,被加到从{@link #tokenStream(String, Reader)}发出的下一个token。

  */

数据挖掘研究院

  public int getPositionIncrementGap(String fieldName) { 数据挖掘研究院

  return 0;

  } 数据挖掘研究院

  } ///:~

最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
匿名?