Pergunta

Eu só comecei a integração Hibernate Search com o meu aplicativo Hibernate. Os dados são indexados usando Session Hibernate cada vez que eu iniciar o servidor.

FullTextSession fullTextSession = Search.getFullTextSession(session);
Transaction tx = fullTextSession.beginTransaction();

List books = session.createQuery("from Book as book").list();
for (Book book : books) {
    fullTextSession.index(book);
}

tx.commit(); //index is written at commit time     

É muito estranho e o servidor leva 10 minutos para começar. Estou fazendo a isso no caminho certo?

Eu escrevi um programador que irá atualizar os índices periodicamente. Será que esta atualização as entradas de índice existentes automaticamente, ou criar índices duplicados?

Foi útil?

Solução

Conforme detalhado na guia Hibernate Search, ponto 3.6.1, se você estiver usando anotações (por agora o padrão), os ouvintes que a indexação de lançamento na loja são registradas por padrão:

Hibernate Search está habilitado para fora do caixa quando usando Hibernate Annotations ou Hibernate EntityManager. Se, por algum motivo você precisa desativá-lo, conjunto hibernate.search.autoregister_listeners como falsa.

Um exemplo de como ligá-los à mão:

 hibConfiguration.setListener("post-update", new FullTextIndexEventListener());
 hibConfiguration.setListener("post-insert", new FullTextIndexEventListener());
 hibConfiguration.setListener("post-delete", new FullTextIndexEventListener());

Tudo que você precisa fazer é anotar as entidades que você deseja ser indexado com o

@Indexed(index = "fulltext")

anotação e, em seguida, fazer a anotação de grão fino sobre os campos, conforme detalhado no guia do usuário.

Então, você não deve nem indexação lançamento com a mão quando armazenar, nem indexação relançamento whae o aplicativo é iniciado, a menos que você tem entidades que foram armazenados antes de indexação foi ativado.

Você pode ter problemas de desempenho quando você está armazenando um objeto que dizer tem um "anexo" e assim você está indexando que no mesmo escopo da transação que está armazenando a entidade. Veja aqui:

Hibernate Search e texto desligada extração

para uma solução que resolve este problema.

Outras dicas

Desde que você está usando um FSDirectoryProvider (que é o padrão), o índice Lucene é mantido no disco. Isso significa que não há necessidade de índice em muito startup. Se você tiver banco de dados existente que você quer, naturalmente, para criar um índice inicial usando a funcionalidade fullTextSession.index (). No entanto, isso não deve ser na inicialização do aplicativo. Considere expor algum tipo de url gatilho, ou interface de administração. Depois de ter o índice inicial Eu recomendaria usar indexação automática. Isso significa que o índice Lucene é atualizado automaticamente se uma livros são criados / atualizado / excluído. indexação automática também deve ser ativado por padrão.

Eu recomendo que você consulte as secções automáticas e manuais de indexação no manual online - http://docs.jboss.org/hibernate/stable/search/reference/en/html_single

- Hardy

Eu uso atualmente indexação automática de Hibernate Search com JPA e ele funciona muito bem. Para criar os seus índices inicialmente você pode simplesmente ligar para o seguinte:

    FullTextEntityManager fullTextEntityManager = 
                    Search.getFullTextEntityManager(entityManager);

    try {
       fullTextEntityManager.createIndexer().startAndWait();
    } catch (InterruptedException e) {
       // Exception handling
    }

onde "entityManager" é apenas um javax.persistence.EntityManager. O índice de vontade acima de todos os campos marcados com @Field para todas as entidades marcadas como @Indexed.

Então, enquanto você fazer todas as suas atualizações, etc, através do gerenciador de entidade os índices são atualizados automaticamente. Você pode, então, procurar, como de costume, mas certifique-se de recriar o seu EntityManager em cada pesquisa (você pode usar o EntityManagerFactory a fazê-lo).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top