allegro Homepage

SolrPower für allegro (a99 und a35)

Vorwort

Suchmaschinentechnik wird realisiert mit der freien Software Solr von Apache. Diese läuft außerhalb des allegro-Systems, normalerweise unter einem Webserver, mit dem auch avanti kooperiert. Aber avanti wird nicht gebraucht, wenn man SolrPower nur mit  a99/alcarta  in einem lokalen Netz oder auf einem Einzel-PC  einsetzen will. 
SolrPower kann auch mit a35 genutzt werden; dazu ist avanti + acon nötig, denn das sind ja Web-Methoden. 
Beides wird in diesem Papier beschrieben. Auch mit PHPAC würde es gehen, das wird hier aber nicht beschrieben.
SolrPower einzurichten ist nichts für Nur-Anwender, ein wenig Erfahrung in der Systemverwaltung ist unverzichtbar. Diese Anleitung erklärt die Zusammenhänge und zeigt, wie es geht.

Nutzung in a99 und alcarta
Nachdem man, wie unten in A. und B. beschrieben, die Software eingerichtet hat, ruft man aus a99/alcarta die SolrPower ab, indem man schlicht den Befehl  X asksolr.flx  gibt, bzw. man legt diesen Befehl auf einen der Flip-Buttons. Oder wie auch immer man die Funktion starten will - es ist ein ganz normaler FLEX. Und was er produziert, ist eine ganz normale Ergebnismenge, der Nutzer merkt nicht, was der FLEX in Wirklichkeit alles tut - bzw. der FLEX zusammen mit Solr.

Solr ist ein Programm, das nicht selber auf eine allegro-Datenbank zugreift, sondern auf einen eigenen Index. Damit es den anlegen kann, muß man ihm Daten z.B. in XML-Struktur übergeben; intern hat dieser Index jedoch eine ganz andere, sehr kompakte Struktur, die man nicht zu kennen braucht. 
Zum Anzeigen und Blättern eignet sich ein Solr-Index nicht, nur zum Suchen. Ergebnisse liefert Solr in Form einer XML-Liste von Satznummern, aus der  asksolr.flx  eine normale Erg.Menge macht. 
Solr erhält seine Suchaufträge von einem Serverprogramm namens "Jetty", das Java-Programme ausführt. So ähnlich, wie acon seine Aufträge (Jobs) von avanti erhält. Von Jetty und den Java-Programmen braucht man aber nichts zu wissen.

Man beginnt am besten mit folgenden Schritten, um zu sehen, ob es im eigenen Umfeld mit der DemoBank funktioniert, und um sich mit der Methodik vertraut zu machen. Beschrieben wird hier das einfachstmögliche Vorgehen. Wer sich auf solche Dinge versteht, kann viel mehr tun.
Weiter unten in Abschnitt B. geht's dann zur Sache: SolrPower für die eigenen Daten.

A. DemoBank mit SolrPower ausstatten

Alles soll erst mal auf ein und demselben PC eingerichtet werden. Webserver und Solr können aber letztlich, für den Dauerbetrieb, auf einem anderen System liegen.

0. Man braucht ab Schritt 4 diese drei Dateien:
     Am besten kopieren Sie die Dateien in den DEMO2-Ordner und für Schritt B. in Ihr DbDir! Es stehen Kommentare drin.
     
Die Dateien sind im allegro-Gesamtpaket enthalten.
     asksolr.flx   erstellt den Suchbefehl und läßt ihn ausführen
     allsolr.flx   erstellt aus der eigenen Datenbank die XML-Daten
     expsolr.flx   desgl., aber nur für die aktuelle Erg.Menge
     e-solr.apr    Zeichenumwandlung. Falls man nicht mit $a.cfg arbeitet, sondern x.cfg
                                  kopieren auf  e-solr.xpr  und modifizieren.


