Suche verstehen
Wir helfen Ihnen dabei, die Such­anfragen Ihrer Kund*innen und Mit­ar­bei­­ter*innen zu ver­stehen und schnell re­le­vante Ergebnisse zu liefern.

Solr Spring Server Integration mit Version 4.10.3

Auf einer Entwicklermaschine möchte man in Tests auf ein embedded Solr zurückgreifen, auf einem Testsystem möchte man eine bestehende Multi-Core Installation verwenden und auf einem Produktivsystem ist es notwendig mit einer SolrCloud Installation zu kommunizieren. Für jeden dieser Anwendungsfälle muss der richtige Solr Server verwendet werden, um den Kommunikationsoverhead so gering wie möglich zu halten. Wenn man in seinem Projekt bereits Spring einsetzt, allerdings nicht mit Spring Data für Solr arbeiten möchte oder kann,  dann haben wir dafür eine Factory, die die Integration eines Solr Servers mittels Spring vereinfacht.

OpenSource

Indoqa stellt seine SolrServerFactory zur Verfügung.

Download von Github

Integration unserer Spring basierten SolrServerFactory für die Kommunikation mit unterschiedlichen Solr Servern

Es bietet sich an Solr embedded zu starten, um in Tests immer mit einem vorhersagbaren Datenbestand arbeiten zu können. Für die Kommunikation mit einem SolrCloud Cluster benötigt man allerdings andere Informationen als für die direkte Kommunikation mit einem Solr Server.

Um sich mit diesen verschiedenen Solr Servern verbinden zu können, werden folgende Url Präfixe von unserer Factory unterstützt:

  • file:// – Um einen EmbeddedSolrServer zu starten
  • http:// – Um sich mit einer Solr Installation mittels HttpSolrServer zu verbinden
  • cloud:// – Um sich mittels eines CloudSolrServer mit einem SolrCloud Cluster zu verbinden

Die 3 Url Konfigurationen für die SolrServerFactory im Detail

Um ein Solr embedded zu starten muss die SolrServerFactory wie folgt initialisiert werden:

SolrServerFactory solrServerFactory = new SolrServerFactory();
solrServerFactory.setUrl("file:///tmp/solr-spring-server/embedded-test-core");
solrServerFactory.setEmbeddedSolrConfigurationDir("./src/test/resources/solr/test-core");
solrServerFactory.initialize();

SolrServer solrServer = solrServerFactory.getObject();

QueryResponse response = solrServer.query(new SolrQuery("*:*"));
...

solrServer.shutdown();
solrServerFactory.destroy();

In Zeile 2 sehen wir, dass ein absolutes Verzeichnis für unser EmbeddedSolr konfiguriert wurde. Es kann hier natürlich auch ein relatives verwendet werden.
Die Konfiguration für den Solr-Core liegt, wie in der dritten Zeile ersichtlich, in einem relativen Verzeichnis.
In diesem Verzeichnis befinden sich die notwendigen Konfigurationsdateien für einen Solr-Core:

  • schema.xml
  • solrconfig.xml

Mit dieser einfachen Konfiguration ist es möglich, den SolrServer mittels der SolrServerFactory zu initialisieren und den fertigen SolrServer für die Kommunikation mit Solr zu benutzen.
Wenn man einen bereits befüllten Index verwenden möchte, muss das dem Index-Verzeichnis übergeordnete Verzeichnis des zu verwendenden Solr-Core angegeben werden.
Mit setUrl  wird also das Datenverzeichnis angegeben und in diesem Fall mit setEmbeddedSolrConfigurationDir der Pfad zu der Konfiguration des Cores.

Um sich mit einem eigenständigen Solr zu verbinden, muss die SolrServerFactory wie folgt initialisiert werden:

SolrServerFactory solrServerFactory = new SolrServerFactory();
solrServerFactory.setUrl("http://localhost:8983/test-core");
solrServerFactory.initialize();

...

Wie in Zeile zwei ersichtlich, muss nur die Url zu einem Solr-Core angegeben werden.

 

Für die Kommunikation mit einem SolrCloud Cluster sieht die Initialisierung wie folgt aus:

SolrServerFactory solrServerFactory = new SolrServerFactory();
solrServerFactory.setUrl("cloud://zkHost1:2181,zkHost2:2182?collection=test-collection");
solrServerFactory.initialize();

...

In der markierten Zeile ist folgende Syntax zu sehen zkHost1:2181,zkHost2:2182. Hierbei handelt es sich um die zu verwendenden ZooKeeper Instanzen gefolgt von der Collection auf welcher die Abfragen abgesetzt werden sollen.
Bei einer SolrCloud Installation werden die ZooKeeper Instanzen angegeben, da diese befragt werden, welcher Solr Node der Leader für die angefragte Collection ist.
Um Kommunikationsaufwand zu reduzieren, werden dazu bestimmte Requests an einen bestimmten Knoten delegiert.

[call-to-action-consulting /]

Die Solr Spring Server Integration mittels XML

Eine Beispielkonfiguration unserer SolrServerFactory als Spring Bean mittels XML sieht wie folgt aus:

 ...

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="locations">
    <list>
      <value>app.properties</value>
    </list>
  </property>
</bean>

<bean name="solrServerFactory" class="com.indoqa.solr.server.factory.SolrServerFactory">
 <property name="url" value="${solr.url}" />
 <property name="embeddedSolrConfigurationDir" value="${solr.embedded-solr-configuration-dir}" />
</bean>

...

Und die Parameter in der Properties Datei:

solr.url=file://./target/solr/embedded-test-core
solr.embedded-solr-configuration-dir=./src/test/resources/solr/test-core

Die Konfigurationsparameter können so in eigene Properties ausgelagert werden und können damit in verschiedenen Umgebungen unterschiedlich konfiguriert werden.