lucene中的Token, TokenStream, Tokenizer, Analyzer

转载地址:http://ybzshizds.iteye.com/blog/562794

Token: 如果一个字段被token化,这表示它经过了一个可将内容转化为tokens串的分析程序。 Token是建立索引的基本单位,表示每个被编入索引的字符。 在token化的过程中,分析程序会在使用任何转换逻辑(例如去掉 "a” 或 "the" 这类停用词,执行词干搜寻,将无大小写区分的所有文字转换成小写等)的同时,抽取应被编入索引的文本内容。由于和字段相关的内容减少到只剩核心元素,因此,索引作为与某个字段相关的文字内容,它的规模也被缩小了。只有被token化的字段也将被编入索引的情况下才有意义。 对Akamai.com来说,“标题”被token化,所以Lucene不用搜寻如 "a" 或 "the" 这类单词。

public final class Token {
  String termText;      // the text of the term
  int startOffset;      // start in source text
  int endOffset;        // end in source text
  String type = "word"; // lexical type

  private int positionIncrement = 1;

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

  public Token(String text, int start, int end, String typ)

  public void setPositionIncrement(int positionIncrement)

  public int getPositionIncrement() { return positionIncrement; }

  public final String termText() { return termText; }

  public final int startOffset() { return startOffset; }

  public void setStartOffset(int givenStartOffset)

  public final int endOffset() { return endOffset; }

  public void setEndOffset(int givenEndOffset)

  public final String type() { return type; }

  public String toString()

 }


TokenStream是用来走访Token的iterator(迭代器) 

public abstract class TokenStream {
  public abstract Token next() throws IOException;
  public void close() throws IOException {}
}
Tokenizer继承自TokenStream,其输入为Reader

public abstract class Tokenizer extends TokenStream {
  protected Reader input;
  protected Tokenizer() {}
  protected Tokenizer(Reader input) {
    this.input = input;
  }

  public void close() throws IOException {
    input.close();
  }
}

TokenFilter继承自TokenStream,其作用是用来完成对TokenStream的过滤操作,譬如 
去StopWords,将Token变为小写等
public abstract class TokenFilter extends TokenStream {
  protected TokenStream input;
  protected TokenFilter() {}
  protected TokenFilter(TokenStream input) {
    this.input = input;
  }

  public void close() throws IOException {
    input.close();
  }
}

Analyzer就是一个TokenStream工厂 

public abstract class Analyzer { 
  public TokenStream tokenStream(String fieldName, Reader reader){
      return tokenStream(reader);
  }

  public TokenStream tokenStream(Reader reader){
      return tokenStream(null, reader);
  }
}

Analyzer的作用就是把文本分解为便于Lucene处理的token,好比人体的肠道,负责把食物分解成易于吸收的小块。

Query query = new QueryParser(Version.LUCENE_36,"text",analyzer).parse(nameen.trim());
这个是lucene内部先对 nameen进行分词,比如按空格之内的,然后分词之后的结果任意一个被包含于text字段里面的内容,那么该条记录就被选中
例如:

Hybrid safflower (Carthamus tinctorius) oil 

分词为:

+(text:hybrid text:safflower text:carthamus text:tinctorius text:oil) -id:246281


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值