How to implement fulltext search – tipy a rady?
- juzna.cz
- Člen | 248
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
- Tharos
- Člen | 1030
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
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
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
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
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)