UB BRAUNSCHWEIG
Symbolfoto

SolrPower für allegro

Grundlage

Suchmaschinentechnik wird realisiert durch Einsatz der Software namens Solr von Apache. Diese läuft außerhalb des allegro-Systems, normalerweise auf einem Webserver, auf dem auch avanti läuft, aber avanti wird nicht gebraucht, wenn man SolrPower nur in einem lokalen Netz oder auf einem Einzel-PC mit  a99/alcarta  einsetzen will. SolrPower kann auch in PHPAC und a30 genutzt werden; dazu ist avanti+apac nötig, denn das sind ja Web-Methoden.

Das Einrichten der Sache ist nichts für Nur-Anwender, ein wenig Erfahrung in der Systemverwaltung ist unverzichtbar. Diese Anleitung klärt die Zusammenhänge und zeigt, wie es geht.

Nutzung in a99/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 Erg.Menge, der Nutzer merkt nicht, was der FLEX in Wirklichkeit alles tut - bzw. nicht der FLEX, sondern 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 in XML-Struktur übergeben; intern hat der Index jedoch eine ganz andere, sehr kompakte Struktur, die man nicht kennen muß. Zum Anzeigen und Blättern eignet sich der Index nicht, nur zum Suchen. Ergebnisse liefert Solr dann in einer XML-Struktur, aus der  asksolr.flx  eine normale Erg.Menge macht.
Solr erhält seine Suchaufträge von einem Serverprogramm namens "Jetty". So ähnlich, wie acon seine Aufträge (Jobs) von avanti erhält. Allerdings muß für jede Datenbank ein eigenes Jetty mit eigener Portnummer laufen oder eine sog. "Multicore"-Installation verwendet werden.

Man beginnt am besten mit folgenden Schritten, um zu sehen, ob es im eigenen Umfeld funktioniert, und um sich mit der Methodik vertraut zu machen.
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.
     Man findet sie im SVN unter  
flex  bzw.  prog.
     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 (mindestens 1.5) noch nicht vorhanden, dann aktuelles Java installieren
    Man erhält es von  http://java.com/de/download/
    Java installiert sich z.B. unter  C:\Programme\Java\jre7.
    Man ergänzt dann die PATH-Variable mit  C:\Programme\Java\jre7/bin, um Java aufrufen zu können.
    Unter Win'7/64 wird es  c:\Program Files (x86)\...  sein.
    (Ein Webserver, am besten Apache (xampp auf Einzelplatz), wird nur für PHPAC u.ä. gebraucht, für Solr nicht.)
    
2. Solr-Paket entpacken  z.B. in  c:\programme\solr  
    Das Paket kann man downloaden von  http://lucene.apache.org/solr/ )
    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\example\solr\conf
    Erfahrene Solristen können darin noch viel mehr einstellen. Es ist sozusagen die CFG und API in einem, in allegro-Sprechweise.

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

    diesen Befehl geben:   java -jar start.jar
    (In dem  start.jar   steckt das Programm drin.)
    Es kommen sehr viele Meldungen, die letzte sieht etwa so aus:
     INFO: [] Registered new searcher Searcher@e33e18 main
    Dieses DOS-Fenster dann minimieren. SolrPower gibt's nur, solange das Programm Jetty läuft.
    Diese "Instanz" von Jetty ist aber nur für die
 Demo-Datenbank zuständig! Für eine andere
    Datenbank (siehe B.) braucht man ein eigenes Fenster mit eigener Jetty-Instanz.
    Man stoppt eine Jetty-Instanz mit  Strg+c  im selben DOS-Fenster.


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\example\exampledocs\katalog.xml
   ODER
b) Gesamtbank:  X allsolr  eingeben und auf Endemeldung warten.
    Es entsteht  solr-1.xml. Diese verschieben nach c:\programme\solr\example\exampledocs\
    (Hierbei wird ein Batch  ccc.bat  erzeugt, der dann acon mit  allsolr.job  ausführt.)
In beiden Fällen wird zum Exportieren die Parameterdatei  e-solr.apr  verwendet.

5. Solr-Index erstellen
    Noch ein DOS-Fenster aufmachen und

    Auf  c:\programme\solr\example\exampledocs  diesen Befehl:
      java -jar post.jar katalog.xml
    (Es dauert bei 100.000 Datensätzen weniger als 2 Minuten)
    Letzte Meldung:  ... COMMITting Solr index changes..
    Es entsteht  c:\programme\solr\example\solr\data\index\
    Dort liegen dann die Indexdaten von Solr für die DemoBank.

6. Schon 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

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).


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)
Prinzip ist, daß eine eigene Instanz von Jetty eingerichtet wird mit eigener PortNummer und dazu ein eigener Solr-Ordner für die Datenbank XYZ. (Eine andere Möglichkeit, die sog. "Multicore"-Technik, bei der ein Jetty mehr als eine Datenbank betreuen kann, wurde noch nicht auf  ihre Eignung untersucht).

