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


相关推荐

  • python—whl文件介绍与安装

    python—whl文件介绍与安装在安装whl文件之前,我们需要先搞清楚什么是whl文件,whl格式本质上是一个压缩包,里面包含了py文件,以及经过编译的pyd文件。使得可以在不具备编译环境的情况下,选择合适自己的python环境进行安装。在Win7下安装whl文件,可以直接使用pip命令:pipinstallMySQL_python-1.2.5-cp36-none-win32.whl(1)虽然大多数情况下,…

    2022年5月30日
    82
  • python中merge函数「建议收藏」

    python中merge函数「建议收藏」merge函数用来合并下面我们看看长什么样子merge(left,right,how=’inner’,on=None,left_on=None,right_on=None,left_index=False,right_index=False,sort=False,suffixes=(‘_x’,’_y’),copy=True,indicator=False,valida…

    2022年6月1日
    59
  • 阿里云和腾讯云免费SSL证书 – 知识林[通俗易懂]

    阿里云和腾讯云免费SSL证书 – 知识林[通俗易懂]本文章来自【知识林】概述什么是SSL证书通俗的来讲SSL和TSL都是属于网络传输的安全协议,而SSL继承于TSL,且SSL是一种更为安全的加密协议。SSL和TSL的体现:TSL是通过浏览器以http://来访问,默认端口是80;SSL是通过浏览器以https://来访问,默认端口是443。 为什么要使用SSL SSL更加安全 在使用微信小程序开发时与后台数据交互必须使用https传输,即SSL协议 SSL如何获得 SSL证书在很多网站上都有出售,且价格都不便

    2025年10月10日
    2
  • IIC通信协议技术说明

    IIC通信协议技术说明简介IICBus最早是Philips半导体开发的两线时串行总线,经常用于微控制器和外设之间的连接。IIC通信方式为半双工,只有一根SDA线,同一时间只可以单向通信,485为半双工,SPI和UART为全双工。网络拓扑SDA:串行数据线SCL:串行时钟线数据传输每个字节传输必须带有响应位ACK,相关的响应时钟也有主机产生,在响应的时钟脉冲期间(第9个时钟周期),发送端释放SDA线,接收端把SDA拉低。SCL第9位时钟高电平信号期间,SDA拉低代表了有ACK响应位。当出现非响应NACK位:

    2022年6月3日
    38
  • 去掉tomcat中appBase默认的ROOT[通俗易懂]

    我想修改tomcat的项目目录,写成绝对路径后,默认去找ROOT文件夹怎么去掉呢<Hostname=”localhost”appBase=”E:\ceshi”unpackWARs=”true”autoDeploy=”true”>  <Contextpath=””docBase=””debug=”0″reloadable=”tr…

    2022年4月12日
    124
  • 浅谈单调队列

    浅谈单调队列单调队列是指:队列中元素之间的关系具有单调性,而且,队首和队尾都可以进行出队操作,只有队尾可以进行入队操作。队列是一种先进先出(FIFOFirstInFirstOut)的数据结构,它类似于下面这幅图:队列的进出方式类似于平时我们排队打饭,来排队的人从队尾进入,打完饭的人从队头弹出。队列的在程序中储存的方式有很多,OI中最为常用的是使用头指针head和尾指针tail进行存储头指针指…

    2022年6月25日
    31

发表回复

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

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