Luceus, zoeken zonder programmeren
Alweer enige jaren geleden werd de behoefte naar zoeken in (MMBase) websites steeds groter.
Voor een klant is er toen een klein onderzoek gedaan naar het gebruik van Lucene voor hun zoekdoeleinden.
Dit resulteerde in een module voor MMBase die diens objecten kon indexeren welke later uitgebreid werd met een taglib om makkelijk in de geïndexeerde content te kunnen zoeken. Zelf bouwen was noodzakelijk omdat Lucene zelf eigenlijk alleen toolbox is.
Veranderende wensen voor het zoeken in websites maakten de huidige Lucenemodule op Sourceforge achterhaald. Belangrijkste manco was dat het afhankelijk was van MMBase en er niet andere bronnen geïndexeerd konden worden zoals een statische site, of een database. Voor een andere klant die meerdere systemen wilde kunnen doorzoeken op hun website is toen het al levende plan voor een opvolger uitgewerkt tot Luceus.
Luceus werkt volgens het client server model, Luceus is de server en clients kunnen connecten naar de server en hun content laten indexeren. De clients moeten stukken content zoeken die als geheel teruggevonden moeten kunnen worden in een zoekresultaat stuk voor stuk sturen in een Envelope, ook gerelateerde content moet meegenomen worden. Voor de CMS Container is een client ontwikkeld die alle ContentElements indexeerd en bij ieder stuk content ook de pagina zoekt waar het opstaat zodat deze in het zoek resultaat gelinkt kan worden. De huidige Sourceforge Lucenemodule zal later worden vervangen door een versie die Luceus gebruikt, de oude module is dan een client geworden van zijn opvolger.
Een Luceus Envelope bevat de naam van de client, het type content (meestal tabel naam) en de afzonderlijke te indexeren velden met hun type (String, Integer, Binary etc).
Envelope doc = EnvelopeFactory.creatingEnvelope(); doc.setRepository("my_luceus_client"); doc.setType("articles"); doc.add(EnvelopeFieldFactory.getStringField("title", "Hello world")); indexer.enqueue(doc);
De client is zelf verantwoordelijk voor het up-to-date houden van content in Luceus, dus als een artikel wijzigt moet de client deze opnieuw versturen, dit kan intelligent zoals in MMBase via een event of moet gescheduled lopen in het geval van een spider die een html site indexeerd.
Aangekomen bij de Luceus IndexService worden de individuele Envelope objecten in verschillende stappen verwerkt. Iedere stap heeft zijn eigen LinkedBlockingQueue (brievenbus voor de Evelope’s) en Executor die de Queue uitleest. De grootte van de Executor pool is instelbaar en dus schaalbaar.
De belangrijkste stappen in volgorde van afhandeling:
1) InputRouter bekijkt of een Envelope velden bevat met binaire content, zo ja stap 2 zo niet stap 3
2) ExtractorProcessor verwerkt velden met binaire content, zet deze om naar Strings, dit is een pluggable mechanisme zodat een desgewenst nieuwe formaten ondersteunt kunnen worden. Nu zijn er oplossingen voor oa PDF, Word en Excel.
3) TranslatorProcessor zet veld types uit de envelope om naar String objecten want dat is wat Lucene kan indexeren. Dit is ook pluggable. Wat je hier kan doen is bijvoorbeeld een postcode bewerken zodat alleen de 4 cijfers overblijven en geindexeerd kunnen worden en doorzocht kunnen worden. Ook kan bijvoorbeeld gekeken worden of een veld een waarde heeft en in dat geval een boolean veld aangemaakt worden zodat je bijvoorbeeld alleen kan zoeken op content met afbeeldingen.
4) IndexRouter kijkt waar een Envelope vandaan komt (de client) en kijkt dan welke index(en) content van deze client willen indexeren en stuurt ze in dat geval door naar de laatste stap.
X) Indexer Luceus ondersteunt zo veel Lucene indexen als nodig, iedere index heeft zijn eigen Indexer proces met BlockingQueue. De Indexer pakt alle Envelope objecten uit en indexeert ze in de Lucene index. Ook indexeert hij altijd specifieke Luceus velden mee die in de Envelope gestopt worden door de client zoals de naam van de client en het type content zodat later specifiek gezocht kan worden op alleen content van een bepaald type of van een bepaalde client.
Belangrijkste onderdeel van Luceus is de configuratie, deze bestaat (meestal) uit een xml file welke met Digester word ingelezen en verwerkt tot een LuceusConfiguration. In de configuratie definieer je de gebruikte plugins en worden de benodigde Indexen benoemd. Iedere index kan vervolgens worden gemodelleerd naar gelang de zoekwensen van de klant en vervolgens kan voor ieder Envelope veld per index aangegeven worden waar deze geindexeerd moet worden. Ook kan middels constraints op een index alleen bepaalde content van een client toegestaan worden.
Het zoeken in de index gaat via de jsp 2 taglib welke de Luceus SearchService aanspreekt:
<lm:index name="${indexName}"> <lm:search var="results"> <lm:match field="title" value="${searchText}" /> </lm:search> </lm:index>
Eigenlijk komt in de configuratie het concept ‘Zoeken zonder programmeren’ het beste tot zijn recht, al zullen sommigen xml schrijven ook programmeren noemen. Er is nu een CMS Container client en er is een simpele spider client, voor klant specifieke oplossingen zal altijd een dedicated client geschreven moeten worden.
———————————————————————————–
Meer weten over MMBase-specialist Finalist IT Group?



Ik merk bij het gebruik van de verschillende lucene frameworks (waaronder de vorige mmbase module, maar ook bijvoorbeeld compass) dat sorteren vaak nog best problementatisch is. De weegfactor van lucene neemt standaard de datum waarop iets gepubliceert is niet mee terwijl dit bij mijn projecten wel steeds terug komt. Lucene an sich vind ik niet heel compleet op het gebied van sorteren… heeft luceus hier nog extra opties voor?
peter - maart 12, 2007 14:44
Zoals in het artikel staat, Lucene kan zelf een hoop maar het gaat niet allemaal vanzelf. Sorteren kan (ook met de sourceforge versie) met de taglib:
of filteren in de zoekopdracht:
Ook zou je iets met de range tag kunnen doen om dingen vanaf gisteren te vinden:
Al deze tags zijn wrappers rond API functies van Lucene
Wouter Heijke - maart 12, 2007 16:22
Wellicht minder interessant voor al die echte ‘Javanen’
maar er is inmiddels ook een (volwassen) PHP Lucene implementatie onder Zend Framework:
http://framework.zend.com/manual/en/zend.search.html
Diederick - maart 13, 2007 0:16
Ook handig IMHO, SOLR: http://lucene.apache.org/solr/features.html
erg handig als je framework (of taal, of CMS) onafhankelijk met Lucene bezig wilt zijn.
-andy
Andy Lo-A-Foe - mei 7, 2007 16:09