zoukankan      html  css  js  c++  java
  • nutch 插件开发(转)

    Plugin插件机制为Nutch提供了很强大的扩展性,曾经看到一篇文章《不选择使用Lucene的6大原因》,其中就提到lucene的API不够开放。Lucene的OO设计的非常糟,尽管有包package和类class,但是Lucene的设计基本上没有设计模式的身影。这是不是c或者c++程序员写java程序的通病?Lucene中没有使用接口Interface,等等。在Lucene的2.0版本中就解决了这些问题,同时在Nutch的Plug实现中,完全没有这种问题,正是因为使用了Interface,Nutch的Plugin插件机制才如此的灵活,Nutch的Plugin完全基于Eclipse 2.x中的插件机制。如果你非常了解Eclipse 2.x的插件机制,完全可以跳过Nutch插件机制这一段。

    Nutch插件机制
      Nutch提供插件机制,使得开发人员可以根据自己的需要给Nutch开发适合自己需求的Plugin,完成自己想要的操作。Nutch中所有的分析,索引和查询工作都是通过Nutch的Plugin来实现的。
      Nutch把自己可以提供的Plugin接口,用一个xml文档来描述。Nutch把这些接口信息,放在Nutch的plugins\nutch-extensionpoints下,Nutch同样认为plugins\nutch-extensionpoints是一个Nutch的Plugin。在plugins\nutch-extensionpoints下的plugin.xml有下面的描述:this file hosts all extension points nutch core code offers. Please not that plugins can define extension points as well to be extendable. 这样所有的Nutch插件都必须是实现自这些extension-points.接口的类。把操作封装成接口,Core Code流程中调用接口方法,标准的Template Pattern。

    Nutch是如何加载并调用这些接口的呢?
      Nutch的PluginRepository是整个插件的加载过程。在installExtensionPoints和installExtensions方法中实现了对整个插件的加载。首先加载插件,然后加载插件的ExtensionPoint。Nutch记录了所有的ExtensionPoint,在每个ExtensionPoint中记录了扩展自这个ExtensionPoints的Extension。通过这种关系就可以通过一个ExtensionPoint(Nutch提供的扩展接口),得到所有实现了这个接口的类(Extension)。
      Nutch在自己的某个处理流程中通过Config,得到配置中配置加载的这个流程中需要的Extention。例如AnalyzerFactory的Extension加载过程:
    extensionPoint=PluginRepository.get(conf).getExtensionPoint(NutchAnalyzer.X_POINT_ID)
    这样所有实现了NutchAnalyzer这个接口的类(Exctesion)将被取得。然后根据需要调用这些接口。在插件的plugin.xml信息中,有一个parameter节点,存储的名值,是描述这个接口的配置信息。共Nutch查找并确定,是否使用这个接口。
      IndexFilter 中使用Filter的过程。就是一个典型的Nutch使用插件IndexFilter,对Document进行Index的过程。

    分词过程
      Nutch根据不同的语言使用不同的分词器来分词。Nutch如何判定现在分析的网页是那个语言的网页?Nutch使用一个外部Plugin:language-identifier来确定当前分析的网页是那种语言的网页。然后在当前的Document中放入一个名为lang的Field。在进行索引创建和搜索的时候,都会根据lang选择对应语言的Analyzer,如果没有lang的信息,那么Nutch会使用默认的Analyzer对Document建立索引。通过这样的过程就实现了Nutch使用不同的分词器分析不同的网页。
      如果使用分词,可以直接修改Nutch的Default分词器。根据我个人的测试,language-identifier对中文的网页进行语言定位的使用,有时候很是不准确的。

    相关链接
    http://hi.baidu.com/hanjunjie1986/blog/item/82a4c5036734a8753912bb94.html
    http://hi.baidu.com/sunky/blog/item/316faeafb372cbcd7dd92a6e.html
    http://www.cnidc8.com/html/2008-03/142.html

    http://www.zhangsichu.com/blogview.asp?Content_Id=117

    http://blog.csdn.net/quqi99/archive/2008/01/10/2034087.aspx

    http://developers.sun.com.cn/blog/HNU/entry/%E4%BD%BF%E7%94%A8netbeans%E5%BC%80%E5%8F%91%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8Enutch

  • 相关阅读:
    国王游戏
    从2014到2015,还有什么?
    【转载】别把自己推到了墙角
    IE9+浏览器input文本框/密码框后面的小叉子/小眼睛清除
    ajax开发模拟后端数据接口
    谈谈JavaScript事件
    也说border-box盒模型
    极其简单的使用基于gulp和sass前端工作流
    如何使用javascript书写递归函数
    Git基本命令和GitFlow工作流
  • 原文地址:https://www.cnblogs.com/bnuvincent/p/1612293.html
Copyright © 2011-2022 走看看