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