nutch如何根据regex-urlfilter.txt文件过滤url链接的?

今天看了一下nutch的url链接过滤插件加载和工作原理,以及他和配置文件regex-urlfilter.txt之间的关系,下面对得到的一些收获进行介绍。

关系:扩展RegexURLFilter根据配置文件regex-urlfilter.txt生成一些列的规则Rule(就是一些列正则表达式Pattern类),扩展过滤方法filter()被调用时,会根据生成的规则过滤url。

具体扩展加载和生成规则的过程:

(1)首先URLFilters类中负责从仓库类PluginRepository中获得负责解析url的扩展点(扩展点中存有具体的扩展信息),然后实例化该扩展,代码如下

          URLFilter filter = (URLFilter) extension.getExtensionInstance();//实例化

         对于该扩展点URLFilter,他在系统中只有一个扩展RegexURLFilter负责处理url

(2)getExtensionInstance()实例化扩展时调用的是不带参数的默认的构造函数,他的默认构造函数中没有做任何事情,调用方法解析加载配置文件regex-urlfilter.txt文件的操作,实际是在setConf()中完成的,getExtensionInstance()代码如下:

  public Object getExtensionInstance() throws PluginRuntimeException {
    // Must synchronize here to make sure creation and initialization
    // of a plugin instance and it extension instance are done by
    // one and only one thread.
    // The same is in PluginRepository.getPluginInstance().
    // Suggested by Stefan Groschupf 
    synchronized (getId()) {
      try {
        PluginClassLoader loader = fDescriptor.getClassLoader();
        Class extensionClazz = loader.loadClass(getClazz());
        // lazy loading of Plugin in case there is no instance of the plugin
        // already.
        this.pluginRepository.getPluginInstance(getDescriptor());
        Object object = extensionClazz.newInstance();
        if (object instanceof Configurable) {
          ((Configurable) object).setConf(this.conf);//对实例化的类进行初始化,方法中包含加载配置文件的过程
        }
        return object;
      } catch (ClassNotFoundException e) {
        throw new PluginRuntimeException(e);
      } catch (InstantiationException e) {
        throw new PluginRuntimeException(e);
      } catch (IllegalAccessException e) {
        throw new PluginRuntimeException(e);
      }
    }
  }

(3)RegexURLFilter的父类RegexURLFilterBase包含setConf()函数,代码如下:

  public void setConf(Configuration conf) {
    this.conf = conf;
    Reader reader = null;
    try {
      reader = getRulesReader(conf);//读取生成过滤规则的正则表达式文件,该方法在父类中为抽象方法,子类中负责具体实现
    } catch (Exception e) {
      if (LOG.isErrorEnabled()) { LOG.error(e.getMessage()); }
      throw new RuntimeException(e.getMessage(), e);      
    }
    try {
      rules = readRules(reader);//该步负责生成具体的正则表达式规则
    } catch (IOException e) {
      if (LOG.isErrorEnabled()) { LOG.error(e.getMessage()); }
      throw new RuntimeException(e.getMessage(), e);
    }
  }

(4)然后调用filter()方法进行正则表达式过滤,代码如下:

  public synchronized String filter(String url) {
    for (int i=0; i

   可见只要url中包含符合的正则表达式,该url就被选中或删除

(5)regex-urlfilter.txt中的正则表达式解读:

-^(file|ftp|mailto):

-\.(gif|GIF|jpg|JPG|png|PNG|ico|ICO|css|CSS|sit|SIT|eps|EPS|wmf|bmp|BMP|js|JS)$

-[?*!@=]

-.*(/[^/]+)/[^/]+\1/[^/]+\1/

+sdu.edu.cn

 

配置文件中共有五个正则表达式,“-”表示负责后面的正则表达式就过滤掉,“+”表示符合条件就保留,四个正则表达式这要有一个满足条件filter()方法就返回结果

其中”^"表示句子开始,“$"表示句子的结束。”[]"中的内容为集合。

 

 

 

 

 

 

你可能感兴趣的:(搜索引擎研究nutch,url)