最近做项目中应用到了Lucene做搜索应用,于是顺便学习它的源代码。下面就将学习到的“Lucene分析器分析过程”与大家分享!限于水平,错误难免。请大家不吝赐教。让拍砖来的更猛烈些,文章为原创,参照Lucen in Action中
部分内容,如需要转载,请与作者联系,或标明来源。谢谢!
一、先看看编写的Demo及运行效果,总览一下。
private static Log log = LogFactory.getLog(AnalyzerDemo.class);
public static void main(String[] args) throws IOException{
Analyzer analyzer = new SimpleAnalyzer();
TokenStream stream = analyzer.reusableTokenStream(null, new StringReader("Programminged is fun,by the way,do you like dog?"));
while(true){
Token token = stream.next();
if(null == token){
log.info("完毕!");
break;
}
log.info(new String(token.termBuffer()) + " 起始位置:" + token.startOffset() + " 结束位置:" + token.endOffset());
}
}
程序运行后控制台效果:
0 [main] INFO test.lucene.AnalyzerDemo - programminged 起始位置:0 结束位置:13
16 [main] INFO test.lucene.AnalyzerDemo - is 起始位置:14 结束位置:16
16 [main] INFO test.lucene.AnalyzerDemo - fun 起始位置:17 结束位置:20
16 [main] INFO test.lucene.AnalyzerDemo - by 起始位置:21 结束位置:23
16 [main] INFO test.lucene.AnalyzerDemo - the 起始位置:24 结束位置:27
16 [main] INFO test.lucene.AnalyzerDemo - way 起始位置:28 结束位置:31
16 [main] INFO test.lucene.AnalyzerDemo - do 起始位置:32 结束位置:34
16 [main] INFO test.lucene.AnalyzerDemo - you 起始位置:35 结束位置:38
16 [main] INFO test.lucene.AnalyzerDemo - like 起始位置:39 结束位置:43
16 [main] INFO test.lucene.AnalyzerDemo - dog 起始位置:44 结束位置:47
16 [main] INFO test.lucene.AnalyzerDemo - 完毕!
以上代码中,使用SimpleAnalyzer进行分析。它内置使用LowerCaseTokenizer 。至于分析的结果,我将在下文结合Lucene源代码详细描述。
二、让我们看一下UML图,UML图画的可能比较粗糙一些
这个图是SimpleAnalyzer的架构图,旁边给了说明,就不再赘述了。值的注意的是,simpleAnalyzer两个方法,返回值都是TokenStream,这个类就是我刚才提到的LowerCaseTokenizer的超类。
为了方便大家观看它的结构。下面将给出它的架构图,如下:
三、分析处理过程
上述代码中,我们构建了一个LowerCaseTokenizer,通过构造方法,将StringReader传递到Tokeinzer的 protected Reader input 中。
接着调用TokenStrem的next()方法,这个方法主要是构建Token的,在这个方法内部,它调用CharTokenizer的重载方法,下面主要讲讲Chartokenizer.next(Token token)
1)程序给出了一个死循环,while(true),在这个循环内部,逐个调字串分析,调用抽象方法isTokenChar,如果返回false,则break循环。我们上例中,碰到“空格”后就跳出。
2)如果是字符串,即时isTokenChar返回为真的时候,记录下这个字串到char[] buffer中。
3)char[] buffer在初始化时,设置长度为10,如果超出10,比如我们的"Programminged"(为了超出10个字串,说明问题,构建了一个错误的单词,见笑了。)则扩充长度*2
这段代码在Token中,size *= 2;
char[] newBuffer = new char[size];
System.arraycopy(termBuffer, 0, newBuffer, 0, termBuffer.length);
4)包装Token,内容不但有每个Token的内容,还有它的起始、结束位置。谓之原数据。这将在高亮显示时使用。
四、Analyzer将输入源进行分析,通过DocumentsWriter进行写索引。
见代码:
// Tokenize field and add to postingTable
stream = analyzer.reusableTokenStream(fieldInfo.name, reader);
上述是Lucene自带的SimpleAnalyzer分析处理过程,我们可以扩充Analyzer 类,扩建自已的中文分词处理器。
分享到:
相关推荐
1. **IKAnalyzer详解**: - IKAnalyzer最初的设计目标是提供一个灵活且可扩展的中文分词器。它支持词典动态加载,可以方便地添加或更新词库。 - 分词器的核心部分包括:词典管理、动态词典加载、基于Aho-Corasick...
《Lucene5.21与IkAnalyzer2012_V5入门详解》 在信息技术领域,数据检索和搜索引擎是至关重要的部分,而Lucene和IkAnalyzer则是其中的两大利器。本文将详细介绍如何使用Lucene 5.21版本结合IkAnalyzer 2012_V5进行...
IK Analyzer 是由国人开发的一款针对中文的 Lucene 分词器,其设计目标是为了解决 Lucene 在处理中文时的不足。IK 支持多种分词模式,包括精确模式、全模式、关键词模式等,可以满足不同场景下的分词需求。此外,IK ...
Lucene的`Analyzer`类是处理文本的关键组件,它负责将输入的文本分解为可搜索的词元。默认的`StandardAnalyzer`适用于大多数英文文本,但对于其他语言或特定需求,可以自定义分析器。分析器包括分词器(Tokenizer)...
《Lucene分词技术与IKAnalyzer详解》 在信息技术领域,搜索引擎是不可或缺的一部分,而Lucene作为Apache软件基金会的一个开放源代码项目,是Java语言开发的全文检索引擎库,为构建高效、可扩展的信息检索应用提供了...
3. **IKAnalyzer详解** IKAnalyzer采用了字典驱动的分词策略,它的字典包含了大量的常用词汇,并且支持动态扩展。此外,IKAnalyzer还考虑了词语的歧义问题,通过智能切分算法来尽可能准确地划分词语。 4. **高亮器...
中文分词是将连续的汉字序列切分成具有语义的词语的过程,是自然语言处理(NLP)中的基础步骤。在Lucene.NET中,为了支持中文分词,通常需要结合第三方分词器,如IK Analyzer、HanLP、jieba.NET等。这些分词器具备...
《Lucene搜索过程深度解析》 Lucene,作为一款强大的全文搜索引擎库,其搜索机制是其核心功能之一。本文将详细剖析Lucene的搜索实现过程,通过代码解析,帮助读者深入理解其工作原理。 首先,搜索过程始于打开并...
**IKAnalyzer详解** IKAnalyzer的设计目标是易于使用和高度可扩展。它采用了模块化的设计,使得用户可以根据自己的需求定制分词策略。以下是IKAnalyzer分词过程的五个主要部分: 1. **词典加载**:词典是分词的...
**Lucene分词与查询详解** Lucene是一个高性能、全文本搜索库,广泛应用于各种搜索引擎的开发中。它提供了一套强大的API,用于索引文本数据,并执行复杂的查询操作。在深入理解Lucene的分词与查询机制之前,我们...
在"Lucene 实时搜索视频详解"的课程中,我们将深入探讨如何利用 Lucene 实现高效且实时的搜索功能。 一、Lucene 基础 1. **索引过程**:Lucene 的核心概念之一是建立索引,将原始文本数据转化为可快速查询的结构。...
3. **搜索**:用户输入查询后,Lucene会使用同样的Analyzer处理查询字符串,生成查询关键词,然后在倒排索引中查找匹配的文档。 4. **结果排序**:找到匹配的文档后,Lucene会根据评分机制(如TF-IDF)对结果进行...
在Lucene中,可以设置分词器(Analyzer)来处理文本,如中文分词器`ICUAnalyzer`或`SmartChineseAnalyzer`,确保正确切分中文词汇。 ### 分词与分析 分词是将文本分解成有意义的单词或短语的过程。对于中文,由于...
**基于Lucene的文件检索系统详解** Lucene是一款开源的全文搜索引擎库,由Apache软件基金会维护,被广泛应用于各种搜索引擎的开发。它提供了一个高效、可扩展的框架,用于索引和搜索大量文本数据。本篇文章将深入...
《Lucene中文分词技术详解》 在信息检索和自然语言处理领域,中文分词是至关重要的一步。Lucene,作为一个强大的全文搜索引擎库,对于处理中文文档,分词的准确性和效率直接影响到搜索效果。本文将围绕“lucene中文...
在Lucene中,分词器通常与索引构建过程相结合,通过预处理和并行化处理来减少在线查询时的负担。 总的来说,支持Lucene的词典机械中文分词方法结合了反向分词策略和特定的数字、英文处理机制,能够有效地处理中文...
在Lucene 6.6.2中集成IKAnalyzer,首先需要在项目中引入IKAnalyzer-6.5.0.jar库。然后,在创建Analyzer时指定使用IKAnalyzer,例如: ```java Analyzer analyzer = new IKAnalyzer(); ``` 接着,在创建IndexWriter...
2. 创建Analyzer实例:在Lucene的索引和查询过程中,替换默认的Analyzer为阿里郎分析器。 3. 配置和定制:根据需求,可以调整分析器的参数,如是否忽略某些字符或词组。 4. 索引和搜索:使用定制的Analyzer对韩语...
**Lucene.NET中文帮助文档详解** Lucene.NET是一款开源全文搜索引擎库,它是Apache Lucene项目在.NET框架下的实现。这个库提供了高级的信息检索服务,包括文本分析、索引和搜索功能,广泛应用于各种需要高效搜索...