Como procurar fragmentos de texto em um banco de dados

Existem ferramentas de código aberto ou comerciais disponíveis que permitem a indexação de fragmentos de texto do conteúdo do banco de dados e podem ser consultadas a partir do Java?

O pano de fundo da questão é uma grande tabela de banco de dados MySQL com várias centenas de milhares de registros, contendo várias colunas VARCHAR. Nessas colunas, as pessoas gostariam de procurar por fragmentos do conteúdo, portanto, um índice de texto completo (que é baseado em limites de palavras) não ajudaria.

EDITAR: [Adicionado para deixar claro por que essas primeiras sugestões não resolveriam o problema:]

É por isso que o índice de texto completo do MySQL não fará o trabalho, e nem o Lucene ou o Sphinx, todos sugeridos nas respostas. Eu já olhei para ambos, mas até onde eu sei, eles são baseados em indexaçãopalavras, excluindo palavras-chave e fazendo todo tipo de coisas sensíveis para uma pesquisa real de texto completo. No entanto, isso não é adequado, porque eu poderia estar procurando por um termo de pesquisa como "oison", que deve coincidir com "Roisonic Street", bem como "Poison-Ivy". A principal diferença aqui é que o termo de pesquisa é apenas umfragmento do conteúdo da coluna, que não precisa ser delimitado por nenhum caractere especial ou espaço em branco.

EDIT2: [Adicionadas mais algumas informações de segundo plano:] O recurso solicitado que deve ser implementado com base nisso é uma pesquisa muito solta para descrições de itens em um sistema de gerenciamento de mercadorias. Os usuários geralmente não sabem o número correto do item, mas apenas parte do nome do item. Infelizmente, a qualidade dessas descrições é bastante baixa, elas vêm de um sistema legado e não podem ser alteradas facilmente. Se, por exemplo, as pessoas procurassem uma marreta, elas entrariam no "trenó". Com um índice baseado em palavra / token, este não encontraria correspondências armazenadas como "marreta", mas apenas aquelas que escutam "marreta". Há todos os tipos de variações estranhas que precisam ser cobertas, tornando impraticável uma abordagem baseada em tokens.

Atualmente, a única coisa que podemos fazer éLIKE '%searchterm%' consulta, desabilitando efetivamente qualquer uso de índice e exigindo muitos recursos e tempo.

Idealmente, qualquer ferramenta desse tipo criaria um índice que me permitisse obter resultados para consultas semelhantes rapidamente, para que eu pudesse implementar uma pesquisa semelhante a um spotlight, recuperando apenas os dados "reais" da tabela MySQL por meio da chave primária quando um usuário selecionasse um registro de resultado.

Se possível, o índice deve ser atualizável (sem precisar de uma reconstrução completa), porque os dados podem ser alterados e devem estar disponíveis para pesquisa imediatamente por outros clientes.

Eu ficaria feliz em receber recomendações e / ou relatos de experiência.

EDIT3: solução comercial descobriu que "apenas funciona" Embora eu tenha recebido muitas respostas boas para essa pergunta, eu gostaria de observar aqui que, no final, fomos com um produto comercial chamado "QuickFind", produzido e vendido por uma empresa alemã chamada "HMB Datentechnik". Por favor, note que eu sounão afiliada a eles de alguma forma, porque pode parecer assim quando eu vou e descrevo o que o produto deles pode fazer. Infelizmente a sualocal na rede Internet parece bastante ruim e é apenas em alemão, mas o produto em si é realmente ótimo. Eu tenho atualmente uma versão de teste deles - você terá que contatá-los, sem downloads - e estou extremamente impressionado.

Como não há documentação completa disponível on-line, vou tentar descrever minhas experiências até agora.

O que eles fazem é criar um arquivo de índice personalizado com base no conteúdo do banco de dados. Eles podem se integrar via ODBC, mas pelo que sou informado, os clientes raramente fazem isso. Em vez disso - e é isso que provavelmente faremos - você gera uma exportação de texto (como CSV) de seu banco de dados principal e o alimenta para seu indexador. Isso permite que você seja completamente independente da estrutura da tabela real (ou de qualquer banco de dados SQL); Na verdade, exportamos dados reunidos em várias tabelas. Os índices podem ser incrementalmente atualizados mais tarde.

Com base no fato de que seu servidor (um mero 250kb ou mais, executando como um aplicativo de console ou serviço do Windows) serve para ouvir consultas em uma porta TCP. O protocolo é baseado em texto e parece um pouco "antigo", mas é simples e funciona. Basicamente, você apenas passa quais dos índices disponíveis você quer consultar e os termos de busca (fragmentos), delimitados por espaços. Existem três formatos de saída disponíveis, matriz HTML / JavaScript, XML ou CSV. Atualmente, estou trabalhando em um wrapper Java para o protocolo wire "datado". Mas os resultados são fantásticos: atualmente tenho um conjunto de dados de amostra de aproximadamente 500.000 registros com 8 colunas indexadas e meu aplicativo de teste aciona uma pesquisa em todas as 8 colunas para o conteúdo de um JTextFieldem cada toque de tecla enquanto está sendo editado e pode atualizar a exibição de resultados (JTable) em tempo real! Isso acontece sem ir para a instância do MySQL da qual os dados originalmente vieram. Com base nas colunas que você recebe de volta, você pode perguntar pelo registro "original" consultando o MySQL com a chave primária da linha (é necessário incluir no índice QuickFind, é claro).

O índice é de cerca de 30 a 40% do tamanho da versão de exportação de texto dos dados. A indexação foi principalmente ligada pela velocidade de E / S do disco; meus 500.000 registros levaram cerca de um minuto ou dois para serem processados.

É difícil descrever isso, já que achei difícil acreditar quando vi uma demonstração interna do produto. Eles apresentaram um banco de dados de endereços de 10 milhões de linhas e procuraram por fragmentos de nomes, endereços e números de telefone e, quando apertaram o botão "Pesquisar", os resultados voltaram em menos de um segundo - tudo feito em um notebook! Pelo que me disseram, muitas vezes se integram aos sistemas SAP ou CRM para melhorar os tempos de busca quando os agentes de call center apenas entendem fragmentos dos nomes ou endereços de um chamador.

De qualquer forma, eu provavelmente não vou melhorar muito descrevendo isso. Se você precisa de algo assim, você definitivamente deveria ir verificar isso.Google Tradutor faz um bom trabalho traduzindo seu site do alemão para o inglês, então isso pode ser um bom começo.

questionAnswers(10)

yourAnswerToTheQuestion