`
北风norther
  • 浏览: 13318 次
  • 性别: Icon_minigender_1
  • 来自: 邯郸
社区版块
存档分类
最新评论

lucene自定义分词器

阅读更多

感谢http://qindongliang1922.iteye.com/blog/1927605 

这篇文章让我豁然开朗~

建议研究lucene时一定要下载源码

 

下面代码中有个bug,,,一开始没弄没明白,在用这个分词器进行索引后发现搜不到东西。。是tokenStart和tokenEnd的错,这2个表示该词所在位置,,我这样说不知道对不对,但我感觉我的意思已经表达出来

 

package TEST;

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.AttributeFactory;

public class My extends Tokenizer {

	private final StringBuilder buffer = new StringBuilder();

	private int tokenStart = 0, tokenEnd = 0;
	private final static String PUNCTION = " -()/";
	private final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class);
	private final OffsetAttribute offsetAtt = addAttribute(OffsetAttribute.class);
	//private final TypeAttribute typeAtt = addAttribute(TypeAttribute.class);

	public My(Reader reader) {
		super(reader);
	}

	public My(AttributeFactory factory, Reader input) {
		super(factory, input);
	}

	@Override
	public boolean incrementToken() throws IOException {
		clearAttributes();
		buffer.setLength(0);
		int ci;
		char ch;
		tokenStart = tokenEnd;
		
		ci = input.read();
		if(ci>64&&ci<91){
			ci=ci+32;
		}
		ch = (char) ci;
		while (true) {
			if (ci == -1){
				if (buffer.length() == 0)
					return false;
				else {
					termAtt.setEmpty().append(buffer);
					offsetAtt.setOffset(correctOffset(tokenStart),
							correctOffset(tokenEnd));
					return true;
				}
			}
			else if (PUNCTION.indexOf(ch) != -1) {
				//buffer.append(ch);
				tokenEnd++;
				if(buffer.length()>0){
					termAtt.setEmpty().append(buffer);
					offsetAtt.setOffset(correctOffset(tokenStart),
						correctOffset(tokenEnd));
					return true;
				}else
				{
					ci = input.read();
					if(ci>64&&ci<91){
						ci=ci+32;
					}
					ch = (char) ci;
				}
			} else {
				buffer.append(ch);
				tokenEnd++;
				ci = input.read();
				if(ci>64&&ci<91){
					ci=ci+32;
				}
				ch = (char) ci;
			}
		}
		
	}
	@Override
	public void reset() throws IOException {
		super.reset();
		tokenStart = tokenEnd = 0;
	}
	@Override
	public void end() throws IOException {
		super.end();
		final int finalOffset = correctOffset(tokenEnd);
		offsetAtt.setOffset(finalOffset, finalOffset);
	}

}

 然后开始写分词器

package TEST;

import java.io.Reader;

import org.apache.lucene.analysis.Analyzer;

public class MyAnalyzer extends Analyzer{

	@Override
	protected TokenStreamComponents createComponents(String fieldName,
			Reader reader) {
		return new TokenStreamComponents(new My(reader));
	}

}

 最后测试下

package TEST;

import java.io.StringReader;

import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;

public class TestMy {
	public static void main(String[] args) throws Exception {
		MyAnalyzer ma = new MyAnalyzer();
		String str = "Norther 雪中悍刀行 河北邯郸   AC DF-II-SDFzd(asd)/小时";
		//MyChineseAnalyzer mc= new MyChineseAnalyzer();  这是三劫散仙的分词器
		TokenStream ts = ma.tokenStream("field", new StringReader(str));
		CharTermAttribute c = ts.addAttribute(CharTermAttribute.class);
		ts.reset();
		while (ts.incrementToken()) {
			System.out.println(c.toString());
		}

		ts.end();
		ts.close();

	}
}

 测试结果:

 

  • 大小: 32.6 KB
分享到:
评论

相关推荐

    Lucene4.7+IK Analyzer中文分词入门教程

    Lucene4.7+IK Analyzer中文分词入门教程

    lucene6.6+拼音分词+ik中文分词包

    lucene6.6中适配的拼音分词jar包以及ik中文分词jar包,以及自定义的分词词组包和停词包,可以实现lucene建立索引时进行拼音和中文的分词。

    Lucene5学习之自定义同义词分词器简单示例

    NULL 博文链接:https://iamyida.iteye.com/blog/2197355

    ik对应的7.x分词器

    2、在managed-schema(在server/solr/stu/conf目录下,这里选的自定义core即stu)文件中添加新分词器 &lt;tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/&gt; ...

    Lucene 3.6 学习笔记

    4.4 自定义分词器 26 (1) 自定义Stop分词器 26 (2) 实现简单同义词索引 27 第五章 高级搜索 32 5.1 搜索排序 34 (1) 建立搜索类 34 (2) 默认排序 35 (3) 根据评分排序 35 (4) 根据索引号排序 36 (5) 根据文件大小...

    lucene实例(包括分页、中文检索等)

    lucene实例是一个比较详细的例子,包括lucene的入门到高级实例,代码里有比较详细的实例,所有的实例都是通过junit来测试...实例包括各种搜索:如通配符查询、模糊查询、查询结果的分页、中文分词器、自定义分词器等...

    lucene实现站内检索

    索引和搜索部分利用Lucene引擎架构,实现了比Lucene自定义的中文分词更有效的中文分词,还引进了序列化和JavaCC提高索引效率和开发效率。最后给出了如何将源代码搜索引擎...

    C#+Lucene.Net开发完成的一个自定义WEB搜索引擎

    C#+Lucene.Net开发完成的一个自定义WEB搜索引擎,本项目实现了分词、模糊索引,加以Lucene.Net内部核心功能共同实现了搜索机制引擎

    中文分词工具word-1.0,Java实现的中文分词组件多种基于词典的分词算法

    word分词是一个Java实现的中文分词组件,提供了多种基于词典的分词算法,并利用ngram模型来消除歧义。 能准确识别英文、数字,以及日期、时间等数量词,能...5、Java开源项目cws_evaluation:中文分词器分词效果评估

    Lucene3.0.3+盘古分词(证实可用,可指定使用自己的词库文件).rar

    Lucene3.0.3+盘古分词的实现用到的dll文件,带词库文件。已证实可用,可指定使用自己维护后的词库文件。

    基于中文的Shuzhen分词器1.1.4提供下载

    字典条目支持导入到内存中,也就是在原有JDBM字典系统的基础上增加内存字典系统,且能方便自定义导入多少条目到内存中,能自定义使用内存还是JDBM字典系统还是两者结合起来使用,从而提高了索引创建速度;...

    Solr4.7-IKAnalyzer-分词配置-自定义IKTokenizerFactory

    在做IK分词器与solr过滤器结合是时候遇到一些问题,&lt;tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true"/&gt; 在网上页找了一些jar包或者class,最后找到一个合适的源码,解决了问题。 ...

    paoding+lucene实现全文检索功能简单实例

    利用paoding进行中文分词,可进行自定义词典。利用lucene对文本内容进行索引和搜索并进行高亮处理。

    ik-analyzer-8.3.1分词插件.rar

    -- ik分词器 --&gt; &lt;tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/&gt; &lt;tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart...

    CWSharp:CWSharp - .NET&.NET Core中文分词库

    特性默认支持多种分词器StandardTokenizer - 默认分词,基于词典BigramTokenizer - 二元分词,支持英文,数字识别StopwordTokenizer - 自定义过滤词,扩展类UnigramTokenizer - 一元分词可扩展的自定义分词接口支持...

    基于lucene的搜索引擎总结

    中文分词器 最大匹配法(机械分词):按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行配,若在词典中找到某个字符串,则匹配成功。 二元分词 一元分词 自动分类 向量距离分类算法 根据算术...

    魂动罗java源码-jcseg:一个开源的分词器,增加同义词优化

    jcseg是使用Java开发的一个开源中文分词器,使用流行的mmseg算法实现,并且提供了最高版本的lucene-4.x和最高版本solr-4.x的分词接口. 1。目前最高版本:jcseg-1.9.2。兼容最高版本lucene-4.x和最高版本solr-4.x 2...

    Ansj中文分词

    •增加了目前对最新版的Lucene、Solr、Elasticsearch开源第三方搜索框架的分词插件 效果测试——新词发现 引用 1. 未登陆词识别 example:NER:我要碎觉吊丝要小心!城西嘉南公寓 result:命名/v 实体/n ner/...

    word:Java分布式中文分词组件 - word分词

    能通过自定义配置文件来改变组件行为,能自定义用户词库、自动检测词库变化、支持大规模分布式环境,能灵活指定多种分词算法,能使用refine功能灵活控制分词结果,还能使用词频统计、词性标注、同义标注、反义标注、...

    IKAnalyzer-solr4.x-update.zip

    通过继承Analyzer编写自定义类UseSmartIKAnalyzer和NotUseSmartIKAnalyzer,实现智能分词和最细粒度分词,支持solr4.7通过配置schema.xml实现不同的分词效果 &lt;!-- 使用智能分词 --&gt; ...

Global site tag (gtag.js) - Google Analytics