1. Wenn Java noch nicht vorhanden, dann aktuelles Java installieren (Sept. 2015: Version 1.8.0_60)
    Man erhält es von  http://java.com/de/download/
    Es gibt für Windows zwei Versionen: 32bit und 64bit.Man wähle die richtige, obzwar die 32er auch auf 64 läuft.
    Java installiert sich z.B. unter  C:\Programme\Java\jre7. 
    Man ergänzt dann die PATH-Variable mit  C:\Programme\Java\jre...\bin, um Java aufrufen zu können.
    Ferner setzt man die Umgebungsvariable  JAVA_HOME auf z.B. \program files (x86)\java\jre1.8.0_60.

1a. Webserver
    Ein Webserver, am besten Apache (xampp auf Einzelplatz), wird ebenfalls gebraucht,
    auch wenn SolrPower nur mit a99 genutzt werden soll.
 Denn die Kommunikation mit Solr läuft über HTTP.
    
2. Solr-Paket entpacken  z.B. in  c:\programme\solr  
    Das Paket kann man downloaden von  http://lucene.apache.org/solr/ , Datei  solr-5.3.0.zip
    Es enthält alles sowohl für Windows wie UNIX. Doku liegt unter  
Resources.   
 
  Darin braucht man nichts zu konfigurieren. Aber ein wichtiger Tip: Wenn man zuverlässige Trunkierung will, dann diese
    Angabe rausnehmen aus der Datei  schema.xml:  
<filter class="solr.PorterStemFilterFactory"/>
    Die Datei liegt in c:\programme\solr\conf
    Erfahrene Solristen können darin noch viel mehr einstellen. Es ist sozusagen eine .cfg und .api in einem, in
    allegro
-Sprechweise.

    Empfehlenswerte Gesamtdoku: Solr Reference Guide
    Die nachfolgend angegebenen Befehle sind darin mit vielen weiteren Optionen beschrieben.

3. Ein DOS-Fenster aufmachen und Jetty starten
    Jetty ist ein für Java-Software nötiges Serverprogramm; es ist mit im Solr-Paket. 
    (Eine Alternative wäre Tomcat von Apache.)
    Dazu auf    c:\programme\solr

    diesen Befehl geben:   bin\solr start   [unter Win wird dann automatisch solr.cmd benutzt]
    (In  server\start.jar   steckt das Programm drin.)
    Es kommen einige Meldungen, die letzten sehen etwa so aus:

     Waiting up to 30 to see Solr running on port 8983
     Started Solr server on port 8983. Happy searching!
   
    Solr läuft dann als Dienst im Hintergrund. SolrPower gibt's nur, solange
 dieser Server läuft.     
     (Wenn es ein anderer Port sein soll: z.B.  
bin/solr start -p 8984
    Im Browser kann man das "Solr-Dashboard" (eine Art Cockpit) aufrufen mit  
localhost:8983
    Mit dem Button [Core selector] wählt man einen Index, z.B. demo (nachdem man 3-5 ausgeführt hat.). 
    Die nähere Beschäftigung damit lohnt sich, insbes. kann man damit jede beliebige Abfrage (query) 
    direkt ausprobieren und die Ergebnisse in Form von XML o.a. sehen.
    Man stoppt den Jetty-Service mit 
 bin\solr stop [-p port].
      

3a. Einen neuen "core" anlegen

Diesen Befehl geben:

  bin\solr create -c demo [-p port]

um einen "core" namens demo anzulegen.

Es entsteht u.a.  .\server\solr\demo\data\index. In den Ordner kommt der Solr-Index für  demo.

4. Daten aus allegro DemoBank mit  expsolr.flx  exportieren
a) Erg.Menge machen (z.B. Volltextsuche mit Suchbegriff #20, d.h. alle Sätze, die einen Titel haben.)
    Dann  X expsolr  eingeben und auf Endemeldung warten.
    Es entsteht  c:\programme\solr\katalog.xml
   ODER 
b) Gesamtbank:  X allsolr  eingeben und auf Endemeldung warten.
    (Hierbei wird ein Batch  ccc.bat  erzeugt, der dann acon mit  allsolr.job  ausführt.)
    Es entsteht  solr-1.xml. Diese verschieben nach c:\programme\solr

