2005-09-14

Verschillen tussen Minisis en Oracle in WebQuery

Hierbij een korte uitleg van de belangrijkste verschillen tussen de minisis- en oracle syntax van WebQuery. Het is de bedoeling dat die verschillen verdwijnen, maar zolang dat niet zo is...

algemeen

het aantal hits wordt bij oracle niet exact aangegeven (ook bij minisis klopt het wel eens niet, maar dan is er iets mis met de index). Bij gebruik van haspath (zie verderop) is het helemaal niet betrouwbaar, behalve op de laatste pagina van een set (wqoracle zorgt er voor dat het op die pagina altijd klopt).

Daarmee hangt samen dat er in de huidige versie, als er alleen maar haspath calls in de query zitten, geen next element gegenereerd wordt, ook niet als er wel meer records zijn. Daar zoek ik nog een oplossing voor.

Wildcards (wie heeft er een goede nederlandse naam voor?) kunnen ook problemen geven. Er zij er twee, % als equivalent van de minisis @, en _ voor het zoeken naar een willekeurig teken op de aangegeven positie. Combinaties (bv. %a_b_c%d_e% zijn toegestaan, maar kunnen uiteraard performanceproblemen geven.
WebQuery vertaalt (behalve in wq_qry) * naar % en ? naar _, dus je kunt in de meeste gevallen gewoon de * blijven gebruiken, alleen hoeft hij niet meer met javascript vervangen te worden en voor klanten blijft de * dus de standaard. Bij het intikken van % in een url moet je het schrijven als %25.

Anders dan bij minisis zitten alle gegevens in één index. Ook als een bepaald veld maar drie verschillende waarden kan hebben zal het zoeken naar de waarde a% alle termen die met een a beginnen verzamelen, dan met de veldnaam combineren en de meeste weer af laten vallen. Dat kan al snel tot interne oracle limieten overschrijden en dus tot foutmeldingen leiden.

Om dat leed enigszins te verzachten vertaalt WebQuery de vraag a=* naar een andere constructie (haspath, zie verderop), zodat deze veelmisbruikte constructie nog steeds hanteerbaar is. Er zit wel een nadeel aan: het gemelde aantal hits klopt niet meer en het next element verschijnt niet als de vraag geen inpath calls (zie verderop) bevat.

WebQuery/oracle werkt met xml en de oracle text extensies. Elk record is daarbij één oracle veld in een gelijknamige tabel, waarin alle xml elementen geindexeerd worden. Je kunt dus altijd op alle velden zoeken. WebQuery vertaalt de zoekvraag naar een sql statement waarin oracle text functies worden gebruikt. Wie gebruik maakt van wq_qry zal dat voorlopig zelf moeten doen. Het gaat in hoofdzaak om twee functies: inpath() en haspath(). Inpath zoekt naar de aangegeven waarde in het aangegeven pad, haspath bekijkt of het pad in het record voorkomt en is dus functioneel equivalent aan de minisis "present" search, alleen sneller omdat er met een index gewerkt wordt.

De "normale" WebQuery syntax is ongewijzigd, afgezien van de automatische vertaling van de wildcards * en ? naar de oracle-varianten % en _.

De wq_qry syntax is wel anders, omdat daarin de genoemde functies moeten worden gebruikt. Het is de bedoeling dat dat op een rustiger moment weer wordt teruggedraaid, zodat dan ook in wq_qry de bekende formuleringen gebruikt kunnen worden. De belangrijkste verschillen zijn:

"waarde" wordt: "waarde" inpath(//)

in principe kan je in plaats van // ook het hele xpath gebruiken, maar ivm. compatibiliteit met eventuele schemawijzigingen raad ik dat af als het niet om andere redenen noodzakelijk is.

"@" en present worden: haspath(//)

de present search is in minisis extreem traag, in oracle sneller en zekerder dan de overeenkomstige wildcard search.

de AND NOT relatie tussen twee termen wordt in wq_qry geschreven als NOT. Het blijft een relatie tussen twee termen, dus alleen "NOT jan inpath(//piet)" mag niet. Let op: in wq_rel blijft het "AND NOT".

Age Jan