How to implement fulltext search – tipy a rady?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
juzna.cz
Člen | 248
+
0
-

Potrebuji v aplikaci udelat obecne fulltextove vyhledavani snadno rozsiritelne na nove pridavane moduly aplikace. Navic potrebuji aby hledani fungovalo take na IP adresy a MAC adresy (na coz mi klasicky fulltext v mysql nezabere). Nemate nejake tipy, jak takoveto vyhledavani vyresit?

Treba nekde existuje nejake reseni v podobe hledaciho frameworku, o kterem nevim. Tak se radeji ptam, nez se pustim do vlastni implementace.

Dik za tipy a rady

PS: ma aplikace bezi nad Nette + Doctrine 2 ORM

mm-marek
Člen | 61
+
0
-

Na poslední #posob jsme o tom vedli debatu – někdo používá třeba Google, já používám Zend_Search_Lucene

Tharos
Člen | 1030
+
0
-

Já teď budu řešit podobný problém (zakázka, u které nemůžeme použít Google Custom Search či jiný podobný engin) a rozhodl jsem se jít cestou vlastního jednoduchého indexovacího robota. Ten bude na míru indexovat jeden jediný web (takže nemusí ani následovat odkazy, seznam všech stránek webu mu není problém dodat), takže žádná složitost. Mám představu, že prostě vyparsuje (a pochopitelně očistí od tagů, komentářů a podobně) všechna slova z <body>…<body> a sestaví se vyhledávací index (formulovaný klíčové slovo → výskyty). Možná při parsování budu dávat stranou nadpisky (pro možnost vyhledávání pouze v nadpisech) a asi i komentáře (pro možnost vyhledávání pouze v komentářích), ale žádné jiné vymoženosti asi implementovat nebudu. Relevanci pro začátek budu asi řešit tak, že natvrdo přidělím každé existující stránce nějaký page rank. Což bych do budoucna asi přepsal na něco sofistikovanějšího… Ten index budu sestavovat v nějakém rozumném intervalu cronem. Toto umožní implementovat i jednoduchou booleovskou logiku do vyhledávacího dotazu (AND, OR, NOT atd.).

Tak třeba Ti mé myšlenkové pochody přijdou vhod, kdo ví ;).

Tharos
Člen | 1030
+
0
-

Pro inspiraci jsem narychlo nalezl ještě toto vlákno. Použití existujícího enginu má samozřejmě nesporné výhody a osobně se do vlastní implementace pouštím skoro až „ze zábavy“ (chci vyzkoušet, jak to bude fungovat) a také proto, protože v mém případě jsou na schopnosti vyhledávání v podstatě velmi nízké nároky.

juzna.cz
Člen | 248
+
0
-

Diky za tipy, ja mam ale trosku jiny problem. Nechci indexovat stranky, ale primo nejake informace z databaze, ktera neni verejne dostupna (pristup tam maji pouze zamestnanci).

Chtel jsem udelat hledani, kde uzivatel zada napriklad „novak“, tak at to najde napr 2 zakazniky co se jmenuji novak, zakaznika ktery bydli na ulici Novakova, zakaznika kde je poznamka „jeho manzelka se jmenuje novakova“, fakturu ve ktere je kdekoliv jmeno novak, … atd.

Cili optimalni by byla asi nejaka sluzba, do ktere bych mohl posilat textova data spolu s nejakymi metadaty. A pak bych mohl hledat v datech a dostal bych vracena jen ta metadata spolu s relevanci.

Napr. bych teda do search enginu odeslal:

[ "...info o novakovi...", { type: 'customer', custId: 123, comment: 'Pouzito v poznamce' } ]
[ "...vsechen text z faktury...", { type: 'invoice', number: 678 } ]

Potom by search(‚novak‘) vratilo:

[
 { relevance: 1, type: 'customer', custId: 123, comment: 'Pouzito v poznamce' },
 { relevance: 0.5, type: 'invoice', number: 678 }
]

Skvele by bylo, kdyby search engine umel i nejake „Did you mean“, tzn kdyz bych dal hledat novaakk, tak by me hodil zpatky i vysledky hledani novaka s nejakou poznamkou.

juzna.cz
Člen | 248
+
0
-

Co jsem zatim hledal, tak jsem nasel:

  • Lucene (pripadne Lucene + CouchDB) – ale tam jsem nenasel, jak ukladat a ziskavat ta metadata
  • ElasticSearch – to same

tak zatim pokracuji v hledani a cteni dokumentaci

juzna.cz
Člen | 248
+
0
-

Tak uz jsem na to prisel. V Lucene je u kazdeho pole v dokumentu mozne nastavit parametr „store“, ktery znaci, zda se toto pole ulozi. Pokud zvolime NO, tak se neulozi a pouze se zaindexuje (pokud se povoli indexace).

ElasticSearch je zalozene na Lucene, takze tam je to stejne. Jdu to ozkouset. Dik za tipy

mm-marek
Člen | 61
+
0
-

jj, variant je tam poměrně hodně :)

did you mean jsem udělal tak, že pokud byl počet výsledků malý a malé je taky score, modifikoval jsem dotaz… bylo to dost náročné na pamět, ale když jsem si ukládal nejčastější výsledky, docela se to zrychlilo. Rozhodně mi to ale nepřišlo jako optimální řešení.

edit: a po modifikaci jsem pak vybral dotaz z nejvyšším score

Editoval mm-marek (3. 3. 2011 11:27)