Solr 1.4 Search Server Tutorial

Apache Solr, ein Suchmaschinenserver der Spitzenklasse. Kostenlos, einfache Weboberfläche, ultimative Performance. Liefert Suchergebnisse in Millisekunden bei über 20.000 indizierten Dokumenten. Es lassen sich sogar PDF, Word, CSV oder RTF Dokumente indizieren.

Solr, ein Produkt aus dem Hause Apache ist ein Suchmaschinen Server der auf Apache Lucence aufbaut, jedoch eine einfach zu bedienende Weboberfläche bietet. Der Server benötigt jedoch Java und eine Apache Tomcat Instanz.

Solr Tutorials zu Download und Installation vom Apache Suchmaschinenserver Solr 1.4 finden Sie hier:

Der Solr Suchmaschinen-Server ist ordnungsgemäß installiert ist, wenn Sie die Domain http://localhost:8983/solr/admin/ aufrufen und eine gelbe Oberfläche erscheint. Eine Suche ist noch nicht möglich, da noch nichts indiziert wurde.

Folgende Schritte bieten Ihnen ein einfaches Solr Tutorial für den Einstieg in Apache Solr und Suchmaschinen-Konfiguration.

Konfiguration

  1. Anpassen der config Datei

    Ich habe hier nur etwas mehr RAM zugewiesen (1024 MB), ansonsten alles auf Default. So viel RAM ist natürlich übertrieben. Bei 1000 indizierten Seiten emfehle ich 128 Mb, bei 10.000 etwa 512 Mb und bei einer Million indizierten Objekten etwa 1024 MB.

    Wir verwenden einen Hetzner Root Server mit 12GB Ram und können prassen, sind jetzt aber wegen eines Multicore Setups auf 256 Mb für die großen Cores und 128 Mb für die kleinen Cores zurückgestiegen. Für 12 Sprachen ergiebt das dann doch etwa 1,7 GB Ram.
    Apache Solr geht mit dem Speicher für den Index relativ sparsam um. Nur währen des Indizierens wird etwas mehr benötigt. Dieser Wert ist übrigens seperat einstellbar.

  2. Anpassen der schema Datei

    Beginnen wir mit dem Anlegen von Feldern. Habe ich in meiner Datenbank eine Spalte in der der Titel einer Tupel gespeichert ist, so lege ich in Solr ein Feld mit dem Namen „title“ und dem Typ „text“ an.

      <fields>
      <field name="id" type="string" indexed="true" stored="true" required="true" />
      <field name="title" type="text" indexed="true" stored="true"/>
      <field name="titleSort" type="string" indexed="true" stored="false"/>
      <field name="text" type="text_ws" indexed="true" stored="true"/>
      <field name="category" type="text" indexed="true" stored="true" multiValued="true"/>
      <field name="allFields" type="text" indexed="true" stored="false" multiValued="true"/>
      </fields>
    

    Hier verwende ich ein Feld „id“ das unique ist (einzigartig), indiziert wird, also es kann danach gesucht werden und sortiert. Es ist darauf zu achten, dass die id, ein Feld mit dem Datentyp String ist. Integer wird bis einschließlich Version 3.1 nicht unterstützt.

    Stored bedeutet, dass es durch Solr ausgegeben wird und required bedeutet, dass es beim Indizieren befüllt sein muss. Als Feldtyp empfehle ich string, weil int derzeit von Solr als Index nicht unterstützt wird und es zu einer Fehlerausgabe in Apache Tomcat kommt.

    Die Felder selber können natürlich auch definiert werden:

    <fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100">
    <analyzer>
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    </analyzer>
    </fieldType>
    

    Um diesen Feldtyp zu verwenden, erhält ein Feld innerhalb von <fields> den type „text_ws“. Siehe oben: Ich geben dem Feld mit dem Namen „text“ den Feldtyp „text_ws“. Dieses Solr-Feld enthält nichts anderes als einen Whitespacetokenizer, der den Inhalt nach jedem Leerzeichen trennt.

    Suche per Default über alle Felder

    Es ist relativ komfortabel, wenn Solr so konfiguriert ist, dass bei einer Suche wie „test“ gleich in allen relevanten Feldern gesucht wird und der Suchstring nicht so zusammengesetz werden muss: „title:test titleSort:test text:test category:test“.

    Hiermit definieren wir, dass standardmäßig im Feld „allFields“ gesucht werden soll.

    <!-- Feld in dem der QueryParser sucht, wenn kein Feld angegeben wurde -->
    <defaultSearchField><strong>allFields</strong></defaultSearchField>
    

    Nun müssen wir nur noch alle Solr-Felder in denen gesucht werden soll in das Feld „allFields“ kopieren. Das ganze machen wir mit einer Solr-Funktionalität. Damit sparen wir Zeit und Ressourcen.

    
    <copyField source="title" dest="allFields"/>
    <copyField source="titleSort" dest="allFields"/>
    <copyField source="text" dest="allFields"/>
    <copyField source="category" dest="allFields"/>
    
  3. Indizieren

    Der erste Schritt ist in Solr einen Index aufzubauen indem der Solr Server mit Daten gefüttert wird. Hierfür verwenden wir ein XML Skript, dass unsere Datenbank mit einem beliebigen SQL-Statement abgrast und in Solr speichert. Dafür bedarf es allerdings etwas an Vorbereitung. Wir müssen den JDBC Treiber auf unserem Tomcat Server installieren, damit er mit Mysql umgehen kann. Ein Tutorial gibt es hier. Es muss nur die Datei in das Tomcat-Verzeichnis geschoben und der Server neu gestartet werden.

    Solr stoppen und starten per Putty
    Der Tomcat-Server wird in Putty mit den Befehlen „/etc/init.d/tomcat stop“ gestoppt und mit „/etc/init.d/tomcat start“ wieder gestartet.

    Solr und Datenbank
    Um Solr mit Daten aus einer Datenbank zu versorgen empfehle ich den Apache Data Import Handler.
    Als erstes registrieren wir in der Solr config Datei den Data-Import-Handler (DIH)…

    <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
      <lst name="defaults">
        <str name="config">/home/username/mySqlScript.xml</str>
      </lst>
    </requestHandler>
    

    …und erstellen in unserem Solr Verzeichnis eine Datei mit dem Namen mySqlScript.xml mit folgendem Inhalt:

    <dataConfig>
    <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/dbname" user="db_username" password="db_password"/>
        <document name="products">
            <entity name="item" query="select * from table">
                <field column="id" />
                <field column="title" name="name" />
                <field column="titleSort" name="manu" />
                <field column="text" name="weight" />
                <field column="category" name="price" />
            </entity>
        </document>
    </dataConfig>

    In Zeile 2 verbinden wir uns per jdbc mit unserer Datenbank. In Zeile 4 steht unser Select Statement. Erzeugt das Statement eine Spalte mit dem Namen id, so wird diese Spalte dem gleichnamiten <field> zugewiesen. „Name“ kann dabei sogar entfallen. In den Zeilen 5-9 stehen die Felder die nun befüllt werden.

    Um den DIH auszuführen empfehle ich die Konsole die so http://localhost:8983/solr/dataimport aufgerufen wird. Eine genau Beschreibung wie diese benutzt wird gibt es hier.

  4. Dieses Buch bietet eine erstklassige Hilfe für Solr: Solr 1.4 (ISBN978-1-847195-88-3)

