当前位置: 首页 > news >正文

自己写Lucene分词器示例篇——写一个简单点额分析器

介绍lucene的一个简单的分析器实现,基于4.x。这个分析器的示例,abcd分词为a,ab,abc,abcd。是用在联系人,文章名称,应用名称等搜索建议上的。用户输入前几个字或者前几个拼音,就能显示出建议的结果。比如,在联系人里面搜liug,就能提示你有刘刚,刘钢等联系人,这个需要一个字符一个字符的切割。源码在github上,点击打开链接。

一:类

只有3个类,主类和Toknizer工厂和Tokenizer


1.PrefixAnalyzer,因为没有过滤器,所以直接只用tokenizer来处理就可以了

public final class PrefixAnalyzer extends Analyzer {

      @Override
      protected TokenStreamComponents createComponents(String fieldName,
          Reader reader) {
        final Tokenizer source = new PrefixTokenizer(reader);
        return new TokenStreamComponents(source);
      }
  }

2.PrefixTokenizer,只需要要把输入的字符从0开始到1到length一个个切开,存储就可以了

public final class PrefixTokenizer extends Tokenizer {


    public PrefixTokenizer(Reader in) {
      super(in);
    }

    public PrefixTokenizer(AttributeSource source, Reader in) {
      super(source, in);
    }

    public PrefixTokenizer(AttributeFactory factory, Reader in) {
      super(factory, in);
    }
       
    private int offset = 0, dataLen=0;
    private final static int MAX_WORD_LEN = 255;
    private final static int IO_BUFFER_SIZE = 1024;
    private final char[] ioBuffer = new char[IO_BUFFER_SIZE];


    private final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class);
    private final OffsetAttribute offsetAtt = addAttribute(OffsetAttribute.class);
    
    @Override
    public boolean incrementToken() throws IOException {
        clearAttributes();

            //读取输入流,当处理完一次输入流后,在读输入流datalen就等于-1
            if (offset >= dataLen) {
                dataLen = input.read(ioBuffer);
                offset = 0;
            }

            if (dataLen == -1 || dataLen > MAX_WORD_LEN) {
               return false;
            }  
            //偏移量加一,写入索引词典
            offset++;
            termAtt.copyBuffer(ioBuffer, 0, offset);
            offsetAtt.setOffset(correctOffset(0), correctOffset(offset));
            return true;
    }
    
    @Override
    public final void end() {
      // set final offset
      final int finalOffset = correctOffset(offset);
      this.offsetAtt.setOffset(finalOffset, finalOffset);
    }

    @Override
    public void reset() throws IOException {
      super.reset();
      offset = dataLen = 0;
    }
}


相关文章:

  • java中的接口和抽象类是什么?
  • 并查集专题【完结】
  • Apache配置优化
  • hdu1010 Tempter of the Bone 成长---纠错
  • lucene 4.x中如何只存储不做索引
  • Win32_8有意思的程序——抓取屏幕
  • php调试和日志记录函数
  • Android实战技术:IPC方式简介教程
  • SICP 习题(1.1,1.2,1.3,1.4)解题总结。
  • linux终端开发环境的配置
  • ADO.NET理论+实践
  • Android实战技术:深入理解Android的RPC方式与AIDL
  • Linux调试器工作原理——基础篇
  • Linux调试器工作原理之二——实现断点
  • 学ACM有用吗?
  • 30天自制操作系统-2
  • Java程序员幽默爆笑锦集
  • js写一个简单的选项卡
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • MQ框架的比较
  • React中的“虫洞”——Context
  • Sass Day-01
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 使用Swoole加速Laravel(正式环境中)
  • 跳前端坑前,先看看这个!!
  • 硬币翻转问题,区间操作
  • 栈实现走出迷宫(C++)
  • C# - 为值类型重定义相等性
  • ​如何防止网络攻击?
  • ​什么是bug?bug的源头在哪里?
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (LeetCode) T14. Longest Common Prefix
  • (补)B+树一些思想
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (九)One-Wire总线-DS18B20
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (一)SpringBoot3---尚硅谷总结
  • (一一四)第九章编程练习
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (正则)提取页面里的img标签
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • ****Linux下Mysql的安装和配置
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .net(C#)中String.Format如何使用
  • .NET/C# 获取一个正在运行的进程的命令行参数