Lucene exactă

Am avut această problemă pe termen lung în care nu înțelegeam cum să punem în practică un fel sau un clasament decent Lucene. Spuneți că am o listă de orașe și populațiile lor. Dacă cineva caută "nou" sau "london", vreau lista cu prefixele ordonate după populație și am lucrat cu o căutare prefixă și un fel de câmp inversat, unde există un câmp de populație, IE New Mexico, New York ; sau Londra, Londonderry.

Cu toate acestea, de asemenea, vreau întotdeauna numele exact de potrivire să fie în partea de sus. Deci, în cazul "Londrei", lista ar trebui să arate "Londra, Londra, Londonderry" unde primul Londra este în Regatul Unit și al doilea Londra este în Connecticut, chiar dacă Londonderry are o populație mai mare decât London CT.

Are cineva o singură soluție de interogare?

0
fr hi bn

3 răspunsuri

Soluția mea actuală este de a crea un căutător exact și un căutător de prefix, ambele ordonate după populația inversă, și apoi să-mi copiez toate loviturile, pornind de la loviturile exacte, trecând la prefixele. Mi-a făcut paginile rezultate ușor mai enervante decât cred că ar trebui să fie.

De asemenea, am folosit un hash pentru a elimina duplicatele, dar mai târziu mi-am schimbat căutătorul de prefix într-o interogare booleană a unei căutări prefixate (MUST) cu o căutare exactă (TREBUIE NU), pentru a elimina duplicatele Lucene. Deși acest lucru părea și mai risipitor.

Edit: Moved to a comment (since the feature now exists): Yuval F Thank you for your blog post ... How would the sort comparator know that the name field "london" exactly matches the search term "london" if it cannot access the search term?

0
adăugat

dlamblin, permiteți-mi să văd dacă primesc acest lucru corect: doriți să faceți o interogare bazată pe prefix și apoi să sortați rezultatele după populație și poate combina ordinea de sortare cu preferința potrivirilor exacte. Vă sugerez să separați căutarea de sortare și să utilizați un CustomSorter pentru sortare: Iată o intrare de blog care descrie un personalizat sortator . Cartea clasică Lucene descrie acest lucru bine.

0
adăugat
Vă mulțumim pentru postarea pe blog care explică modul de implementare a unui comparator de sortare care în mod convenabil nu necesită definirea a două clase. Cu toate acestea, deoarece comparatorul de sortare poate lucra doar pe două documente, fără a cunoaște termenul de căutare, nu poate clasifica rezultatele așa cum le-am descris în întrebarea mea. Cum ar putea comparatorul de sortare să știe că câmpul de nume "london" se potrivește exact cu termenul de căutare "london" dacă nu poate accesa termenul de căutare?
adăugat autor dlamblin, sursa
Dang, asta mă înțeleg pentru că nu mă gândesc (deși a trecut ceva vreme de când eram în fața acelui cod). Acum, acest lucru are mult mai mult sens și este util.
adăugat autor dlamblin, sursa
Cred că puteți face următoarele: Clasa de implementare a interfeței ScoreDocComparator (AZ09Comparator în exemplul blogului), va avea un membru "termen de căutare", care va fi setat la rularea interogării. Metoda de comparare (compara() din exemplul blogului) poate accesa acest câmp în timpul numirii lui și poate clasifica un document cu o potrivire exactă mai mare decât alta, fără a avea o potrivire exactă.
adăugat autor Yuval F, sursa

API pentru

Sortcomparator

spune

Există o distincție comparabilă pentru fiecare termen unic în câmp - dacă   unele documente au același termen în   câmpul, arhiva cache-ului va avea   intrări care fac referire la acestea   Comparabil

Puteți aplica a

FieldSortedHitQueue

to the sortcomparator which has a Comparator field for which the api spune ...

stochează un comparator care corespunde   fiecare domeniu fiind sortat după.

Astfel, termenul poate fi sortat corespunzător

0
adăugat