Comment combiner l'utilisation de db4o pour stocker des données et de Lucene pour indexer les données pour une recherche rapide ?

Je suis nouveau sur db4o et Lucene.

Actuellement, j'utilise db4o pour conserver mes données sur une application Android. J'ai besoin de pouvoir effectuer des recherches rapides et de fournir des suggestions à l'utilisateur (par exemple, des suggestions de saisie semi-automatique).

Une affiche SO mentionnait l'utilisation de Lucene pour indexer les données et de db4o pour les stocker.

Quelqu'un a-t-il mis en œuvre cette approche ? Si oui, j'apprécierais qu'ils partagent l'approche globale ? Quelles sont les alternatives ?


person Soumya Simanta    schedule 27.04.2011    source source
comment
J'utiliserais Lucene uniquement comme stockage de données. pas besoin de db4o ou pourquoi en utiliseriez-vous un ? (stockez simplement le document au format json dans un champ probablement compressé stocké et non indexé)   -  person Karussell    schedule 20.10.2011


Réponses (1)


J'ai utilisé Lucene pour extraire des mots-clés d'éléments à stocker dans la base de données et stocker ce que j'appelle des objets « d'extension de mot-clé » qui pointent vers les objets de domaine correspondants. Cela a rendu les objets de domaine trouvables par mot-clé (permettant également la recherche de racines) et a séparé les problèmes de mots-clés. La base de données a été construite à partir d'un grand ensemble de données statiques (la base de données sur les nutriments alimentaires de l'USDA), je n'ai donc pas eu à me soucier des changements pendant l'exécution. Ainsi cette solution est limitée dans sa forme actuelle...

La première partie de la solution consistait à écrire un petit morceau de code qui prend du texte et extrait les deux les mots-clés et les radicaux correspondants (en utilisant le radical « Boule de neige » de Lucene) dans une carte. Vous l'utilisez pour extraire les mots-clés/tiges de certains objets de domaine que vous stockez dans la base de données. J'ai conservé les mots-clés d'origine afin de pouvoir créer une sorte de statistiques sur les recherches effectuées.

La deuxième partie consistait à construire des objets que j'appelais « extensions de mots-clés » qui stockaient les radicaux sous forme de tableau et les mots-clés correspondants sous forme d'un autre tableau et qui avaient un pointeur vers les objets de domaine correspondants contenant les mots-clés (j'ai utilisé des tableaux car ils fonctionnent plus facilement avec DB4O). J'ai également sous-classé ma classe KeywordExtension pour qu'elle corresponde au type d'objet de domaine particulier - ainsi, par exemple, je stockais un objet de domaine « Nutrient » et un objet « NutrientKeywordExtension » correspondant.

La troisième partie consiste à collecter le texte de recherche saisi par l'utilisateur, à utiliser à nouveau le stemmer pour extraire les tiges et à rechercher les objets NutrientKeywordExtension avec ces tiges. Vous pouvez ensuite récupérer les objets Nutrient vers lesquels pointent ces extensions, et enfin les présenter comme résultats de recherche.

Comme je l'ai dit, ma base de données était statique - elle est créée lors de la première exécution de l'application. Dans une base de données dynamique, vous devrez vous soucier de synchroniser les nutriments et les extensions de mots clés correspondantes. Une solution serait de fusionner l'extension de mot-clé nutriments et nutriments en une seule classe si cela ne vous dérange pas d'avoir ces éléments dans vos objets de domaine (je n'aime pas ça). Sinon, vous devez prendre en compte les extensions de mots clés chaque fois que vous créez/modifiez/supprimez vos objets de domaine.

J'espère que cet exemple limité vous aidera.

person Sam Stainsby    schedule 30.04.2011
comment
@Sam - merci d'avoir répondu. Pouvez-vous me donner une idée de la taille de l'index et du temps qu'il a fallu pour créer l'index initial sur le téléphone. - person Soumya Simanta; 03.05.2011
comment
@Soumyama, les index dans ce cas sont incarnés par l'ensemble des objets KeywordExtension. Il y a beaucoup plus de données dans la base de données et je n'ai pas déterminé l'espace qu'occupent ces objets particuliers. Je suppose que la majorité de l'espace est de toute façon occupée par les 555 726 objets d'entrée de nutriments, ce qui conduit à un fichier de base de données de 45 Mo. Tout cela se trouve sur une application Web Granite (Granite est notre propre pile open source Scala/Wicket/DB4O), pas sur un téléphone. Il faut un peu plus d'une minute sur un ordinateur de bureau à 6 cœurs pour générer l'intégralité de la base de données DB4O à partir de zéro. - person Sam Stainsby; 04.05.2011
comment
@Sam - ce sont des informations utiles. 45 Mo est la taille du fichier DB4O db ou la taille de l'index Lucene ? - person Soumya Simanta; 04.05.2011
comment
@Soumya 45 Mo est la taille totale du fichier de base de données DB4O - person Sam Stainsby; 04.05.2011
comment
@Sam - merci. Pouvez-vous s'il vous plaît me dire la taille de l'indice Lucene ? - person Soumya Simanta; 04.05.2011
comment
@Soumya Comme je l'ai déjà dit, les index dans ce cas sont incarnés par l'ensemble des objets KeywordExtension ... et je n'ai pas déterminé l'espace occupé par ces objets particuliers. . C'est une fraction de la taille de la base de données, mais sans autre travail, je ne sais pas quelle fraction. Tout ce que je peux dire, c'est qu'il y a ici un objet d'extension par objet de domaine. - person Sam Stainsby; 05.05.2011
comment
@Sam Est-ce un projet open source ? Allez-vous publier du code ? La communauté db4o pourrait bénéficier de ce que vous avez fait (c'est génial) - person German; 20.05.2011
comment
Pas actuellement open source - c'était vraiment un cas de test pour notre framework Granite (qui est open source). Je réfléchirai à quoi en faire. - person Sam Stainsby; 21.05.2011
comment
@Allemand - vous pouvez maintenant voir une interface utilisateur Web de base pour la base de données sur les nutriments alimentaires ici : nutrients.ofthings.net - person Sam Stainsby; 12.08.2011