Como você mantém seu mecanismo de texto completo externo (Lucene, Solr, etc) sincronizado com os dados do banco de dados? Por exemplo, acompanhando inserções, exclusões, atualizações.
Minha solução atual envolve uma grande união de todas as consultas em registros modificados, que são pesquisadas pelo Lucene a cada poucos minutos.
Alguma solução melhor?
Obrigado!
Depende do seu mecanismo de banco de dados. Por exemplo, no Microsoft SQL Server, existem vários recursos de mecanismo de banco de dados que podem rastrear quais linhas foram alteradas e, em seguida, você pode obter apenas essas linhas em sua consulta periódica.
Outra técnica que vi é adicionar um campo UpdatedDateTime nas tabelas que você deseja pesquisar. Use um valor padrão da data/hora atual e adicione um acionador de atualização para que, sempre que o registro for atualizado, UpdatedDateTime seja redefinido para a data/hora atual. Lembre-se de que você provavelmente desejará indexar esse campo, pois o consultará com frequência. Em seguida, em seu aplicativo, basta pesquisar todos os registros em que UpdatedDateTime > a última vez que você atualizou.
Se você adotar a última abordagem, provavelmente desejará fazer repopulações completas periodicamente para detectar qualquer falha em que o aplicativo de pesquisa falhou por um tempo.
Use um banco de dados como o PostgreSQL que tenha pesquisa de texto completo incorporada.
Use uma ferramenta como o Hibernate e seu amigo Hibernate Search. O Hibernate Search irá inserir/atualizar/excluir seu índice lucene para você quando você inserir/atualizar/excluir registros no banco de dados.