plugin(plugins) fornecem ao nutch componentes com funcionalidades robustas. Por exemplo, HtmlParser é amplamente utilizado para analisar arquivos HTML capturados pelo nutch.
Por que nutch utiliza um sistema de plugins?
Existem três razões principais:
1: Extensibilidade
Através dos plugins, nutch permite que qualquer pessoa estenda suas funcionalidades. O que precisamos fazer é implementar uma interface específica de forma simples. Por exemplo, o plugin MSWordParser é usado para analisar documentos do Word e é uma implementação da interface parser.
2: Flexibilidade
Como qualquer pessoa pode escrever seus próprios plugins de acordo com suas necessidades, isso resulta em um acervo de recursos muito poderoso. Para os programadores que utilizam o nutch, eles podem instalar em seu mecanismo de busca os plugins que atendam às suas necessidades específicos, localizados no diretório de plugins do nutch. Isso representa uma grande vantagem para os desenvolvedores que utilizam o nutch, pois terão mais algoritmos de extração de conteúdo para escolher, facilitando a adição de análise de PDFs.
3: Manutenibilidade
Cada desenvolvedor pode focar em seu próprio problema. Enquanto os desenvolvedores do núcleo se concentram na expansão do motor, eles adicionam interfaces que descrevem os plugins. Um desenvolvedor de plugin precisa apenas se concentrar na funcionalidade que o plugin deve implementar, sem precisar saber como todo o sistema funciona. Eles precisam saber apenas os tipos de dados trocados entre plugins e pontos de extensão. Isso torna o núcleo mais simples e fácil de manter.
Plugins - O que são e como funcionam
O sistema de plugins do nutch é baseado no uso de plugins no Eclipse 2.x. Os plugins são essenciais para o funcionamento do nutch. Toda a aálise (parsing), indexação e busca no nutch são implementadas através de diferentes plugins.
Ao escrever um plugin, você adiciona um ou mais itens de extensão para um ponto de extensão. Os pontos de extensão do nutch são definidos no plugin NutchExtensionPoints (todos os pontos de extensão são listados no arquivo plugin.xml do NutchExtensionPoints). Cada ponto de extensão define uma interface que deve ser implementada durante a extensão. Estes pontos de extensão incluem:
onlineClusterer: Interface para algoritmos de agrupamento de resultados de busca online indexingFiltering: Permite adicionar metadados aos campos indexados. Todos os plugins que implementam esta interface são executados sequencialmente durante o processo de análise Ontology: Para ontologias Parser: A implementação desta interface lê o documento capturado e extrai os dados que serão indexados. Se você desejar estender a análise de um novo tipo de conteúdo ou extrair mais dados de conteúdos já analisáveis HtmlParseFilter: Adiciona metadados extras ao parser HTML protocol: Plugins que implementam o Protocol permitem que o nutch use mais protocolos de rede (FTP, HTTP) para capturar dados QueryFilter: Ponto de extensão para transformações de consulta URLFilter: Plugins que implementam este ponto de extensão restringem as URLs das páginas que o nutch deve capturar. O RegexURLFilter oferece controle sobre as URLs rastreadas pelo nutch através de expressões regulares. Se você tiver requisitos mais complexos para controle de URLs, pode escrever sua própria implementação de URLFilter NutchAnalyser: Ponto de extensão para analisadores específicos de idioma
Arquivos de origem
No diretório de origem do plugin, você encontrará os seguintes arquivos:
plugin.xml: Descreve informações sobre o plugin para o nutch build.xml: Informa ao Ant como compilar este plugin Código-fonte do plugin
Usando plugins no Nutch
Para usar um plugin específico no nutch, você precisa editar o arquivo conf/nutch-site.xml e adicionar o nome do plugin a plugin.includes
Conceitos no sistema de plugins do Nutch
Criando um exemplo de plugin
Vamos criar um plugin que recomenda páginas relacionadas a um termo de busca específico. Por exemplo, ao indexar páginas, se notarmos que um grupo de páginas trata sobre plugins, podemos querer recomendar a página pluginCentral quando alguém pesquisar por "plugins", mas retornando também os resultados da busca normal.
Para isso, adicionaremos meta-tags às páginas que devem ser recomendadas. Estas tags devem ser assim:
<meta name="recomendado" content="plugins" />
Para atingir nosso objetivo, precisamos criar um plugin que estenda três pontos de extensão diferentes:
- ParserHTML: Extrai os termos de recomendação das meta-tags
- IndexadorFiltro: Adiciona um campo de recomendação ao índice
- FiltroConsulta: Adiciona capacidade de consulta ao novo campo do índice
Arquivos necessários
Primeiro, crie um novo diretório para seu plugin no diretório de plugins do nutch. Vamos nomear nosso plugin como "sistemaRecomendacao". Dentro deste diretório, crie os seguintes arquivos:
- plugin.xml: Descreve nosso plugin para o nutch
- build.xml: Informa ao compilador como construir o plugin
- O código-fonte do plugin será salvo em /src/java/org/apache/nutch/parse/sistemaRecomendacao/
Plugin.xml
O arquivo plugin.xml deve ser assim:
<?xml version="1.0" encoding="UTF-8"?>
<plugin
id="sistemaRecomendacao"
name="Sistema de Recomendação Parser/Filtro"
version="0.0.1"
provider-name="nutch.org">
<runtime>
<!-- Como definido em build.xml, este plugin será empacotado como sistemaRecomendacao.jar -->
<library name="sistemaRecomendacao.jar">
<export name="*"/>
</library>
</runtime>
<!-- O SistemaRecomendacaoParser estende HtmlParseFilter para capturar o conteúdo
de quaisquer meta-tags de recomendação -->
<extension id="org.apache.nutch.parse.sistemaRecomendacao.filtroRecomendacao"
name="Parser de Recomendação"
point="org.apache.nutch.parse.HtmlParseFilter">
<implementation id="SistemaRecomendacaoParser"
class="org.apache.nutch.parse.sistemaRecomendacao.SistemaRecomendacaoParser"/>
</extension>
<!-- O SistemaRecomendacaoIndexador estende IndexingFilter para adicionar o conteúdo
das meta-tags de recomendação (encontradas pelo SistemaRecomendacaoParser) ao índice lucene -->
<extension id="org.apache.nutch.parse.sistemaRecomendacao.indexadorRecomendacao"
name="Filtro de Identificação de Recomendação"
point="org.apache.nutch.indexer.IndexingFilter">
<implementation id="SistemaRecomendacaoIndexador"
class="org.apache.nutch.parse.sistemaRecomendacao.SistemaRecomendacaoIndexador"/>
</extension>
<!-- O SistemaRecomendacaoFiltroConsulta é chamado ao realizar uma busca. Ele executa
uma busca pela consulta do usuário nos campos de recomendação. Para adicionar este filtro
à lista de filtros executados por padrão, você deve usar "campos=PADRAO" -->
<extension id="org.apache.nutch.parse.sistemaRecomendacao.filtroBuscaRecomendacao"
name="Filtro de Consulta de Busca de Recomendação"
point="org.apache.nutch.searcher.QueryFilter">
<implementation id="SistemaRecomendacaoFiltroConsulta"
class="org.apache.nutch.parse.sistemaRecomendacao.SistemaRecomendacaoFiltroConsulta"
campos="PADRAO"/>
</extension>
</plugin>
Build.xml
<?xml version="1.0"?>
<project name="sistemaRecomendacao" default="jar">
<import file="../build-plugin.xml"/>
</project>
A Extensão do Parser HTML
Esta é a implementação do ponto de extensão ParserHTML, responsável por extrair o conteúdo das meta-tags e adicioná-lo ao documento sendo analisado.
package org.apache.nutch.parse.sistemaRecomendacao;
// Imports JDK
import java.util.Enumeration;
import java.util.Properties;
import java.util.logging.Logger;
// Imports Nutch
import org.apache.nutch.parse.HTMLMetaTags;
import org.apache.nutch.parse.Parse;
import org.apache.nutch.parse.HtmlParseFilter;
import org.apache.nutch.protocol.Content;
import org.apache.nutch.util.LogFormatter;
public class SistemaRecomendacaoParser implements HtmlParseFilter {
private static final Logger LOG = LogFormatter
.getLogger(SistemaRecomendacaoParser.class.getName());
/** O nome do atributo de meta-dados de recomendação */
public static final String META_RECOMENDACAO_NOME="Recomendado";
/**
* Busca no arquivo HTML por meta-tags de recomendação */
public Parse filter(Content conteudo, Parse parse, HTMLMetaTags metaTags, DocumentFragment doc) {
// Tentando encontrar o termo de recomendação do documento
String recomendacao = null;
Properties metaTagsGerais = metaTags.getGeneralTags();
for (Enumeration nomesTags = metaTagsGerais.propertyNames(); nomesTags.hasMoreElements(); ) {
if (nomesTags.nextElement().equals("recomendado")) {
recomendacao = metaTagsGerais.getProperty("recomendado");
LOG.info("Encontrada uma recomendação para " + recomendacao);
}
}
if (recomendacao == null) {
LOG.info("Nenhuma recomendação encontrada");
} else {
LOG.info("Adicionando recomendação para " + recomendacao);
parse.getData().getMetadata().put(META_RECOMENDACAO_NOME, recomendacao);
}
return parse;
}
}
A Extensão do Indexador
Esta é a extensão do ponto de indexação. Se forem encontrados conteúdos com meta-tags, eles são adicionados a um campo chamado "recomendado" e indexados.
package org.apache.nutch.parse.sistemaRecomendacao;
// Imports JDK
import java.util.logging.Logger;
// Imports Nutch
import org.apache.nutch.util.LogFormatter;
import org.apache.nutch.fetcher.SaidaFetcher;
import org.apache.nutch.indexer.FiltroIndexacao;
import org.apache.nutch.indexer.ExcecaoIndexacao;
import org.apache.nutch.parse.Parse;
// Imports Lucene
import org.apache.lucene.document.Campo;
import org.apache.lucene.document.Documento;
public class SistemaRecomendacaoIndexador implements FiltroIndexacao {
public static final Logger LOG
= LogFormatter.getLogger(SistemaRecomendacaoIndexador.class.getName());
public SistemaRecomendacaoIndexador() {
}
public Documento filter(Documento doc, Parse parse, SaidaFetcher fo)
throws ExcecaoIndexacao {
String recomendacao = parse.getData().get("Recomendado");
if (recomendacao != null) {
Campo campoRecomendado = Campo.Texto("recomendado", recomendacao);
campoRecomendado.setBoost(5.0f);
doc.add(campoRecomendado);
LOG.info("Adicionado " + recomendacao + " ao campo de recomendação");
}
return doc;
}
}
O Filtro de Consulta
Quando um usuário realiza uma busca, o FiltroConsulta é chamado, e o valor de boost do campo "recomendado" afeta a ordenação dos resultados da busca.
package org.apache.nutch.parse.sistemaRecomendacao;
import org.apache.nutch.searcher.FiltroConsultaCampo;
import java.util.logging.Logger;
import org.apache.nutch.util.LogFormatter;
public class SistemaRecomendacaoFiltroConsulta extends FiltroConsultaCampo {
private static final Logger LOG = LogFormatter
.getLogger(SistemaRecomendacaoParser.class.getName());
public SistemaRecomendacaoFiltroConsulta() {
super("recomendado", 5f);
LOG.info("Adicionado um filtro de consulta de recomendação");
}
}
Habilitando o plugin no Nutch
Para que o Nutch use seu plugin, você precisa editar o arquivo conf/nutch-site.xml e adicionar o seguinte código:
<property>
<name>plugin.includes</name>
<value>nutch-extensionpoints|protocol-http|urlfilter-regex|parse-(text|html)|index-basic|query-(basic|site|url)|sistemaRecomendacao
</value>
<description>Expressão regular que nomeia os diretórios de plugins a serem incluídos.
Qualquer plugin que não corresponda a esta expressão é excluído.
De qualquer forma, você precisa incluir pelo menos o plugin nutch-extensionpoints. Por padrão,
o Nutch inclui apenas rastreamento de HTML e texto simples via HTTP, e plugins básicos de indexação e busca.
</description>
</property>
Compilando seu plugin com Ant
Antes de compilar, edite o arquivo src/plugin/build.xml para adicionar as configurações de compilação e implantação. Você verá várias linhas no formato:
<ant dir="[nome-plugin]" target="deploy" />
Adicione uma nova linha antes de :
<ant dir="sistemaRecomendacao" target="deploy" />
Executando 'ant' no diretório raio do seu checkout, tudo será compilado e empacotado. Na próxima vez que você executar um rastreamento, seu parser e filtro de indexação serão usados.
Você precisará executar 'ant war' para compilar um novo arquivo ROOT.war. Após a implantação, seu filtro de consulta será usado quando as buscas forem realizadas.
Perguntas comuns sobre carregamento de plugins e classes no Nutch
Uma das melhores coisas para um desenvolvedor de plugin é a liberdade de não precisar se preocupar com o que outros desenvolvedores de plugins estão fazendo e de poder usar bibliotecas de terceiros livremente.
Como o Nutch resolve o problema do carregamento de classes?
O Nutch usa um método bastante simples: cada plugin tem seu próprio carregador de classes, que é inicializado antes do plugin ser iniciado.
Plugins no Nutch 0.7
Para usar plugins no Nutch, você só precisa editar conf/nutch-site.xml e adicionar os nomes dos plugins que deseja usar à lista plugin.includes.
- clustering-carrot2 - Agrupamento de resultados de busca on line usando o componente Lingo do Carrot2.
- creativecommons - Suporte para rastreamento e busca de conteúdo com licença Creativee Commons.
- index-basic - Adiciona campos url, conteúdo e anchor ao índice.
- index-more - Adiciona campos date, content-length, contentType, primaryType e subtype ao índice.
- languageidentifier - Adiciona um campo lang ao índice e permite consultas nele.
- ontology - Ajuda a refinar consultas com base em arquivos owl.
- parse-ext - Um invólucro que chama comandos externos para realizar o trabalho real de parsing.
- parse-html - Analisa documentos HTML
- parse-js - Analisa JavaScript
- parse-mp3 - Analisa arquivos MP3
- parse-msword - Analisa documentos do Word
- parse-pdf - Analisa PDFs
- parse-rss - Analiza feeds RSS
- parse-rtf - Analisa arquivos RTF
- parse-text - Analisa documentos de texto
- protocol-file - Recupera documentos do sistema de arquivos
- protocol-ftp - Recupera documentos via FTP
- protocol-http - Recupera documentos via HTTP
- protocol-httpclient - Recupera documentos via HTTP e HTTPS
- query-basic - Executa consultas nos campos conteúdo, url e anchor
- query-more - Executa consultas nos campos date, content-length, contentType, primaryType e subType.
- query-site - Executa consultas no campo site
- query-url - Executa consultas no campo url.
- urlfilter-prefix
- urlfilter-regex
Plugins Adicionais na Branch Dev (0.8)
- analysis-de
- analysis-fr
- lib-commons-httpclient
- lib-http
- lib-jakarta-poi
- lib-log4j
- lib-lucene-analyzers
- lib-nekohtml
- lib-parsems
- parse-msexcel - Analisa documentos do Excel
- parse-mspowerpoint - Analisa apresentações do PowerPoint
- parse-oo - Analisa documentos Open Office e Star Office (Extensões: ODT, OTT, ODH, ODM, ODS, OTS, ODP, OTP, SXW, STW, SXC, STC, SXI, STI)
- parse-swf - Analisa arquivos Flash SWF
- microformats-reltag - Adiciona campos rel-tag ao índice e executa consultas neles.
- parse-zip