2010-07-15 11 views
0

J'essaie d'indexer une table dans une base de données en utilisant Lucene. J'utilise Lucene juste pour l'indexation, les champs ne sont pas stockés. La table mentionnée ci-dessus comporte cinq colonnes (ID utilisateur (PK), description, numéro de rapport, type de rapport, rapport).Lucene Indexation et recherche

J'ai l'intention d'utiliser une combinaison de userid, reportnumber et de type de rapport pour récupérer des données de la base de données, si Lucene trouve un hit.

Un enregistrement dans la table peut s'étendre sur plusieurs lignes, par ex.

JQ123, SOMEDESCRIPTION, 1, FIN, le contenu du rapport fin
JQ123, AnotherDescription, 2, MATH, le contenu du rapport de mathématiques
JQ123, YetAnotherDesc, 3, MATH, contenu d'un autre rapport de mathématiques
JD456, MoreDesc , 1, STAT, contenu du rapport statistique ..sur

Certains types de rapports, par exemple (MATH) ont des contenus hautement structurés (XML, stockés sous forme de chaîne dans la dernière colonne) et dans le futur, je pourrais vouloir étoffer une partie du contenu en tant que champ du document.

Ma stratégie jusqu'ici a été de créer un document Lucene pour chaque ligne et l'indexer. Ma pensée derrière cela étant cela 1. Il est facile et semble logique (pour moi) 2. si je finis par extraire le contenu de certains types de documents et les rendre dans les champs, tout ce qui serait nécessaire est un Si l'instruction vérifie le rapport, saisissez et créez ces nouveaux champs. Voici le code correspondant:

public void createDocument(){ 
Document luceneDocument=new Document(); 
luceneDocument.add(new Field("userid", userID, Field.Store.NO, Field.Index.NOT_ANALYZED)); 
luceneDocument.add(new Field("reportnumber", reportNum, Field.Store.NO, Field.Index.NOT_ANALYZED)); 
luceneDocument.add(new Field("reporttype", reportType, Field.Store.NO, Field.Index.NOT_ANALYZED)); 
luceneDocument.add(new Field("description", description, Field.Store.NO, Field.Index.ANALYZED)); 
luceneDocument.add(new Field("report", report, Field.Store.NO, Field.Index.ANALYZED)); 

if(reporttype.equalsIgnoreCase("MATH"){ 
luceneDocument.add(new Field("more fields", field content, Field.Store.NO, Field.Index.ANALYZED)); 
} 
indexwriter.add(luceneDocument) 
indexwriter.close 
}   

1. le fait d'avoir différents documents pour le même enregistrement incidence sur l'efficacité de la recherche de Lucene de quelque façon?
2. Est-ce que cette approche a un espace disque important sur la tête par rapport à avoir un document par enregistrement dans Lucene (je ne stocker tout Les champs)?

Merci d'avance pour votre réponse,

Répondre

0

D'abord, notez comment l'index est mis en place. L'index de chaque terme ressemble à:

[terme] [docid] [docid] ...

où le s '[docid] sont les ID des documents qui contiennent ce terme. Donc, pour répondre à vos questions:

  1. Si par ex. MATH et STATS contenaient le même terme, ils seraient listés deux fois ici. Et donc la recherche devrait regarder deux documents, quand il devrait en théorie seulement besoin d'en regarder un. Mais c'est une pénalité très minime.
  2. Je suppose que vous devez stocker au moins un ID pour chaque document, de sorte que vous verrez une augmentation de stockage mineur. Ce sera (longueur de l'identifiant) * (nombre de documents par ligne). Encore une fois, c'est trivial.

Un problème plus important est le fait que les requêtes ne peuvent pas être normées de manière appropriée. Par exemple, une recherche trouve la ligne n ° 1 qui correspond dans MATH et STATS et la ligne n ° 2 qui correspond uniquement à MATH. Vous devrez manuellement classer la ligne 1 plus haut, car Lucene ne saura pas que les deux documents sont en fait la même ligne.En bref: à moins d'avoir un index absolument massif, je ne m'inquiéterais pas trop du stockage/de la performance. Mais je m'inquiéterais de la façon dont vous allez marquer cette requête.

Questions connexes