Lucene 3.0.0 的TokenStream与Analyzer

Lucene 3.0.0 的TokenStream与Analyzer如果你看的Lucene相关的书是很老版本的,比如说2.4或者更早,那么对于这个版本中的Analyzer可能就不那么容易接受了,我也是看的<lucene分析与应用>这本书,比较古老的版本.今天读了一下源代码,大概说说心得,我从SimpleAnalyzer说起.SimpleAnalyzer的作用就是把一段字符串中除了符号和非文字的内容作为分…

大家好,又见面了,我是你们的朋友全栈君。

     如果你看的Lucene相关的书是很老版本的, 比如说2.4或者更早, 那么对于这个版本中的Analyzer可能就不那么容易接受了, 我也是看的<lucene分析与应用>这本书, 比较古老的版本.

     今天读了一下源代码, 大概说说心得, 我从SimpleAnalyzer说起.

     SimpleAnalyzer的作用就是把一段字符串中除了符号和非文字的内容作为分隔, 把句子分成很多的单词. 对于中文也可以用来剔除标点符号

public TokenStream tokenStream(String fieldName, Reader reader) {
    
    
  return new LowerCaseTokenizer(reader);
}

     SimpleAnalyzer的TokenStream就是调用了LowerCaseTokenizer的构造函数. LowerCaseTokenizer继承自CharTokenizer. 首先来看看CharTokenizer的构造函数吧:

public CharTokenizer(Reader input) {
    
    
  super(input);
  offsetAtt = addAttribute(OffsetAttribute.class);
  termAtt = addAttribute(TermAttribute.class);
}

     除了调用基类的构造函数外(继承自Tokenizer), 另外还有下面两个与Attribute相关的语句, Attribute是Lucene新增的内容(具体是不是3.0新增的就不清楚了), 作用是可以在TokenStream中加入一些用户需要的内容, 比如说单词的词性, 文字等等内容, 这些东西是可以用户定义的, 提供了更多的耦合性, 怎么访问这些内容我上一篇日志也是有说的.

     下面我把CharTokenizer的incrementToken()函数的代码贴出来分析一下

public final boolean incrementToken() throws IOException {
    
    
  clearAttributes();
  int length = 0;
  int start = bufferIndex;
  char[] buffer = termAtt.termBuffer();
  while (true) {
    
    
 
    if (bufferIndex >= dataLen) {
    
    
      offset += dataLen;
      dataLen = input.read(ioBuffer);
      if (dataLen == -1) {
    
    
        dataLen = 0;                            // so next offset += dataLen won't decrement offset
        if (length > 0)
          break;
        else
          return false;
      }
      bufferIndex = 0;
    }
 
    final char c = ioBuffer[bufferIndex++];
 
    if (isTokenChar(c)) {               // if it's a token char
 
      if (length == 0)                 // start of token
        start = offset + bufferIndex - 1;
      else if (length == buffer.length)
        buffer = termAtt.resizeTermBuffer(1+length);
 
      buffer[length++] = normalize(c); // buffer it, normalized
 
      if (length == MAX_WORD_LEN)      // buffer overflow!
        break;
 
    } else if (length > 0)             // at non-Letter w/ chars
      break;                           // return 'em
  }
 
  termAtt.setTermLength(length);
  offsetAtt.setOffset(correctOffset(start), correctOffset(start+length));
  return true;
}

     在一个Tokenizer里面将保留这多个Attribute的实例, 这些实例是循环利用的, 每新得到一个单词, 就改写一下他们的内容,

1)

if (bufferIndex >= dataLen) {
    
    
  offset += dataLen;
  dataLen = input.read(ioBuffer);
  if (dataLen == -1) {
    
    
    dataLen = 0;                            // so next offset += dataLen won't decrement offset
    if (length > 0)
      break;
    else
      return false;
  }
  bufferIndex = 0;
}

这段代码是初始化的内容, 得到整个字符串的长度, ioBuffer就是这个字符串

2)

final char c = ioBuffer[bufferIndex++];
 
if (isTokenChar(c)) {               // if it's a token char
 
  if (length == 0)                 // start of token
    start = offset + bufferIndex - 1;
  else if (length == buffer.length)
    buffer = termAtt.resizeTermBuffer(1+length);
 
  buffer[length++] = normalize(c); // buffer it, normalized
 
  if (length == MAX_WORD_LEN)      // buffer overflow!
    break;
 
} else if (length > 0)             // at non-Letter w/ chars
  break;                           // return 'em

这段代码是不停的读取下一个字符, 看看是符号还是合法的字符.

3)

termAtt.setTermLength(length);
offsetAtt.setOffset(correctOffset(start), correctOffset(start+length));
return true;

最后把单词的termAtt和offsetAtt赋值, 返回

转载于:https://www.cnblogs.com/LeftNotEasy/archive/2010/01/17/1650139.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163122.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Kafka 删除topic_kafka自动创建topic

    Kafka 删除topic_kafka自动创建topic2019独角兽企业重金招聘Python工程师标准>>>…

    2022年10月16日
    7
  • C/C++ int数组初始化

    C/C++ int数组初始化一、一维数组C/C++初始化静态数组intarray[100]; //定义了数组array,但并未对数组初始化;静态数组intarray[100]={0}; //定义了数组array,并将数组元素全部初始化为0;静态数组intarray[100]={1}; //定义了数组array,并将数组第一个元素初始化为1,后面99个元素初始化为0;静态数组intarr…

    2022年7月18日
    93
  • UFT12.02安装包

    UFT12.02安装包http://pan.baidu.com/s/1sjrz4gX

    2022年5月28日
    35
  • 51单片机按键控制步进电机加减速及正反转

    51单片机按键控制步进电机加减速及正反转之前尝试用单片机控制42步进电机正反转,电机连接导轨实现滑台前进后退,在这里分享一下测试程序及接线图,程序部分参考网上找到的,已经实际测试过,可以实现控制功能。所用硬件:步进电机及驱动器、STC89C52单片机、直流电源1、硬件连接图注意:上图为共阳极接法,实际连接参考总体线路连接。 驱动器信号端定义:PUL+:脉冲信号输入正。(C…

    2022年6月1日
    141
  • hadoop namenode热备切换过程和secondarynamenode的作用

    hadoop namenode热备切换过程和secondarynamenode的作用hadoop namenode热备切换过程和secondarynamenode的作用

    2022年4月23日
    60
  • 有感FOC算法学习与实现总结「建议收藏」

    有感FOC算法学习与实现总结「建议收藏」`FieldOrientedControl`磁场定向控制(`FOC`),`FOC`是有效换向的公认方法。`FOC`的核心是估计转子电场的方向。一旦估计了转子的电角度,就将电动机的三相换相,以使定子磁场垂直于转子磁场。本文参考了`TI`,`microchip`的相关文档,基于`STM32F103`系列单片机实现了带编码器的`FOC`算法,实现了对通用伺服电机(表贴式`PMSM`)的控制。

    2022年6月21日
    120

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号