Lucene.Net synchronisation écriture / lecture

  1. Puis-je écrire (avec IndexWriter ) de nouveaux documents dans l’index lorsqu’il est ouvert en lecture (avec IndexReader )? Ou dois-je fermer la lecture avant d’écrire?

  2. Puis-je lire / rechercher des documents (avec IndexReader ) dans l’index lorsqu’il est ouvert en écriture (avec IndexWriter )? Ou dois-je fermer l’écriture avant de lire?

  3. Lucene.Net est-il en sécurité ou non? Ou dois-je écrire le mien?

Vous pouvez avoir n’importe quel nombre de lecteurs / chercheurs ouverts à tout moment, mais un seul auteur. Ceci est appliqué par un verrou spécifique à un répertoire, impliquant généralement un fichier nommé “write.lock”.

Les lecteurs ouvrent des instantanés et les rédacteurs ajoutent plus de données à l’index. Les lecteurs doivent être ouverts ou rouverts ( IndexReader.Reopen ) une fois que votre rédacteur a IndexWriter.Commit ( IndexWriter.Commit ) les données à IndexWriter.Commit , à moins que vous n’utilisiez des recherches en temps quasi réel. Cela implique un lecteur spécial renvoyé de ( IndexWriter.GetReader ) qui sera en mesure de voir le contenu jusqu’au moment où l’appel à GetReader a été exécuté. Cela signifie également que le lecteur peut voir des données qui ne seront jamais validées en raison de l’appel de la logique d’application à IndexWriter.Rollback .

Les chercheurs utilisent des lecteurs, donc des limitations identiques. (Un nombre illimité d’entre eux, ne peut voir que ce qui est déjà engagé, sauf s’il est basé sur un lecteur en temps quasi réel.)

Lucene est thread-safe et la meilleure pratique consiste à partager des lecteurs et des chercheurs entre plusieurs threads, tout en vérifiant que IndexReader.IsCurrent() == true . Vous pourriez avoir un thread en arrière-plan en cours d’exécution qui rouvre le lecteur une fois qu’il détecte les modifications, crée un nouveau chercheur, puis laisse les threads principaux l’utiliser. Cela vous permettrait également de préchauffer n’importe quel FieldCache que vous utilisez pour augmenter la vitesse de recherche une fois que le nouveau chercheur est en place.

Comme je l’ai trouvé dans cette liste de diffusion

Lucene.NET est thread-safe. Ainsi, vous pouvez partager la même instance de IndexWriter ou IndexSearcher entre les threads. L’utilisation d’un verrou en écriture empêche également l’ouverture d’une seconde instance IndexWriter avec le même index.

Comme je vois, je peux écrire et lire séparément. Je vais le vérifier;)