`
北风norther
  • 浏览: 14000 次
  • 性别: 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
分享到:
评论

相关推荐

    Lucene中文分词器组件

    2. **配置与初始化**:根据项目需求,配置分词器的参数,如自定义词典、分词模式等,然后在Lucene的Analyzer中实例化该分词器。 3. **索引建立**:在创建索引时,使用配置好的分词器对中文文本进行分词,生成分词后...

    lucene中文分词器(paoding解牛)

    《Lucene中文分词器——Paoding解牛详解》 在中文信息检索领域,分词是至关重要的一环,它能够将连续的汉字序列切割成具有独立意义的词语,为后续的索引和查询提供基础。Lucene作为Java最著名的全文搜索引擎库,其...

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

    本篇将聚焦于"Lucene5学习之自定义同义词分词器简单示例",通过这个主题,我们将深入探讨如何在Lucene5中自定义分词器,特别是实现同义词扩展,以提升搜索质量和用户体验。 首先,理解分词器(Analyzer)在Lucene中...

    lucene.NET 中文分词

    2. **配置分词器**:在Lucene.NET的索引创建阶段,需要配置Analyzer类,指定使用特定的分词器。例如,使用IK Analyzer可以创建`IKAnalyzer analyzer = new IKAnalyzer();`。 3. **字段分析**:在创建Document对象时...

    lucene中文分词工具包

    3. **分词器分词**:这是核心步骤,IKAnalyzer采用动态调优算法,能够在运行时根据上下文调整分词策略,以达到更好的分词效果。它支持基于正向最大匹配(MMAX)和逆向最大匹配(RMMAX)等多种分词模式。 4. **歧义...

    lucene3庖丁解牛中文分词器

    《深入剖析:Lucene3与庖丁解牛中文分词器》 在信息技术飞速发展的今天,全文检索和搜索引擎已经成为日常开发中不可或缺的部分。Lucene作为一款强大的全文检索库,被广泛应用于各种信息检索系统中。然而,对于中文...

    lucene.net中文分词器

    通过阅读和分析代码,开发者可以了解到如何在Lucene.NET中集成自定义分词器,以及如何实现最大向前匹配算法的具体细节。这为其他开发者提供了参考和学习的机会,也是促进技术交流的一个良好途径。 总结来说,这个...

    Lucene关于几种中文分词的总结

    以下是对几种常见Lucene中文分词器的总结: 1. CJKAnalyzer:此分词器是Lucene contrib目录下的analyzers子目录中的组件,位于cn目录。CJKAnalyzer主要针对中日韩三国语言进行分词,它基于字符级别进行分词,适用于...

    lucene中文分词(庖丁解牛)庖丁分词

    3. 初始化分词器:在Lucene的索引过程中,需要实例化庖丁分词器,并设置相应的参数,如词典路径、分词模式等。 4. 分词处理:在索引文档时,先用庖丁分词器对中文文本进行分词,然后将分词结果转换成Lucene的Term...

    lucene中文分词

    默认情况下,Lucene并不支持中文分词,因此我们需要引入专门的中文分词器。"je-analysis"是一个常见的中文分词插件,它为Lucene提供了对中文文本的分析能力。 "je-analysis" 是一套基于Java开发的中文分析工具,其...

    lucene中文分词源码,做搜索引擎需要用到的好东西哦

    对于“www.pudn.com.txt”这个文件,可能包含的是Lucene使用示例或者某个分词器的测试数据。通过阅读和分析这些数据,我们可以看到实际的分词效果,理解分词器如何处理不同的输入文本。 至于“slucene”,这可能是...

    引入局部统计识别高频词汇的Lucene中文分词程序STUSegmentConfig.rar

    为了使用这个STUSegmentConfig.rar,用户需要先解压缩文件,然后在Lucene项目中导入对应的分词组件,并根据STUSegmentConfig.xml配置分词器。开发人员可能会使用Java API与Lucene进行交互,调用分词器的接口进行文本...

    Lucene与中文分词技术的研究及应用

    2. **配置Lucene**:在Lucene的配置文件中指定自定义的中文分词器。 3. **索引构建**:使用中文分词器构建索引。 4. **查询优化**:对查询语句进行预处理,提高搜索精度。 #### 应用实例 本论文中提到了基于Lucene...

    compass2.1.4包+所用lucene包+中文分词器

    Compass 是一个基于 Lucene 的全文检索框架,它提供了一种高级的、面向对象的方式来管理和集成搜索引擎...在开发过程中,可能还需要根据具体需求调整分词器的配置,比如添加自定义词典或调整分词策略,以优化搜索效果。

    lucene、solr中文分词器

    它们提供了强大的信息检索和文本分析功能,但Lucene默认的分词器并不适用于中文处理。因此,对于中文索引和搜索,我们需要引入专门针对中文的分词器。本篇文章将深入探讨Lucene和Solr中的中文分词器及其重要性。 ...

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

    在Lucene中,你可以通过创建`Analyzer`实例,然后使用`Document`对象来添加字段,如药品名称和功能主治,这些字段会被分词器处理。 在索引建立完成后,可以使用Lucene提供的搜索API来进行查询。这通常涉及到创建`...

    Solr通过特殊字符分词实现自定义分词器详解

    《Solr自定义分词器实现特殊字符分词详解》 在信息检索和文本分析领域,分词是至关重要的步骤,它将原始文本拆分成可处理的词汇单元。Apache Solr,作为流行的全文搜索引擎,提供了丰富的分词工具,但有时默认的...

    ik分词器2012和lucene的资源和jar包以及lucene索引查看工具

    IK分词器与Lucene是Java开发中两个重要的文本处理工具,主要应用于信息检索和自然语言处理领域。这里我们将深入探讨这两个组件以及相关的资源和工具。 1. **IK分词器**: IK分词器(Intelligent Chinese Analyzer ...

    引入局部统计识别高频词汇的Lucene中文分词程序src.rar

    2. **源码文件**:`.java`文件,包含了实现Lucene分词器的类,可能包括`Tokenizer`、`Analyzer`等,这些类会覆盖或扩展Lucene的默认分词逻辑。 3. **测试代码**:`.java`或`.test`文件,用于验证分词器功能的正确性...

    分词器LUcene

    《深入理解Lucene分词器:歧义处理与数量词合并》 在信息检索和自然语言处理领域,分词是至关重要的第一步。Lucene,作为Java最著名的全文搜索引擎库,其强大的分词能力使得它在各种信息检索系统中广泛应用。本文将...

Global site tag (gtag.js) - Google Analytics