`
m2000hsf
  • 浏览: 99327 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Lucene写自己的Analyzer

 
阅读更多
实现一个简单的分析器(Analyzer)的例子如下所示:]
public class MyAnalyzer extends Analyzer {  
        public TokenStream tokenStream(String fieldName, Reader reader) {  
            //以空格方式切分Token  
            TokenStream stream = new WhitespaceTokenizer(reader);  
            //删除过短或过长的词,例如 in、of、it  
            stream = new LengthFilter(stream, 3, Integer.MAX_VALUE);  
            //给每个词标注词性  
            stream = new PartOfSpeechAttributeImpl.PartOfSpeechTagging  
        Filter(stream);  
            return stream;  
        }  
    }


一般在Tokenizer的子类实际执行词语的切分。需要设置的值有:和词相关的属性termAtt、和位置相关的属性offsetAtt。在搜索结果中高亮显示查询词时,需要用到和位置相关的属性。但是在切分用户查询词时,一般不需要和位置相关的属性。Tokenizer的子类需要重写incrementToken方法。通过incrementToken方法遍历Tokenizer分析出的词,当还有词可以获取时,返回true;已经遍历到结尾时,返回false。

基于属性的方法把无用的词特征和想要的词特征分隔开。每个TokenStream在构造时增加它想要的属性。在TokenStream的整个生命周期中都保留一个属性的引用。这样在获取所有和TokenStream实例相关的属性时,可以保证属性的类型安全。
 
 protected CnTokenStream(TokenStream input) {  
        super(input);  
        termAtt = (TermAttribute) addAttribute(TermAttribute.class);  
    }


在TokenStream.incrementToken()方法中,一个token流仅仅操作在构造方法中声明过的属性。例如,如果只要分词,则只需要TermAttribute。其他的属性,例如PositionIncrementAttribute或者PayloadAttribute都被这个TokenStream忽略掉了,因为这时不需要其他的属性。
   
public boolean incrementToken() throws IOException {  
        if (input.incrementToken()) {  
            final char[] termBuffer = termAtt.termBuffer();  
            final int termLength = termAtt.termLength();  
            if (replaceChar(termBuffer, termLength)) {  
                termAtt.setTermBuffer(output, 0, outputPos);  
            }  
            return true;  
        }  
        return false;  
    }


虽然也可以通过termAtt对象中的term方法返回词,但这个方法返回的是字符串,直接返回字符数组的termBuffer方法性能更好。下面是采用正向最大长度匹配实现的一个简单的Tokenizer。

   
public class CnTokenizer extends Tokenizer {  
        private static TernarySearchTrie dic = new 
    TernarySearchTrie("SDIC.txt");  
    //词典  
        private TermAttribute termAtt;// 词属性  
        private static final int IO_BUFFER_SIZE = 4096;  
        private char[] ioBuffer = new char[IO_BUFFER_SIZE];  
     
        private boolean done;  
        private int i = 0;// i是用来控制匹配的起始位置的变量  
        private int upto = 0;  
     
        public CnTokenizer(Reader reader) {  
            super(reader);  
            this.termAtt = ((TermAttribute)
    addAttribute(TermAttribute.class));  
            this.done = false;  
        }  
     
        public void resizeIOBuffer(int newSize) {  
            if (ioBuffer.length < newSize) {  
                // Not big enough; create a new array with slight  
                // over allocation and preserve content  
                final char[] newnewCharBuffer = new char[newSize];  
                System.arraycopy(ioBuffer, 0, 
    newCharBuffer, 0, ioBuffer.  
            length);  
                ioBuffer = newCharBuffer;  
            }  
        }  
     
        @Override  
        public boolean incrementToken() throws IOException {  
            if (!done) {  
                clearAttributes();  
                done = true;  
                upto = 0;  
                i = 0;  
                while (true) {  
                    final int length = input.
    read(ioBuffer, upto, ioBuffer.  
                length  
                            - upto);  
                    if (length == -1)  
                        break;  
                    upto += length;  
                    if (upto == ioBuffer.length)  
                        resizeIOBuffer(upto * 2);  
                }  
            }  
     
            if (i < upto) {  
                char[] word = dic.matchLong(ioBuffer, i, upto);  
            // 正向最大长度匹配  
                if (word != null)// 已经匹配上  
                {  
                    termAtt.setTermBuffer(word, 0, word.length);  
                    i += word.length;  
                } else {  
                    termAtt.setTermBuffer(ioBuffer, i, 1);  
                    ++i;// 下次匹配点在这个字符之后  
                }  
                return true;  
            }  
            return false;  
        }  
    }
0
1
分享到:
评论

相关推荐

    org.wltea.analyzer.lucene.IKAnalyzer jar

    solr的IK分词器JAR及配置文件 jar包和配置文件的放置位置不一样,详情可搜索 IK Analyzer 是一个开源的,基于java语言开发的轻量级的中文分词工具包。...org.wltea.analyzer.lucene.IKAnalyzer jar

    模糊查询-lucene-IKAnalyzer

    本话题主要探讨的是在Java 1.5环境下,如何利用Lucene 3.0.1版本和IKAnalyzer 3.2来实现模糊查询的功能。Lucene是一个高性能、全文本搜索库,而IKAnalyzer是一个专门针对中文分词的开源分析器,它们的结合能够有效地...

    lucene3.5 IKAnalyzer3.2.5 实例中文分词通过

    lucene3.5 IKAnalyzer3.2.5 实例中文分词通过,目前在网上找的lucene 和IKAnalyzer 的最新版本测试通过。内含:示例代码,以及最新jar包。 lucene lucene3.5 IKAnalyzer IKAnalyzer3.2.5 jar 中文 分词

    IKAnalyzer中文分词支持lucene6.5.0版本

    由于林良益先生在2012之后未对IKAnalyzer进行更新,后续lucene分词接口发生变化,导致不可使用,所以此jar包支持lucene6.0以上版本

    Lucene5.21+IkAnalyzer

    《Lucene5.21与IkAnalyzer2012_V5入门详解》 在信息技术领域,数据检索和...希望这个入门案例能帮助你开启Lucene和IkAnalyzer的探索之旅,如果你在实践中遇到困难,欢迎进一步学习和研究,不断提升自己的技术实力。

    lucene的IKAnalyzer以及兼容4.3

    3. **插件化设计**:IKAnalyzer提供了插件化的扩展机制,用户可以定制自己的过滤器、分析器等,以满足特定场景的需求。 4. **支持多种搜索引擎**:除了Lucene之外,IKAnalyzer还兼容Solr、Elasticsearch等其他全文...

    lucene增删改查+IKAnalyzer

    1. **Document**:文档是Lucene中最小的单位,可以包含多个字段(Field),每个字段都有自己的类型,如文本、数值或日期。 2. **IndexWriter**:负责创建和更新索引,它可以添加、删除或修改Document。 3. **...

    IKAnalyzer 支持高版本最新Lucene 5.x、6.x、7.x

    在给定的标题和描述中,我们看到IKAnalyzer已经更新以支持Lucene的高版本,包括5.x、6.x以及最新的7.3.1版本,这表明它持续跟进了Lucene的发展,确保与主流搜索引擎框架的兼容性。 1. **IKAnalyzer详解**: - IK...

    lucene5和IKAnalyzer5的jar包 相匹配

    《深入理解Lucene5与IKAnalyzer5:构建高效全文搜索引擎》 在信息技术高速发展的今天,搜索引擎已经成为信息获取的重要工具。Lucene和IKAnalyzer作为Java领域内广泛应用的全文检索库和中文分词器,它们的结合为开发...

    Lucene的IK Analyzer 3.0 中文分词器 全解

    IK Analyzer 3.0 是一个专为 Lucene 设计的开源中文分词器,它基于 Java 开发,提供轻量级且高效的分词功能。自2006年12月发布1.0版以来,IK Analyzer 经历了多次升级,3.0版已演变为独立于 Lucene 的通用分词组件,...

    lucene-IKAnalyzer2012_u6-lukeall.rar

    lucene-IKAnalyzer2012_u6-lukeall.rar压缩包中包含lucene-4.10.3依赖包、中文分词器IKAnalyzer2012_u6的依赖包和索引库查看工具lukeall-4.10.0.jar(将jar拷贝到相应的索引库中双击打开即可查看)。解压后就可以...

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

    【Lucene4.7+IK Analyzer中文分词入门教程】 Lucene是一个开源的全文检索库,它提供了文本分析、索引和搜索的核心工具。在这个入门教程中,我们将使用Lucene 4.7版本,结合IK Analyzer,一个专门针对中文分词的开源...

    中文分词库 IKAnalyzer For Lucene 5.2.1(适用Lucene 5.2.1)

    IKAnalyzer 是一个专门为 Lucene 设计的开源中文分词库,它在中文处理领域有着广泛的应用。这个版本的 IKAnalyzer 特别适用于 Lucene 5.2.1,这意味着它与该版本的 Lucene 兼容性极佳,能够提供高效、准确的中文分词...

    适用于Lucene5.3.1的IKAnalyzer jar包

    该jar包之前只支持Lucene4.7.2,因为我自己的项目用到的是Lucene5.3.1,所以我自己重写了IKAnalyzer.java以及IKTokenizer.java,并且重新编译之后替换了之前的.class文件,现在可以适用于Lucene5.3.1

    IKAnalyzer2012_FF_hf1.jar

    解决lucene4.0与IKAnalyzer的冲突。解决Exception in thread "main" java.lang.VerifyError: class org.wltea.analyzer.lucene.IKAnalyzer overrides final method tokenStream.(Ljava/lang/String;Ljava/io/Reader;...

    IKAnalyzer中文分词器支持Lucene6.0以上

    提示:IKAnalyzer中文分词器支持Lucene6.0以上,IKAnalyzer中文分词器支持Lucene6.0以上。

    2018-01lucene-3.5和IKAnalyzer2012全文分词检索技术文档

    使用lucene-3.5和IKAnalyzer2012,实现基础的全文检索实现

    实现lucene的Analyzer接口的一个分词器

    导入: import net.teamhot.lucene.ThesaurusAnalyzer; import org.apache.lucene.analysis.Analyzer; 实例化: Analyzer analyzer = new ThesaurusAnalyzer();

    用于Lucene的IKAnalyzer分词器

    IKAnalyzer是一个开源的,基于Java语言开发的轻量级的中文分词语言包,它是以Lucene为应用主体,结合词典分词和文法分析算法的中文词组组件。从3.0版本开始,IK发展为面向java的公用分词组件,独立Lucene项目,同时...

    lucene Analyzer 庖丁解牛 中文分词

    5. **用户自定义扩展**:除了内置的Analyzer,用户还可以通过继承`Analyzer`类,结合自己的业务需求,实现定制化的分词逻辑。例如,可以添加特定领域的专业术语到词典,或者编写特定的分词规则。 总的来说,Lucene...

Global site tag (gtag.js) - Google Analytics