2013-01-03 6 views
0

J'ai 7 classes d'entités à indexer en utilisant Hibernate Search. Après avoir essayé à la fois MassIndexer et FlushToIndexes, le processus de l'indexeur est passé à travers les plus petits entites mais les plus grandes entités/tables n'ont pas fini, même si un MassIndexerProgressMonitor a dit que l'indexation était finie. Le processus se bloque quand il atteint 100-200 Mo alloués. Je veux m'assurer que le processus d'indexation se termine correctement.Le processus Hibernate Search Indexer se bloque après un demi-travail

Questions: Le code est-il correct? Doit-on hiberner ou paramétrer la base de données?


Environnement: 64 bits Windows 7, JBoss, Struts2, Hibernate, Hibernate Search, Lucene, SQL Server. L'index de recherche d'Hibernate est placé dans le système de fichiers.


Code MassIndexer exemple:

final Session session = HibernateSessionFactory.getSession(); 
    final FullTextSession fullTextSession = Search.getFullTextSession(session); 
    MassIndexerProgressMonitor monitor = new IndexProgressMonitor("Kanalregister"); 
    fullTextSession.createIndexer() 
       .purgeAllOnStart(true) 
       .progressMonitor(monitor) 
       .batchSizeToLoadObjects(BATCH_SIZE) // 250000 
       .startAndWait(); 

FlushToIndexes exemple de code: (.. De réf Hibernate doc) (semble index ok, mais ne se termine jamais)

final Session session = HibernateSessionFactory.getSession(); 
    final FullTextSession fullTextSession = Search.getFullTextSession(session); 
    fullTextSession.setFlushMode(FlushMode.MANUAL); 
    fullTextSession.setCacheMode(CacheMode.IGNORE); 
    Transaction t1 = fullTextSession.beginTransaction(); 
    // Scrollable results will avoid loading too many objects in memory 
    ScrollableResults results = fullTextSession.createCriteria(Land.class) 
              .setFetchSize(BATCH_SIZE) // 250000 
              .scroll(ScrollMode.FORWARD_ONLY); 
    int index = 0; 
    while (results.next()) { 
    index++; 
    fullTextSession.index(results.get(0)); // index each element 
    if (index % BATCH_SIZE == 0) { 
     fullTextSession.flushToIndexes(); // apply changes to indexes 
     fullTextSession.clear(); // free memory since the queue is processed 
    } 
    } 
    t1.commit(); 

Le code est vérifié pour se terminer en se moquant de toute indexation wo rk, en utilisant le paramètre suivant dans hibernate.cfg.xml:

<property name="hibernate.search.default.worker.backend">blackhole</property> 
+0

Salut, pourriez-vous préciser: - quelle base de données - quelles versions - laquelle des deux méthodes fonctionne? – Sanne

+0

Salut, j'utilise SQL Server 2008. MassIndexer fonctionne à mi-chemin, FlushToIndexes est capable de construire l'index pour les petites tables. (Ops, tout en essayant une plus grande table, j'ai eu quelques erreurs de configuration pour la plus grande table, accroche, je fixerai) –

+0

Votre taille de lot est incroyablement élevée: habituellement elle devrait être quelque chose entre 5 et 100; Cependant, je ne pense pas que cela explique le problème. Pourriez-vous vérifier l'activité du GC et publier un vidage complet? Cela pourrait être plus adapté aux forums Hibernate Search https://forum.hibernate.org/viewforum.php?f=9 – Sanne

Répondre

0

Le code ci-dessus est validé et correct.

Mon problème avec la console qui ne se termine pas est probablement lié à Eclipse, car une impression à la fin de main() était en effet affichée.

Certaines classes d'entités manquantes (dans mon modèle) n'étaient pas correctement signalées. Une fois que j'en ai été informé et ajouté à mon modèle, le processus d'indexation s'est terminé avec succès pour MassIndexer, comme en témoignent 3+ fichiers dans chaque répertoire de l'index lucene.

Questions connexes