`

Nutch源码学习系列之一

阅读更多
Nutch源码学习系列之一:Analysis包(原创) - -
Tag: Nutch    Lucene    Analysis                                          

Nutch源码学习系列之一:Analysis包(原创)
TjuAILab    张步峰

Nutch0.7出来,对于我们这些Lucene爱好者来说,是件兴奋的事情!当时用Nutch0.6做实验已经让我非常兴奋。

Nutch0.7比之0.6又增添了一部分功能,我们开发一些小型搜索引擎可以修改Nutch的一些接口,使之更加用户化。

此节主要讲述Nutch下的Analysis包即package org.apache.nutch.analysis。

阅读此包是你可以参照Nutch的API文档。http://lucene.apache.org/nutch/apidocs/index.html。或者使用的硬盘上的也可。

搜索引擎去除Spider外基本架构可以简要描述如下






由于Analysis主要处理分词问题。在图中看出需要分词的地方就是所用入库和对用户查询进行分词。

Nutch的Analysis有一下几个文件:(黄色底是NutchAPI文档列的)

CharStream.java:

     interface CharStream

  *这个接口描述了一个维护字符串行和列位置的字符流。在某种程度上,它还具有备份字符流的


  *能力。此接口的一个实现有JavaccParser产生,用于TokenManager这个实现中。


  *


  *除去backup方法外的其他所有方法都可以被以任何方式实现。backup的正确实现需要对lexer的正确操作。


  *其他的方法被用来获取信息,诸如行序号、列序号、用于Token却没有用于lexer的字符串。


  *因此这些方法对应的实现不会影响产生lexer的操作   

CommonGrams.java

     *对于索引时经常出现的项和词构建n-grams(不是很明白).使用n-grams优化词查询。单个项依旧使用


     *覆盖的n-grams索引。


FastCharStream.java

     *CharStream接口的一个有效实现。注意这并没有进行行数计算,当时追踪了在输入中Token的字符位置


     *这个字符位置是Lucene的API需要的

NutchAnalysis.java

     应该说是Analysis包的核心了,主要完成Nutch语言(词典)分析器和查询分析器。具体到语言分析,要去


Stop Words,然后中文分词,或者英文分词等等。

NutchAnalysisConstants.java

      一个接口主要被NutchAnalysis和NutchTokenManager所用,里面含的都是常量。譬如Token的类型(冒号,省略号,阿拉伯数字,短语等等)和TokenImage(就是Token类型的string化)


NutchAnalysisTokenManager.java

      管理Token,为NutchAnalysis所用。

NutchDocumentAnalyzer.java

      *NutchDocumentAnalyzer为Nuctch文档服务。使用JavaCC定义的语言(词典)分析器


   *(@link NutchDocumentTokenizer),不含有StopWords列表。从而保持了查询分析的连贯性。


     与NutchAnalysis相对独立

NutchDocumentTokenizer.java

      *此分词器用于对Nutch的文档文本进行分词。是JavaCC所产生的词典分析器的实现。


       为NutchDocumentAnalyzer所用。


ParseException.java

        *当查询分析出错时,此异常被抛出。在产生的查询分析器(Parser)中。


        *你可以通过调用方法generateParseException来显示地创建此异常类的对象。


*只要你保留公共feild(成员变量),你可以修改这个类使其报错机制更加用户化。


Token.java

        Token类内含Token的类型,每个Token在字符串中的起始位置和终止位置等等


TokenManager.java

       一个接口,非常简单,里面只有一个用于返回下一个Token的函数。在Analysis包没有被使用。可能留着以后扩展用


TokenMgrError.java

        主要用于分词出错,进行报错。


其主要的类别继承图如下:

Class Hierarchy
class java.lang.Object
class org.apache.lucene.analysis.Analyzer
class org.apache.nutch.analysis.NutchDocumentAnalyzer
class org.apache.nutch.analysis.CommonGrams
class org.apache.nutch.analysis.NutchAnalysis (implements org.apache.nutch.analysis.NutchAnalysisConstants)
class org.apache.nutch.analysis.NutchAnalysisTokenManager (implements org.apache.nutch.analysis.NutchAnalysisConstants)
class org.apache.lucene.analysis.TokenStream
class org.apache.lucene.analysis.Tokenizer
class org.apache.nutch.analysis.NutchDocumentTokenizer (implements org.apache.nutch.analysis.NutchAnalysisConstants)
Interface Hierarchy
interface org.apache.nutch.analysis.NutchAnalysisConstants
Nutch的底层是基于Lucene的,从图中你可以看出主要的两大接口NutchDocumentAnalyzer和NutchDocumentTokenizer都是从Lucene继承过来的。所以更有必要认真研究Lucene的Analysis包。


由于BlogChina发文大小有限制,想看更全的源码部分,可以看我另一个blog!

http://blog.donews.com/windshow/archive/2005/08/26/526755.aspx






















分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics