PDA

View Full Version : [JAVA] Spring MVC / Lucene vraag


ecko
24-01-2007, 15:34
Ik ben momenteel een Spring MVC laag aan het schrijven op Lucene (Apache Search Engine).
Ik kan al resultaten tonen, maar het probleem is dat ik momenteel gewoon werkte met een arrayList van titels en ik ook een summary moet tonen.
Om dit te doen heb ik ipv mijn arrayList van titels, gewoon een arrayList van documenten aangemaakt.

Probleem is nu natuurlijk dat ik de attributen hiervan (normaalgezien doc.get("summary")) niet echt kan doen via
<c:out value="${doc.get("summary")}"/>
Vanzelfsprekend natuurlijk :) Maar is er een mogelijkheid om iets dergelijks toch te doen via JSTL tags?
Of is een andere manier beter?

Bavo
24-01-2007, 15:48
Als doc uw document object is en summary een veld volgens de javabean spec dan hoort

<c:out value="${doc.summary}"/> gewoon te werken toch? Vrijdag heb ik hier examen van, lol.

ecko
24-01-2007, 15:51
Probleem is dat doc een object is van het type org.apache.lucene.document.Document en dat het veldje daar in een List elementje is (als ik me niet vergis).
Probleem is dus dat ik een List element uit een List element moet halen.

Alsjebegrijptwatikwilzeggen.

Bavo
24-01-2007, 15:57
Half en half. Heb ook nog met Lucene gewerkt. Je bedoelt dat Lucene Document een API methode heeft als

public String get(String name);

Dan gaat dat misschien niet gaan via JSTL zomaar, omdat het geen attribuut is (get/set/is) maar een functiecall.

Wat je wel zou kunnen doen is Lucene Document wrappen in een object die wel een JavaBean is, dus in uw Bussinesslaag de Lucene query doen, de gegevens ophalen en omzetten naar een eigen valuetype met als properties title en summary. Dat kan je dan in je view uitlezen. Het lijkt mij sowieso simpoeler voor de view om valuetypes te lezen dan hele Lucene objecten zoals Document (want dat is wel al wat)

Bavo
24-01-2007, 16:07
http://www.phptr.com/articles/article.asp?p=30946&seqNum=8&rl=1 hier wordt bevestigd dat method calls niet toegelaten zijn in JSTL by design. Om er rond te kunnen moet je ofwel een JavaBean wrapper shcrijven (mijn voorstel) of een speciale taglib die het wel kan (af te raden).

ecko
24-01-2007, 16:23
Had intussen al zelf dat met die bean gevonden en het werkt nu ook zoals het zou moeten :)
Thanks.

Bjorn
24-01-2007, 17:40
<c:forEach items="NaamCollectie" var="docske">
<c:out value="${docske.listcollectie.List.property" />
</c:forEach>

Zoiets gaat toch ook? Alee, voor zover ik uw vraag begrijp :).

edit>
of gewoon 2 foreach in elkaar, zou toch ook moeten lukken

ecko
24-01-2007, 18:08
Nu is het properder ;)

Bavo
25-01-2007, 18:03
<c:forEach items="NaamCollectie" var="docske">
<c:out value="${docske.listcollectie.List.property" />
</c:forEach>

Zoiets gaat toch ook? Alee, voor zover ik uw vraag begrijp :).

edit>
of gewoon 2 foreach in elkaar, zou toch ook moeten lukken

Enkel als je toegang hebt tot de onderliggende list dan wel, dat had hij niet vermeld (hij had het over een publieke actiemethode). Anyway, morgen van die kloterij een examen en het zit me dik tegen. Laten we scripting leren, en nu hetzelfde maar met actions, en nu hetzelfde maar met EL, en nog eens met JSTL en custom tags. Ole, voor includes heb je 4 verschillende manieren met 4 keer verschillende syntax en telkens kleine details die anders zijn.

Ik begrijp al waarom iedereen opschrikt als een webapp in JSP moet.

Talos
25-01-2007, 18:08
Laten we scripting leren, en nu hetzelfde maar met actions, en nu hetzelfde maar met EL, en nog eens met JSTL en custom tags. Ole, voor includes heb je 4 verschillende manieren met 4 keer verschillende syntax en telkens kleine details die anders zijn.


Welcome to my world :-) Vorige examenperiode heb ik die dingen allemaal kunne leren.

Bavo
26-01-2007, 11:25
Het is gelukt 8-)

ecko
31-01-2007, 12:49
Nog een Lucene gerelateerd vraagje:
Wanneer ik de applicatie "undeploy", blijven mijn index en de quartz-1.6.0.jar gelocked.
Ik denk dat ik overal mijn indexen etc wel vrijgeef, maar ben daar natuurlijk niet zeker van.
Hoe kan ik dit makkelijk nakijken? (ik vermoed debug mode?)

Bavo
31-01-2007, 13:34
Waarom gebruik je Quartz? Is er een relatie tussen (cron)jobs en Lucene querying (je start bvb een index-service vanaf een quartztimer/cronjob)? Indien zo ga zeker na of je jobs wel degelijk worden afgesloten, want dat lijkt me dan het probleem.

Het kan ook zijn dat Lucene intern Quartz gebruikt om taken uit te voeren en dat je inderdaad Lucene niet goed 'stopt'. Dat is een API-zaak waar ik niets van weet :( Je zal in lucene zelf moeten kunnen nagaan of er connecties nog openstaan (zoals MySQL in de manager dat mooi weergeeft bvb), al zou zoiets niet mogen gebeuren eens de applicatie zelf volledig undeployed is, en zeker niet indien Lucene een deel is van diezelfde app. Wat gebeurt er als je heel de app/webserver afsluit?

ecko
31-01-2007, 13:44
De Quartz scheduler roept dus de index service op. Elke zoveel tijd dus.
Wanneer ik Tomcat volledig stop (ctrl+C dus), dan is alles natuurlijk OK.

Ik ga die Quartz eens nader bekijken dan.

ecko
31-01-2007, 14:05
Het probleem met de Quartz jar is opgelost:
http://www.evolutionnext.com/blog/2005/01/05/1104943876000.html

Alleen blijft die index locked zolang Tomcat blijft draaien...

Bavo
31-01-2007, 15:21
Lock File

A write lock is used to indicate that another process is writing to the index. Note that this file is not stored in the index directory itself, but rather in the system's temporary directory, as indicated in the Java system property "java.io.tmpdir".

The write lock is named "XXXX-write.lock" where XXXX is typically a unique prefix computed by the directory path to the index. When this file is present, a process is currently adding documents to an index, or removing files from that index. This lock file prevents several processes from attempting to modify an index at the same time.

Multiple index writers or readers can try to edit the lucne index files at the same time (it's important for the index writer/reader to be closed so it will release the file lock).

Er is dus wel wat locking aan de gang in Lucene. Ik blijf vermoeden dat de Quartz job niet elegant afluit en de locks niet degelijk released. Mischien moet je een manier vinden om een shutdownhook te implementeren voor je indexers zodat dat wel nog gebeurd bij een harde undeploy.