Solr Multicore Setup

Hilfe zur Multicoresetup von Solr gibt es hier.

Solr Update mit Solr PHP Client

Ein Tutorial zum Updaten von Einträgen im Solr Index per PHP.

Solr Hosting

Übrigens bietet der deutsche Hoster Mittwald ein Solr Hosting in vier Ausbaustufen von 5 bis 70 Euro an. Ein Multicoresetup ist aber ohne spezielle Konfiguration nicht möglich.

Sei sozial und teile

Über den Autor Andreas Grundner

Ich bin Wordpress, Joomla, Typo3 Integrator, Unix Rootserver Administrator und Webanwendungsprogrammierer. Mittlerweile habe ich über 70 Webprojekte weitgehend selbstständig mit enger Kundenabsprache realisiert. Ich bin auf One Page Websites auf Wordpress-Basis spezialisiert, biete aber auch Suchmaschinenoptimierung (SEO), Blogs, Facebook, Youtube und Google+ Seiten an. Meine Verpflichtung gilt dem Datenschutz, meine Leidenschaft dem Finden und Aufzeigen von Sicherheitslücken in Webanwendungen.

2 Reaktionen zu Solr 1.4 Search Server Tutorial

  1. JJ
    30.04.2011 at 09:17 · Antworten

    Du hast vergessen das „allFields“ auch bei den fields zu definieren.

    • admin
      30.04.2011 at 21:35 ·

      Dankeschön. Das ist natürlich Korrekt und wurde im Artikel korrigiert.

Meinung sagen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.