In beiden Fällen wird zum Exportieren die Parameterdatei  e-solr.apr  verwendet.
Die XML-Datei muß mit
<add> beginnen und sollte mit </add> enden.


5. Solr-Index erstellen

Unter Windows ist dies noch etwas umständlicher als unter Linux.
Man braucht  
post.jar  aus c:\programme\solr\example\exampledocs. Kopieren nach  c:\programme\solr

    Im DOS-Fenster auf  C:\programme\solr  den Befehl

java -Dc=demo -jar post.jar dateiname.xml

    (Es dauert bei 100.000 Datensätzen weniger als 2 Minuten)
    Während des Durchlaufs kommen keine Meldungen, am Ende:  

1 files indexed
COMMITting Solr index changes to http://localhost:8983/solr/demo/update...
Time spent: 0:00:00.374

    Es entstehen Dateien in  c:\programme\solr\server\demo\data\index\
    und zwar sind das die Indexdateien von Solr 


6. Jetzt kann's losgehen! In a99 eingeben:

       X asksolr            [oder dies auf einen FlipButton legen]
     In das Eingabefeld dann geeignete Suchwörter eingeben, die automatisch mit AND verknüpft werden
     In  
asksolr.flx  ggfls. eine andere Portnummer einstellen. 

7. "Enter" drücken und  asksolr.flx  tut sein Werk
    Binnen kurzem erscheint eine Ergebnismenge, die von Solr produziert wurde.
    Damit kann man umgehen wie mit jeder Erg.Menge. 
    Nicht anders
 als hätte man sie z.B. mit PRESTO gemacht ("externe" Erg.Menge, bestehend aus Satznummern).

8. Nutzung mit a35
    Wie das geht, steht in Teil D.


B. Eigene Datenbank(en) mit SolrPower ausstatten

Aufgabe:

Die Datenbank in  c:\allegro\XYZ  soll SolrPower erhalten.
(Setzen Sie überall statt XYZ Ihren Ordnernamen ein)

1. einen weiteren "core" anlegen: 

  solr create -c katalog

2. Daten aus XYZ exportieren (s.o. unter 4.) in eine Datei  solr.xml  und diese nach  \programme\solr  schieben

3. Daten indexieren:

  java -Dc=katalog -jar post.jar solr.xml

4. Den  asksolr.flx  kopieren in den Datenordner XYZ, dann darin den Namen  katalog  statt  demo  eintragen.

Und nun kann's losgehen, die Datenbank XYZ hat jetzt SolrPower.
Man ruft sie in a99 ab - wie gehabt - mit  X asksolr  oder wie auch immer.
Das entscheidende Element in
asksolr.flx ist die URL

http://localhost:8983/solr/katalog/select/?q=suchwoerter&start=0&rows=100&fl=id&q.op=AND

(suchwoerter mit + getrennt) und das Ergebnis enthält die Satznummern in dieser Form:

<doc>
<str name="id">satznummer</str>
</doc>


Tip:
 Das Suchbefehlsfeld auf Solr umpolen, indem man  asksolr.flx  umbenennt in  onfnda99.flx
, denn dieser wird automatisch ausgeführt, wenn man keinen gültigen Suchbefehl eingibt, und eine Eingabe für SolrPower ist ja eben kein gültiger a99-Suchbefehl! Hinweis: In alcarta wird statt dessen  onfndalc.flx  ausgeführt.
Am Anfang dieser beiden FLEXe muß man dazu aber die ersten vier Befehle ersetzen durch:
var #ux0
ins #uwo


C. Einige Tips

Solr-Index erneuern
o  Server stoppen (s. Schritt A.3) :  bin\solr stop
o  Verzeichnis ../../data/index  löschen  (s. Schritt 5.) 
o  Schritte 3 - 5 wiederholen

Eine solche Gesamt-Erneuerung ist in jedem Fall dann nötig, wenn man die allegro-Datenbank als Ganzes erneuert hat, weil dann i.d.R. die Satznummern nicht mehr übereinstimmen mit denen im Solr-Index.

