IMPLEMENTAÇÃO DE ÍNDICES TEXTUAIS (FULL-TEXT SEARCH) NO IBM DB2
Este artigo descreve os conceitos, como funciona a busca por palavras ou frases em documentos com estrutura XML, a implementação e importância de índices textuais no IBM DB2.
A pesquisa integral (full-text search) consiste na técnica de criação de índices que examinam todas as palavras em uma base de documentos e tentam encontrar a palavra informada pelo usuário. Esse tipo de implementação está disponível em diversos bancos de dados e sofwares. Algumas páginas de busca na internet também utilizam essa técnica de pesquisa.
Como buscar palavras em um número grande de documentos pode gerar um problema de performance na aplicação, as ferramentas que implementam full-text search são usadas para minimizar ou solucionar esse problema.
O full-text é responsável por indexar e fazer a pesquisa.
A etapa da indexação vai escanear o texto de todos os documentos e montar uma lista de termos procurados. Na etapa de busca, através de uma query, apenas o índice é referenciado para encontrar o texto nos documentos originais.
Quando a busca por palavras através de um índice full-text retorna itens irrelevantes, a solução está na definição de tags nos documentos onde estão as ambiguidades, para que sejam eliminadas, embora isso possa deixar de retornar dados que são mesmo relevantes. Vamos ver essa situação mais adiante.
O DB2 possui uma funcionalidade chamada DB2 Text Search que aplica pesquisa de texto integral usando cláusulas especiais nas queries. O DB2 9 tem suporte ao armazenamento de documentos XML. Ele usa uma linguagem chamada XQuery para acessar dados em XML. Essa linguagem é padronizada pelo W3C e possui uma variedade de expressões para navegar e efetuar buscas em documentos XML. Como funciona? Uma função chamada contains() recebe sub-strings e busca por termos que correspondam aos parâmetros informados. Se encontrar, retorna o valor true. Por exemplo:
db2 => XQuery contains("Criação de índices", "ice")
Embora o usuário busque pelo termo 'ice', resultados para 'Índices' e assim por diante, também são devolvidos pela função, ou seja, a pesquisa pode trazer resultados que ele não está procurando. E também não existe um padrão para incluir parâmetros em pesquisas textuais.
Para buscar nessas estruturas onde a XQuery não traz resultados precisos, o DB2 permite a implementação de pesquisa em texto integral (full-text search), a criação e administração de índices. Através deles é possível buscar palavras ou frases em documentos com estrutura XML com a eficiência que a linguagem XQuery não consegue prover em determinadas situações. A criação e manutenção desses índices podem ser feitas pelo centro de controle do DB2.
O DB2 implementa a busca em texto integral com a ferramenta DB2 Net Search Extender (NSE). Quando inicia a busca em um documento XML, ele considera a estrutura do documento, árvores e sub-árvores, para buscar o termo específico. Assim como a função XQuery contains(), NES usa um índice textual baseado em termos relevantes que são extraídos dos documentos (sequencialmente, de preferência) e armazenados em uma coluna de uma tabela no banco de dados. No caso de documentos XML, leva-se em conta a localização do termo na estrutura do documento.
C. Implementando pesquisa de texto integral no IBM DB2
A implementação de pesquisa textual no IBM DB2 pode ser divida em duas etapas: tarefas administrativas e pesquisa em texto integral.
a) Tarefas administrativas
Vamos usar a tabela abaixo como exemplo:
codigo varchar(10) primary key not null,
descricao xml,
comentarios xml  );
Perceba que o tipo de dado das colunas 'descricao' e 'comentarios' pode ser definido como XML porque o DB2 possui suporte nativo a essa linguagem.
Antes de começar, precisamos iniciar uma instância de serviço do Net Search Extender chamada db2text start. Em seguida, deve-se habilitar o banco de dados DB2 para operações de busca textual. Isso cria tabelas para administração e vários usuários de funções definidas (UDFs) e Stored Procedures (STPs) que são necessárias para a execução de pesquisa de texto integral no DB2. Exemplo: comando para habilitar o database 'vendas':
db2text enable database for text connect to vendas
Isso precisa ser feito em cada banco de dados que irá usar a busca textual.
Após essa etapa é possível criar índices em colunas que armazenam textos em vários formatos, inclusive o XML. O comando é o create index. Exemplo:
db2text create index ind1 for vendas on produto(descricao)
Se o usuário fizer uma busca textual nesse momento, não obterá resultados, visto que o índice textual ainda não contém dados. Eles precisam ser explícitos e sincronizados se nenhuma atualização freqüente está especificada. Para tanto, usamos index update:
db2text update index ind1 for vendas
Agora estamos prontos para usar pesquisa de texto integral em documentos. Vamos conhecer os métodos para executá-la.
a) Pesquisa em texto integral
A maneira mais comum de implementar a busca textual com NSE é usando a função SQL contains() pois permite fáceis combinações com outras condições como a clásula WHERE:
SELECT coluna FROM tabela WHERE CONTAINS(nomedacoluna, 'criteriodebusca') = 1;
Os dois parâmetros exigidos na função contains são o nome da coluna onde será feita a pesquisa, e o critério que será usado na busca.
Podemos usar os seguintes critérios:
- Boolean: para operações boleanas com AND, OR e NOT;
- Palavras simples ou frases;
- Proximity: busca por palavras na mesma sentença ou no mesmo parágrafo.
- Fuzzy: busca por palavras com ortografia semelhante ao termo informado.
- Wildcard: busca usando início, meio e fim das palavras.
Critérios avançados:
- Thesaurus: suporta queries e diversos termos definidos pelos usuários.
- Numeric ranges: busca usando documentos ou colunas adicionais.
- Stemming: busca que reduz os termos pesquisados à palavra raiz. Disponível somente para palavras em inglês.
Podemos também usar a definição de tags limitando a busca por elementos, atributos ou conteúdo misto de XML.
A versão IBM DB2 Express-C, por ser voltada ao desenvolvimento de aplicativos e ser distribuída com os próprios sistemas da IBM, oferece suporte à linguagem XML, mas não à busca textual.
Como vimos, o método de pesquisa de texto integral, seja no DB2 ou em outro banco de dados, visa solucionar os problemas que não podem ser resolvidos através de queries ou linguagens nativas de cada um, no que diz respeito às pesquisas em documentos. Conhecendo os critérios de busca e executando as tarefas iniciais, é possível fazer buscas textuais com eficiência. Os índices e atualizações aperfeiçoam essa funcionalidade muito útil nos sistemas de hoje onde temos cada vez mais documentos armazenados em bancos.
Antes de implementar a solução, verifique se a versão do banco de dados usada oferece suporte às funções da busca textual.