感谢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(); } }
测试结果:
相关推荐
2. **配置与初始化**:根据项目需求,配置分词器的参数,如自定义词典、分词模式等,然后在Lucene的Analyzer中实例化该分词器。 3. **索引建立**:在创建索引时,使用配置好的分词器对中文文本进行分词,生成分词后...
《Lucene中文分词器——Paoding解牛详解》 在中文信息检索领域,分词是至关重要的一环,它能够将连续的汉字序列切割成具有独立意义的词语,为后续的索引和查询提供基础。Lucene作为Java最著名的全文搜索引擎库,其...
本篇将聚焦于"Lucene5学习之自定义同义词分词器简单示例",通过这个主题,我们将深入探讨如何在Lucene5中自定义分词器,特别是实现同义词扩展,以提升搜索质量和用户体验。 首先,理解分词器(Analyzer)在Lucene中...
2. **配置分词器**:在Lucene.NET的索引创建阶段,需要配置Analyzer类,指定使用特定的分词器。例如,使用IK Analyzer可以创建`IKAnalyzer analyzer = new IKAnalyzer();`。 3. **字段分析**:在创建Document对象时...
3. **分词器分词**:这是核心步骤,IKAnalyzer采用动态调优算法,能够在运行时根据上下文调整分词策略,以达到更好的分词效果。它支持基于正向最大匹配(MMAX)和逆向最大匹配(RMMAX)等多种分词模式。 4. **歧义...
《深入剖析:Lucene3与庖丁解牛中文分词器》 在信息技术飞速发展的今天,全文检索和搜索引擎已经成为日常开发中不可或缺的部分。Lucene作为一款强大的全文检索库,被广泛应用于各种信息检索系统中。然而,对于中文...
通过阅读和分析代码,开发者可以了解到如何在Lucene.NET中集成自定义分词器,以及如何实现最大向前匹配算法的具体细节。这为其他开发者提供了参考和学习的机会,也是促进技术交流的一个良好途径。 总结来说,这个...
3. 初始化分词器:在Lucene的索引过程中,需要实例化庖丁分词器,并设置相应的参数,如词典路径、分词模式等。 4. 分词处理:在索引文档时,先用庖丁分词器对中文文本进行分词,然后将分词结果转换成Lucene的Term...
默认情况下,Lucene并不支持中文分词,因此我们需要引入专门的中文分词器。"je-analysis"是一个常见的中文分词插件,它为Lucene提供了对中文文本的分析能力。 "je-analysis" 是一套基于Java开发的中文分析工具,其...
最后,IKAnalyzer.cfg.xml是IK分词器的配置文件,用于设置分词器的行为,如是否开启全模式、是否使用自定义词典等。通过修改这个配置文件,我们可以对分词过程进行精细化控制。 总的来说,"lucene6.6+拼音分词+ik...
对于“www.pudn.com.txt”这个文件,可能包含的是Lucene使用示例或者某个分词器的测试数据。通过阅读和分析这些数据,我们可以看到实际的分词效果,理解分词器如何处理不同的输入文本。 至于“slucene”,这可能是...
为了使用这个STUSegmentConfig.rar,用户需要先解压缩文件,然后在Lucene项目中导入对应的分词组件,并根据STUSegmentConfig.xml配置分词器。开发人员可能会使用Java API与Lucene进行交互,调用分词器的接口进行文本...
2. **配置Lucene**:在Lucene的配置文件中指定自定义的中文分词器。 3. **索引构建**:使用中文分词器构建索引。 4. **查询优化**:对查询语句进行预处理,提高搜索精度。 #### 应用实例 本论文中提到了基于Lucene...
Compass 是一个基于 Lucene 的全文检索框架,它提供了一种高级的、面向对象的方式来管理和集成搜索引擎...在开发过程中,可能还需要根据具体需求调整分词器的配置,比如添加自定义词典或调整分词策略,以优化搜索效果。
它们提供了强大的信息检索和文本分析功能,但Lucene默认的分词器并不适用于中文处理。因此,对于中文索引和搜索,我们需要引入专门针对中文的分词器。本篇文章将深入探讨Lucene和Solr中的中文分词器及其重要性。 ...
在Lucene中,你可以通过创建`Analyzer`实例,然后使用`Document`对象来添加字段,如药品名称和功能主治,这些字段会被分词器处理。 在索引建立完成后,可以使用Lucene提供的搜索API来进行查询。这通常涉及到创建`...
《Solr自定义分词器实现特殊字符分词详解》 在信息检索和文本分析领域,分词是至关重要的步骤,它将原始文本拆分成可处理的词汇单元。Apache Solr,作为流行的全文搜索引擎,提供了丰富的分词工具,但有时默认的...
IK分词器与Lucene是Java开发中两个重要的文本处理工具,主要应用于信息检索和自然语言处理领域。这里我们将深入探讨这两个组件以及相关的资源和工具。 1. **IK分词器**: IK分词器(Intelligent Chinese Analyzer ...
2. **源码文件**:`.java`文件,包含了实现Lucene分词器的类,可能包括`Tokenizer`、`Analyzer`等,这些类会覆盖或扩展Lucene的默认分词逻辑。 3. **测试代码**:`.java`或`.test`文件,用于验证分词器功能的正确性...
《深入理解Lucene分词器:歧义处理与数量词合并》 在信息检索和自然语言处理领域,分词是至关重要的第一步。Lucene,作为Java最著名的全文搜索引擎库,其强大的分词能力使得它在各种信息检索系统中广泛应用。本文将...