Cum combin utilizarea db4o pentru a stoca date și Lucene pentru a indexa datele pentru căutare rapidă?

Sunt nou la db4o și la Lucene.

În prezent, folosesc db4o pentru a-mi păstra datele într-o aplicație Android. Am nevoie de capacitatea de a efectua căutări rapide, precum și de a oferi sugestii utilizatorului (de exemplu, sugestii de completare automată).

Un poster SO a menționat utilizarea Lucene pentru a indexa datele și db4o pentru a le stoca.

A implementat cineva această abordare? Dacă da, aș aprecia dacă împărtășesc abordarea generală? Care sunt alternativele?


person Soumya Simanta    schedule 27.04.2011    source sursă
comment
Aș merge să folosesc lucene doar ca stocare de date. nu este nevoie de db4o sau de ce ai folosi unul? (doar stocați documentul ca json într-un câmp stocat și probabil comprimat fără indexare)   -  person Karussell    schedule 20.10.2011


Răspunsuri (1)


Am folosit Lucene pentru a extrage cuvinte cheie din elementele care urmează să fie stocate în baza de date și pentru a stoca ceea ce eu numesc obiecte „extensie cuvinte cheie” care indică obiectele de domeniu corespunzătoare. Acest lucru a făcut ca obiectele de domeniu să fie găsite după cuvânt cheie (permițând, de asemenea, strângerea) și a separat preocupările legate de cuvintele cheie. Baza de date a fost construită dintr-un set mare de date static (baza de date USDA cu nutrienți alimentari), așa că nu a trebuit să-mi fac griji cu privire la modificările în timpul rulării. Astfel, această soluție este limitată în forma sa actuală...

Prima parte a soluției a fost să scrieți o mică bucată de cod care să preia ceva text și să extragă atât cuvintele cheie, cât și tulpinile corespunzătoare (folosind „bulgărele de zăpadă” de la Lucene) într-o hartă. Utilizați acest lucru pentru a extrage cuvintele cheie/rădăcinile din unele obiecte de domeniu pe care le stocați în baza de date. Am păstrat cuvintele cheie originale, astfel încât să pot crea un fel de statistici privind căutările efectuate.

A doua parte a fost să construiesc obiecte pe care le-am numit „extensii de cuvinte cheie” care stochează tulpinile ca o matrice și cuvintele cheie corespunzătoare ca o altă matrice și au un pointer către obiectele de domeniu corespunzătoare care aveau cuvintele cheie (am folosit matrice pentru că funcționează mai ușor cu DB4O). De asemenea, am subclasat clasa mea KeywordExtension pentru a corespunde tipului de obiecte de domeniu - de exemplu, stocam un obiect de domeniu „Nutrient” și un obiect „NutrientKeywordExtension” corespunzător.

A treia parte este să colectezi textul de căutare introdus de utilizator, să folosești din nou stemmerul pentru a extrage tulpinile și să cauți obiectele NutrientKeywordExtension cu acele tulpini. Puteți apoi să luați obiectele Nutrient la care indică acele extensii și, în final, să le prezentați ca rezultate de căutare.

După cum am spus, baza mea de date era statică - a fost creată prima dată când rulează aplicația. Într-o bază de date dinamică, ar trebui să vă faceți griji cu privire la menținerea sincronizate a nutrienților și a extensiilor de cuvinte cheie corespunzătoare. O soluție ar fi să îmbinați extensia de cuvinte cheie nutrienți și nutrienți într-o singură clasă dacă nu vă deranjează să aveți acele lucruri în obiectele de domeniu (nu îmi place asta). În caz contrar, trebuie să țineți cont de extensiile de cuvinte cheie de fiecare dată când creați/editați/ștergeți obiectele domeniului.

Sper că acest exemplu limitat să ajute.

person Sam Stainsby    schedule 30.04.2011
comment
@Sam - mulțumesc pentru răspuns. Îmi puteți da o idee despre dimensiunea indexului și cât timp a durat pentru a construi indexul inițial pe telefon. - person Soumya Simanta; 03.05.2011
comment
@Soumyama, indecșii în acest caz sunt încorporați de setul de obiecte KeywordExtension. Există mult mai multe date în baza de date și nu am stabilit ce spațiu ocupă aceste obiecte specifice. Majoritatea spațiului pe care îl bănuiesc este ocupat de cele 555.726 de obiecte de intrare de nutrienți, în orice caz, ceea ce duce la un fișier de bază de date de 45 MB. Toate acestea sunt pe o aplicație web Granite (Granite este propria noastră stivă open source Scala/Wicket/DB4O), nu pe un telefon. Este nevoie de puțin peste un minut pe un desktop cu 6 nuclee pentru a genera întreaga bază de date DB4O de la zero. - person Sam Stainsby; 04.05.2011
comment
@Sam - acestea sunt informații utile. 45 MB este dimensiunea fișierului DB4O db sau dimensiunea indexului Lucene? - person Soumya Simanta; 04.05.2011
comment
@Soumya 45 MB este dimensiunea totală a fișierului DB4O db - person Sam Stainsby; 04.05.2011
comment
@Sam - mulțumesc. Îmi puteți spune, vă rog, dimensiunea indicelui Lucene? - person Soumya Simanta; 04.05.2011
comment
@Soumya După cum am spus mai devreme, indecșii în acest caz sunt încorporați de setul de obiecte KeywordExtension... și nu am stabilit ce spațiu ocupă aceste obiecte specifice. . Este o fracțiune din dimensiunea bazei de date, dar fără alte lucrări, nu știu ce fracție. Tot ce pot spune este că aici există un obiect extensie per obiect de domeniu. - person Sam Stainsby; 05.05.2011
comment
@Sam Este acesta un proiect open source? Ai de gând să lansezi un cod? Comunitatea db4o ar putea beneficia de ceea ce ați făcut (este minunat) - person German; 20.05.2011
comment
Nu este în prezent open source - a fost într-adevăr un caz de testare pentru cadrul nostru Granite (care este open source). Se va gândi ce să facă cu el. - person Sam Stainsby; 21.05.2011
comment
@Germană - acum puteți vedea o interfață web de bază pentru baza de date de nutrienți pentru alimente aici: nutrients.ofthings.net - person Sam Stainsby; 12.08.2011