2010-07-13 4 views
2

Je voudrais utiliser Lucene pour indexer une table dans une base de données existante. Je pensais que le processus est comme:Lucene Indexing

  1. Créer un « champ » pour chaque colonne dans la table
  2. magasin tous les champs
  3. « ANALYSER » tous les champs à l'exception du terrain avec la clé primaire
  4. Stockez chaque ligne de la table en tant que document Lucene.

Alors que la plupart des colonnes de ce tableau sont petites, l'une est énorme. Cette colonne contient également la plus grande partie des données sur lesquelles les recherches seront effectuées.

Je sais que Lucene offre une option pour ne pas stocker un champ. Je pensais à deux solutions:

  1. magasin le champ quelle que soit la taille et si un coup est trouvé pour une recherche, le champ approprié aille chercher du document
  2. Ne pas stocker le terrain et si un coup est trouvé pour une recherche, interroger la base de données pour obtenir les informations pertinentes sur

Je sais qu'il ne peut pas être une taille unique réponse ...

Répondre

2

sûr, votre système sera plus réactif si vous stockez tout sur Lucene. Le champ stocké n'affecte pas l'heure de la requête, cela ne fera que rendre la taille de votre index plus grande. Et probablement pas plus gros si ce n'est qu'une petite partie des lignes qui ont beaucoup de données. Donc, si la taille de l'index n'est pas un problème pour votre système, j'irais avec ça.

+1

+1 pour la réponse de Pascal. Vous pouvez également marquer le grand champ et * ne pas le stocker *. De cette façon, vous pouvez interroger (rechercher) sur le champ, obtenir l'identificateur de document/enregistrement approprié et récupérer l'enregistrement à partir de db. – Mikos

+0

Merci pour vos réponses. Si je décide de ne pas stocker de champ, je ne serais pas non plus en mesure d'utiliser la surbrillance (module contrib Lucene) pour mettre en évidence les résultats de recherche? –

+0

Cela pourrait être fait sans stocker le texte, mais ce n'est pas facile. Voir http: //www.lucidimagination.com/search/document/5ea8054ed8348e6f/highlight_arbitrary_text # 60f592f5ff0de0c5 –

1

Je ne suis pas du tout d'accord avec la réponse d'un Pascal. La taille de l'index peut avoir un impact majeur sur les performances de recherche. Les principales raisons sont les suivantes:

  • les zones stockées augmentent la taille de l'index. Cela pourrait être un problème avec un système d'E/S relativement lent;
  • Les champs stockés sont tous chargés lorsque vous chargez le document en mémoire. Cela pourrait être un bon stress pour le GC
  • les champs stockés sont susceptibles d'avoir un impact sur le temps de réouverture du lecteur.

La réponse finale, bien sûr, cela dépend. Si les données d'origine sont déjà stockées ailleurs, il est recommandé de les récupérer dans le magasin de données d'origine.

+1

Lucene ne doit pas être considérée comme la source de données faisant autorité. Les données doivent être stockées ailleurs de toute façon, faites la requête basée sur un mot clé sur un champ de texte non stocké, puis faites la recherche pour obtenir les données réelles de la source unique de la vérité. – Glenn

0

Lorsque vous ajoutez une ligne de la base de données à Lucene, vous pouvez déterminer si elle doit réellement écrire dans l'index inversé. Sinon, vous pouvez utiliser Index.NOT pour éviter d'écrire trop de données dans l'index inversé. En attendant, vous pouvez juger où une colonne sera interrogée par valeur-clé. Sinon, vous n'avez pas besoin d'utiliser Store.YES pour stocker les données.