2009-08-18 5 views
3

En Lucene, je peux faire ce qui suitObtenir l'ID Doc dans Lucene

doc.GetField("mycustomfield").StringValue(); 

Cette récupère la valeur d'une colonne dans le document d'un index.

Ma question, pour le même 'doc', est-il un moyen d'obtenir le Doc. Id? Luke l'affiche donc il doit y avoir un moyen de comprendre cela. J'en ai besoin pour supprimer des documents sur les mises à jour.

J'ai parcouru les documents mais je n'ai pas trouvé le terme à utiliser dans GetField ou s'il existe déjà une autre méthode.

+2

L'id Lucene intérieure n'est pas défini dans la pierre. Une meilleure façon de supprimer des documents est de stocker un identifiant unique dans l'un des champs du document, et de le supprimer en utilisant sa valeur. –

+0

Comme dans Lucene 3.0 Hits classe est obsolète, peut-on suggérer, comment obtenir l'ID doc dans d'autres versions? Merci. – Emma

Répondre

2

Il s'avère que vous devez faire:

var hits = searcher.Search(query); 
var result = hits.Id(0); 

Contrairement à

var results = hits.Doc(i); 
var docid = results.<...> //there's nothing I could find there to do this 
1

Je soupçonne que la raison pour laquelle vous éprouvez des difficultés à trouver de la documentation sur la détermination de l'identifiant d'un document Lucene particulier est parce qu'ils ne sont pas vraiment "id" s. En d'autres termes, ils ne sont pas nécessairement destinés à être recherchés et stockés pour une utilisation ultérieure. En fait, si vous le faites, vous n'obtiendrez pas les résultats que vous espériez, car les ID changeront lorsque l'index sera optimisé. Considérez plutôt les ID comme le "décalage" actuel d'un document particulier depuis le début de l'index, qui changera lorsque les documents supprimés seront physiquement retirés des fichiers d'index.

Maintenant que nous avons dit, la bonne façon de regarder le « id » d'un document est:


QueryParser parser = new QueryParser(...); 
IndexSearcher searcher = new IndexSearcher(...); 
Hits hits = searcher.Search(parser.Parse(...); 

for (int i = 0; i < hits.Length(); i++) 
{ 
    int id = hits.Id(i); 

    // do stuff 
}