1. Den gesamten example-Ordner kopieren:
           c:\programme\solr\example
      -->  c:\programme\solr\XYZ         [müßte nicht unbedingt "XYZ" heißen, ist nur praktisch]
         Darunter liegen dann insbes. diese Verzeichnisse (die anderen interessieren nicht):
         -- etc               mit jetty.xml
         -- exampledocs       für die zu indexierenden xml-Daten
         -- solr/data/index   für den Index

2. Bearbeiten:
     Die Datei  c:\programme\solr\XYZ\etc\jetty.xml
     An zwei Stellen ersetzen:  default="8983"  durch  default="8984"
     Die Nummer 8983 bzw. 8984 ist die PortNummer.
     Durch 
diese unterscheiden sich zwei Instanzen von Jetty und geraten nicht durcheinander.
     Man kann andere Portnummern wählen.
     Diese müssen ggfls. in der Firewall
 freigegeben werden für Zugriffe von außen.

3. Jetty-Instanz starten auf  c:\programme\solr\XYZ:
       java -jar start.jar
    Diese "Instanz" von Jetty ist dann also nur für Datenbank XYZ zuständig

4. Kopie des FLEXes
  expsolr.flx   nach  c:\allegro\XYZ  (siehe A.4)
    Darin diese Zeile ändern:
      open x c:/programme/solr/example/exampledocs/katalog.xml
    zu
      open x c:/programme/solr/XYZ/exampledocs/XYZ.xml
    (Ob Sie die Datei "XYZ.xml" nennen, ist eigentlich egal.)
    Außerdem in  expsolr.flx  evtl. die zu exportierenden Felder ändern,
    besonders wenn es keine A-Datenbank ist.

5. Daten damit exportieren, (siehe A.5)
a)
Erg.Menge machen und dann  X expsolr. Die Daten landen in der genannten Datei XYZ.xml.
    ODER
b) Gesamtbank:  X allsolr
    Es entstehen Dateien  solr-N.xml  (N=1,2,...)  mit jeweils nicht mehr als 32MB
    Die verschiebt man nach
 c:/programme/solr/XYZ/exampledocs
    Gebraucht wird  e-solr.apr

6. Noch ein DOS-Fenster, und in  c:/programme/solr/XYZ/exampledocs
    den (leider etwas komischen) Befehl geben
a)      java -Durl=http://localhost:8984/solr/create -jar post.jar
    dann wird ein leerer data-Bereich für den Index angelegt.
    Es kommt zwar eine Fehlermeldung:
              FATAL: Solr returned an error: Not Found
    Das ist aber OK.  Und dann
b)      java -Durl=http://localhost:8984/solr/update -jar post.jar solr-*.xml
    womit die Daten indexiert werden
         Endemeldung:  COMMITting Solr index changes..
    Wenn später weitere Dateien hinzukommen, nur noch der zweite Befehl, dann den Namen der betr. xml-Datei am Ende.

7. Kopie des FLEXes  asksolr.flx   nach  c:\allegro\XYZ
    Darin diese Zeile ändern (auf die PortNr  :8984  kommt's an):
      var "Fhttp://localhost:8983/solr/s...
    zu
      var "Fhttp://localhost:8984/solr/s...

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.

Tip: Das Suchbefehlsfeld dazu nutzen, 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 (im Fenster von Schritt 3.: Strg+c)
o  Verzeichnis ../solr/data  löschen  (s. Schritt 5.)
o  Schritte 3 - 5 wiederholen

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!

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\example\solr\conf
vor allem in der Datei  schema.xml,
z.B.   <solrQueryParser defaultOperator="OR"/>
Ferner liegen dort  stopwords.txt  und  synonyms.txt.
An alledem wurde für die hier vorgestellte Minimalvariante nichts geändert!

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 existieren entsprechende Dateien,  e-solr.bpr und e-solr.npr, für MAB bzw. N.CFG.

Nutzung mit a30
Auch in a30 kann SolrPower schon genutzt werden (mit a30solr.job). (Für PHPAC bleibt noch etwas zu tun.)
Man läßt im FreiRaum von a30 einen Suchschlitz für Solr erscheinen, indem man im Job schreibt:

wri "_!_FRE " n           
 // alternativ  _!_FRE1, dann FreiRaum Nr.1
wri "TE Eingabe:|100" n
wri "IN VurS|300" n
wri "BU Solr|a30solr" n

Der Job  a30solr.job  erhält dann die Eingabe in der Variablen  #urS, übergibt sie an Solr und liefert die Ergebnisse an a30, 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 a30 (a30ajax.php + a30solr.job) ist die Variable (in  a30_ini.php einzusetzen)

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

Damit wird ein anderer Port (andere Instanz von Jetty) eingestellt, falls es nicht 8983 sein soll.


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



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






[i] zuletzt aktualisiert: 29.08.2012
Email: ub@tu-bs.de