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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 毕业三年「建议收藏」

    如约而至,一年一度的“毕业N年”系列,2018,毕业三年了。生活这一年生活轨迹变化很大,也清晰了很多。去年底在家里买了房,跟女朋友定了亲,接下来可能就只剩到哪里定居的问题了。学会了做饭,本以为做饭很麻烦,其实逛逛菜市场做做饭,比想象中简单自在多了,很多喜欢吃的东西都可以自己做来试试看,没想到的是,大肠吃着那么香,做起来那么臭,还用一个锅的教训,知道了不粘锅竟然不能用来炸东西。工…

    2022年3月11日
    32
  • 安卓原生镜像(中国网站)「建议收藏」

    安卓原生镜像(中国网站)「建议收藏」安卓原生镜像(谷歌中国站)找了半天百度,好不容易看到,赶紧收藏起来:原生安卓包:https://developers.google.cn/android/images?h1=zh=cn#angler

    2022年6月19日
    31
  • IDEA2019.2.4从安装到卸载

    IDEA最近不知怎么了,更新后各种问题。从2019.2.X开始就各种问题,最近出新版本了,然后下载尝试了下,发现maven依然很多问题。最终只能重新安装旧版(2019.1.4)。新版本表现的症状有,maven无提醒,CPU占用率高…

    2022年3月13日
    52
  • 揭开IT基础架构综合管理平台软件的面纱

    揭开IT基础架构综合管理平台软件的面纱

    2021年7月27日
    57
  • 太极图正确画法_来氏太极图的画法及六行太极图的演示

    太极图正确画法_来氏太极图的画法及六行太极图的演示本来,我已打算停中发文,但是这一篇涉及到我一个重要的思想,这就是我对明代来知德的“来氏太极图”有了重要的理解,我根据它形成了我的六行太极理论,于是我还是决定把它公布出来。我尝试很多办法把水火金木土风的六行的元素融入到太极图中,它既要能符合太极的原理,又要能符合六行的原理,但又要使用它最简单化,可始终无果,有一天,我看到了明代理学家来知德的《来瞿唐先生圆图》,忽然恍然大悟,来瞿唐先生的“来氏太极图”…

    2022年5月27日
    61
  • 深度学习与图像处理之:人像背景虚化

    深度学习与图像处理之:人像背景虚化

    2021年6月13日
    127

发表回复

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

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