2008-10-11 11 views
15

Lorsque j'utilise Lucene.Net avec ASP.NET, j'imagine qu'une requête Web peut déclencher une mise à jour de l'index pendant qu'une autre requête Web effectue une recherche. Est-ce que Lucene.Net a intégré la possibilité de gérer l'accès simultané, ou dois-je le gérer, pour éviter d'être "utilisé par un autre processus"?Lucene.Net gère-t-il plusieurs threads accédant au même index, l'un indexant pendant que l'autre recherche?

EDIT: Après avoir lu des documents et expérimenté, voici ce que je pense avoir appris: Il y a deux problèmes, la sécurité des threads et la simultanéité. Le multithreading est "sûr" en ce sens que vous ne pouvez rien faire de mal à l'index. Mais, il est sûr au prix d'un seul objet ayant un verrou sur l'index en même temps. Le deuxième objet viendra et lèvera une exception. Ainsi, vous ne pouvez pas laisser une recherche ouverte et attendre un écrivain dans un autre thread pour pouvoir mettre à jour l'index. Et si un thread est occupé à mettre à jour l'index, essayer de créer un chercheur échouera. En outre, les chercheurs voient l'index tel qu'il était au moment où ils l'ouvrent, donc si vous les gardez et mettez à jour l'index, ils ne verront pas les mises à jour.

Je voulais que mes chercheurs voient les dernières mises à jour. Ma conception, et cela semble fonctionner jusqu'à maintenant, est que mes rédacteurs et mes chercheurs partagent un verrou, de sorte qu'ils n'échouent pas - ils attendent simplement - jusqu'à ce que l'écriture ou la recherche en cours soit terminée.

+0

Pourriez-vous expliquer comment avez-vous implémenté les verrous? Utilisez-vous des verrous en lecture et en écriture ou juste un verrou partagé? –

+0

Un verrou partagé. J'ai écrit ce que j'ai fait: http://ifdefined.com/blog/post/Full-Text-Search-in-ASPNET-using-LuceneNET.aspx –

+0

Ce que vous dites dans votre question est faux: "Donc, vous pouvez Ne laissez pas une recherche ouverte et attendez un écrivain dans un autre thread pour être en mesure de mettre à jour l'index.Et si un thread est occupé à mettre à jour l'index, alors essayer de créer un chercheur échouera. " Comme mentionné dans les autres réponses: "Un graveur d'index ou un lecteur peut éditer les fichiers d'index lucene pendant que les recherches sont en cours" et vice-versa. –

Répondre

2

Vous n'avez pas de problème avec cela, mais plutôt de gérer les écritures simultanées dans l'index. J'ai eu un chemin plus facile avec SOLR, qui résume la plupart de ces différences pour moi car il fonctionne comme un serveur.

21

Selon this page,

indexation et la recherche ne sont pas seulement thread-safe, mais le processus en toute sécurité. Ce qui cela signifie que:

  • chercheurs d'index multiples peuvent lire les fichiers d'index de Lucene en même temps.
  • Un écrivain d'index ou d'un lecteur peut modifier les fichiers d'index de Lucene tandis que les recherches sont en cours
  • auteurs d'index multiples ou lecteurs peuvent essayer de modifier les fichiers d'index Lucene en même temps (il est important pour l'écrivain d'index/reader à fermer afin qu'il libère le verrou de fichier ). Toutefois, l'analyseur de requête n'est pas thread-safe, de sorte que chaque thread utilisant l'index doit avoir son propre analyseur de requête .

L'auteur de l'indice est cependant fil sécurité, de sorte que vous pouvez mettre à jour l'index alors que les gens sont à la recherche il. Cependant, vous devez alors vous assurer que que les threads avec l'index ouvert les ferment et ouvrent les nouveaux , pour obtenir les données nouvellement mises à jour.

+0

Quelle est la surcharge de l'index d'ouverture à chaque requête? –

+1

Nous avons un index de recherche assez important (multi-gigaoctets), et le coût d'ouverture d'un index à chaque requête a été négligeable. –

+1

Il convient de noter que cet article est sur le Lucene original pour Java. Il n'y a aucune mention de l'implémentation de .NET, ni si le comportement décrit est une caractéristique du "standard" de Lucene (et donc serait réimplémenté dans Lucene.Net) ou si c'est un comportement spécifique à l'implémentation. –

3

Vous pouvez avoir des problèmes, si votre fil d'indexation crée un nouveau document qui se traduit par la fusion de certains segments d'index, puis les segments fusionnés seront supprimés et nouveau segment seront créés.Le problème est que votre indexeur a chargé tous les segments quand il a été ouvert, de sorte qu'il a des "pointeurs" vers les segments qui existaient quand il a été ouvert. Maintenant, si l'indexeur fusionne un segment et supprime un segment, votre chercheur d'index pense toujours que le fichier de segment existe et échouera avec une "erreur de fichier non trouvé". Ce que vous devez vraiment faire est de séparer votre index accessible en écriture de votre index interrogeable, en utilisant SOLR ou en faisant votre propre réplication d'instantané d'index semblable à ce que fait SOLR. J'ai construit un système très similaire à SOLR en utilisant .NET et Lucene.NET sur Windows, en utilisant des liens physiques NTFS pour rendre la réplication d'instantanés efficace. Je peux vous donner plus d'informations si vous êtes intéressé.

+0

Bonjour Bob, J'utilise SolrNet avec asp.net mvc. Je commence à rencontrer de vrais problèmes avec l'index corrompant tout en essayant d'ajouter de nouveaux éléments pendant que les recherches sont effectuées. Je vous serais reconnaissant de bien vouloir donner un aperçu des meilleures pratiques. – Jordan

Questions connexes