lucene定义自己的分词器将其分成单个字符

lucene定义自己的分词器将其分成单个字符

大家好,又见面了,我是全栈君。

问题描写叙述:将一句话拆分成单个字符。而且去掉空格。

package com.mylucene;

import java.io.IOException;
import java.io.Reader;

import org.apache.lucene.analysis.Tokenizer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
import org.apache.lucene.util.AttributeSource.AttributeFactory;

public class SpiltChar extends Tokenizer {
	
	 public SpiltChar(AttributeFactory factory, Reader input) {
		super(factory, input);
		// TODO Auto-generated constructor stub
	}

	public SpiltChar(Reader input) {
	      super(input);
	    }
	    private int offset = 0, bufferIndex=0, dataLen=0;
	    private final static int MAX_WORD_LEN = 255;
	    private final static int IO_BUFFER_SIZE = 1024;
	    private final char[] buffer = new char[MAX_WORD_LEN];
	    private final char[] ioBuffer = new char[IO_BUFFER_SIZE];
	    private int length;
	    private int start;
	    private final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class);
	    private final OffsetAttribute offsetAtt = addAttribute(OffsetAttribute.class);
	    private final void push(char c) {
	        if (length == 0) start = offset-1;            // start of token
	        buffer[length++] = Character.toLowerCase(c);  // buffer it

	    }

	    private final boolean flush() {

	        if (length>0) {
	            //System.out.println(new String(buffer, 0,
	            //length));
	          termAtt.copyBuffer(buffer, 0, length);
	          offsetAtt.setOffset(correctOffset(start), correctOffset(start+length));
	          return true;
	        }
	        else
	            return false;
	    }

	    @Override
	    public boolean incrementToken() throws IOException {
	        clearAttributes();

	        length = 0;
	        start = offset;
	        while (true) {
	            final char c;
	            offset++;
	            if (bufferIndex >= dataLen) {
	                dataLen = input.read(ioBuffer);
	                bufferIndex = 0;
	            }

	            if (dataLen == -1) {
	              offset--;
	              return flush();
	            } else
	                c = ioBuffer[bufferIndex++];

	            switch(Character.getType(c)) {

	            case Character.DECIMAL_DIGIT_NUMBER://注意此部分只是滤一些熟悉或者字母
	            case Character.LOWERCASE_LETTER://注意此部分
	            case Character.UPPERCASE_LETTER://注意此部分
//	                push(c);
//	                if (length == MAX_WORD_LEN) return flush();
//	                break;
	         
	            case Character.OTHER_LETTER:
	                if (length>0) {
	                    bufferIndex--;
	                    offset--;
	                    return flush();
	                }
	                push(c);
	                return flush();

	            default:
	                if (length>0) return flush();
	            	 
		                break;
	                
	            }
	        }
	    }
	    
	    @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 = bufferIndex = dataLen = 0;
	    }

}

定义自己的分词器类:

package com.mylucene;

import java.io.Reader;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.Tokenizer;

/**
 * 单字切分
 * **/
public class SpiltCharAnalyzer extends Analyzer {

	@Override
	protected TokenStreamComponents createComponents(String arg0, Reader arg1) {
	   
		Tokenizer token=new SpiltChar(arg1);
		
		return new TokenStreamComponents(token);
	}
	
	
	
	

}


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

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

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


相关推荐

  • c语言中malloc的作用,malloc函数-malloc函数,详解

    c语言中malloc的作用,malloc函数-malloc函数,详解本教程分享:《malloc函数》,c语言malloc函数是什么意义开辟内存。比如int*p;p=(int*)malloc(100*sizeof(int));它开辟100个int单元,即400字节。然后p指向第一个元素。之后也可以用p[0],p[1]malloc函数怎么使用malloc函数怎么使用,具体是什么含义啊,请详细讲解需要包含头文件:#include或#include函数声明(函…

    2022年5月29日
    65
  • 路径规划-人工势场法(Artificial Potential Field)

    路径规划-人工势场法(Artificial Potential Field)人工势场法是局部路径规划的一种比较常用的方法。这种方法假设机器人在一种虚拟力场下运动。1.简介如图所示,机器人在一个二维环境下运动,图中指出了机器人,障碍和目标之间的相对位置。这个图比较清晰的说明了人工势场法的作用,物体的初始点在一个较高的“山头”上,要到达的目标点在“山脚”下,这就形成了一种势场,物体在这种势的引导下,避开障碍物,到达目标点。人工势场包括引力场合斥力场,其中目标点对物体产生引力,引导物体朝向其运动(这一点有点类似于A*算法中的启发函数h)。障碍物对物体产生斥力,..

    2022年6月22日
    44
  • 解决Navicat for MySQL 连接 Mysql 8.0.11 出现1251- Client does not support authentication protocol 错误

    解决Navicat for MySQL 连接 Mysql 8.0.11 出现1251- Client does not support authentication protocol 错误今天在电脑上安装了Mysql8.0.11,然后又屁颠屁颠地安装了NavicatforMySQL,打开Navicat准备链接数据库的时候出现了如下提示:上网搜索解决方案,网上说出现这种情况的原因是:mysql8之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password,解决问题方法有两种:方法…

    2022年5月30日
    42
  • centos搭建python环境_centos安装python

    centos搭建python环境_centos安装pythoncentos安装python环境查看系统自带版本查看系统自带版本位置下面介绍安装Python3的方法下载python包解压安装包创建软链接升级pip测试python3由于centos7原本就安装了Python2,而且这个Python2不能被删除,因为有很多系统命令,比如yum都要用到。查看系统自带版本输入Python命令,查看可以得知是Python2.7.5版本查看系统自带版本位置whichpython一般是位于/usr/bin/python目录下。下面介绍安装Python3的方法

    2022年4月20日
    47
  • [Java 8] (6) Lambda与资源管理

    [Java 8] (6) Lambda与资源管理

    2022年1月23日
    49
  • datax(4): datax.py解读

    datax(4): datax.py解读datax直接使用py文件进行任务提交,今天读一读它1文件位置原始文件位置在xx/DataX/core/src/main/bin/下,datax项目打包后会将文件拷贝到xx/DataX\target\datax\datax\bin下。core模块的pom.xml指定‘拷贝’datax.py文件的方式maven-assembly-plugin<plugin><artifactId>maven-asse.

    2022年5月13日
    98

发表回复

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

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