Weitere Daten einspeisen (Index aktualisieren)
Zuerst die Daten in der XML-Form (exportiert mit  expsolr.flx  o.a.) bereitstellen.
Dann denselben Befehl wie in B.6.b . 
Sätze mit derselben internen Nummer werden dabei ersetzt, nicht dupliziert! 
Insbesondere kann man so auch die LOG-Datei in den Solr-Index einspeisen. Das kann beliebig oft geschehen, d.h. der Solr-Index kann täglich oder noch öfter aktualisiert werden. Es ist auch nicht so, daß man nach einer solchen Aktion die LOG-Datei löschen müßte, sondern es macht für Solr nichts aus, den selben Satz mehrfach zu aktualisieren - er wird dann eben jeweils überschrieben.


Solr Dokumentation 
Die ist mit im Paket; geben Sie im Browser ein:

   c:/programme/solr/docs/index.html

Zur Funktionsweise
Die Funktionsweise von Solr ist nicht immer transparent, vor allem die Anordnung (das Ranking) der Ergebnisse. Damit es keine Probleme mit Diakritika gibt, werden die Daten von  expsolr.flx  so aufbereitet, daß nur die Grundbuchstaben an Solr übergeben werden.  

Zur Suchbefehls-Syntax
Hinweise dazu gibt es hier, wenn man mehr will als die hier vorgestellte Minimalversion:

  http://wiki.apache.org/solr/SearchHandler?action=show&redirect=StandardRequestHandler

Konfigurieren
Selber dies und jenes konfigurieren kann man unter 

  c:\programme\solr\conf
vor allem in der Datei  schema.xml
Ferner liegen dort  stopwords.txt  und  synonyms.txt.
An alledem wurde für die hier vorgestellte Minimalvariante nichts geändert, Ausnahme s. oben unter A.2!

In den FLEXen  expsolr.flx  und  asksolr.flx  wird der FLEXperte einiges entdecken, was modifiziert werden kann. 
Im zweiten z.B. die Anzahl der Ergebnisse, die maximal gezeigt werden sollen: In der Angabe
...&start=0&rows=1000...
ändert man dazu die Zahl 1000.

Die Datenfelder, die Solr durchsuchen soll, können in  e-solr.apr  vorgegeben werden. Hier sind Änderungen auf jeden Fall dann nötig, wenn man nicht mit A.CFG arbeitet. Es existiert eine entsprechende Datei  e-solr.npr  für N.CFG.

Logdatei
In  .../solr/example/logs/  entsteht eine Logdatei. Schauen Sie mal rein, ob Sie draus schlau werden...



D. Nutzung mit a35
Auch in a35 kann SolrPower genutzt werden (mit a35solr.job). 
Man nimmt  a35solr.txt  als Beispiel für ein kleines Suchformular. Veränderungen sind darin nicht nötig.
Es wird sicht- und nutzbar, wenn man eingibt   h a35solr.txt .
Das Formular startet nach Eingabe von Suchwörtern den Job  a35solr.job.  

Der a35solr.job  erhält dann den Inhalt des Eingabefelds in der Variablen  #urS, übergibt die Suchwörter an Solr und liefert die Ergebnisse an a35, jedenfalls die ersten 100 Ergebnisse. Dies zu erweitern wäre nicht schwer, aber oft reichen schon die ersten 20, weil Solr schon ein "ranking" (genannt "scoring") vornimmt.

NEU und wichtig für SolrPower in a35 (mit a35solr.job) ist die Variable (in a35ini.php einzusetzen, falls ein anderer Port als 8983 eingestellt wird)

$SPort="8983";  // SolrPort, default 8983


Literatur
Smiley, David & Pugh, Eric : Solr 1.4 Enterprise Search Server. - PACKT Publ., 2009. - 317 S.  
ISBN 978-1-847195-88-3

Klose, Markus: Einführung in Apache Solr. - Beijing  [u.a.] : O'Reilly, 2014. - 317 S.
ISBN 978-3-95561-421-8






2015-09-16