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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 获取程序自身窗口句柄(cmd)

    获取程序自身窗口句柄(cmd)HWNDGetConsoleHwnd(void){#defineMY_BUFSIZE1024//Buffersizeforconsolewindowtitles.HWNDhwndFound;//Thisiswhatisreturnedtothecaller.charpszNewWindowTitle[MY_BUFS…

  • mysql语句拼接字符串_C语言字符串输入及输出的几种方式

    mysql语句拼接字符串_C语言字符串输入及输出的几种方式MySQL字符串拼接可以使多个字段的值组成一个集合,不仅可以拼接字符串与字符串、空格、特殊符号甚至可以拼接中文文本,方便我们在不同场景下应用。本教详细讲解`CONCAT()`和它的扩展形式`CONCAT_WS()`在字符串拼接的实战场景中的应用。如果你的应用场景需要周期性重复展示,推荐使用卡拉云将你的代码工具化,详情见本文文末。

  • mybatiscodehelperpro2.8.3激活码_navicat premium激活

    mybatiscodehelperpro2.8.3激活码_navicat premium激活目录一、前言二、安装插件MyBatisCodeHelperPro插件三、激活一、前言在开发中编写生成bean,mapper,mapper.xml即费时也费力,可以通过MyBatisCodeHelperPro自动生成bean,dao,mapper.xml等文件,然后根据自己的需要进行修改。MyBatisCodeHelperPro是IDEA下的一个插件,类似于mybatisplugin,但是是收费的,但可以进行激活使用:下面这个大佬的个人主页上有多个版本的下载链…

  • SQL Server2000安全设置内容

    SQL Server2000安全设置内容

  • 异或和与运算_逻辑异或运算规则

    异或和与运算_逻辑异或运算规则异或,是一个数学运算符,英文为exclusiveOR,缩写为xor,应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。其运算法则为:a⊕b=(¬a∧b)∨(a

  • android 锁屏壁纸时钟,桌面锁屏时钟下载-桌面锁屏时钟app安卓版v2.8.0-七度网「建议收藏」

    android 锁屏壁纸时钟,桌面锁屏时钟下载-桌面锁屏时钟app安卓版v2.8.0-七度网「建议收藏」桌面锁屏时钟app是一款非常便捷的桌面锁屏时钟软件,桌面锁屏时钟app支持横屏竖屏自由切换,附带普通模式和沉浸模式,可以设置自己的日程提醒安排,桌面锁屏时钟app可以自己设置天气温度显示和背景皮肤,让用户清楚的知道时间。桌面锁屏时钟app特色1.你可以通过APP快速的了解当前的时间信息。2.添加每天的闹钟提醒以后,就可以让自己准时的起床了。3.在APP中设置自己的日程提醒安排,让APP提醒您不忘记…

发表回复

您的电子邮箱地址不会被公开。

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