Anleitung zu Solr in Java mit Apache SolrJ

1. Übersicht

Apache Solr ist eine Open-Source-Suchplattform, die auf Lucene basiert. Apache SolrJ ist ein Java-basierter Client für Solr, der Schnittstellen für die Hauptfunktionen der Suche wie Indizieren, Abfragen und Löschen von Dokumenten bietet.

In diesem Artikel erfahren Sie , wie Sie mit SolrJ mit einem Apache Solr-Server interagieren .

2. Setup

Informationen zum Installieren eines Solr-Servers auf Ihrem Computer finden Sie in der Solr-Kurzanleitung.

Der Installationsvorgang ist einfach: Laden Sie einfach das zip / tar-Paket herunter, extrahieren Sie den Inhalt und starten Sie den Server über die Befehlszeile. In diesem Artikel erstellen wir einen Solr-Server mit einem Kern namens "bigboxstore":

bin/solr start bin/solr create -c 'bigboxstore'

Standardmäßig überwacht Solr Port 8983 für eingehende HTTP-Abfragen. Sie können überprüfen, ob es erfolgreich gestartet wurde, indem Sie die URL // localhost: 8983 / solr / # / bigboxstore in einem Browser öffnen und das Solr-Dashboard beobachten.

3. Maven-Konfiguration

Nachdem wir unseren Solr-Server eingerichtet haben, springen wir direkt zum SolrJ-Java-Client. Um SolrJ in Ihrem Projekt verwenden zu können, muss die folgende Maven-Abhängigkeit in Ihrer pom.xml- Datei deklariert sein :

 org.apache.solr solr-solrj 6.4.0 

Sie finden immer die neueste Version von Maven Central.

4. Apache SolrJ Java API

Initiieren Sie den SolrJ-Client, indem Sie eine Verbindung zu unserem Solr-Server herstellen:

String urlString = "//localhost:8983/solr/bigboxstore"; HttpSolrClient solr = new HttpSolrClient.Builder(urlString).build(); solr.setParser(new XMLResponseParser());

Hinweis: SolrJ verwendet anstelle von XML ein Binärformat als Standardantwortformat. Aus Kompatibilitätsgründen mit Solr muss setParser () wie oben gezeigt explizit für XML aufgerufen werden . Weitere Details dazu finden Sie hier.

4.1. Indizieren von Dokumenten

Definieren wir die zu indizierenden Daten mit einem SolrInputDocument und fügen sie mit der add () -Methode zu unserem Index hinzu :

SolrInputDocument document = new SolrInputDocument(); document.addField("id", "123456"); document.addField("name", "Kenmore Dishwasher"); document.addField("price", "599.99"); solr.add(document); solr.commit();

Hinweis: Für jede Aktion, die die Solr-Datenbank ändert, muss auf die Aktion commit () folgen .

4.2. Indizierung mit Bohnen

Sie können Solr-Dokumente auch mit Beans indizieren . Definieren wir eine ProductBean, deren Eigenschaften mit @ Field kommentiert sind :

public class ProductBean { String id; String name; String price; @Field("id") protected void setId(String id) { this.id = id; } @Field("name") protected void setName(String name) { this.name = name; } @Field("price") protected void setPrice(String price) { this.price = price; } // getters and constructor omitted for space }

Dann fügen wir die Bohne unserem Index hinzu:

solrClient.addBean( new ProductBean("888", "Apple iPhone 6s", "299.99") ); solrClient.commit();

4.3. Abfragen indizierter Dokumente nach Feld und ID

Lassen Sie uns überprüfen, ob unser Dokument hinzugefügt wurde, indem Sie SolrQuery verwenden , um unseren Solr-Server abzufragen.

Die QueryResponse vom Server enthält eine Liste von SolrDocument- Objekten, die mit jeder Abfrage mit dem Formatfeld : value übereinstimmen . In diesem Beispiel fragen wir nach Preis ab:

SolrQuery query = new SolrQuery(); query.set("q", "price:599.99"); QueryResponse response = solr.query(query); SolrDocumentList docList = response.getResults(); assertEquals(docList.getNumFound(), 1); for (SolrDocument doc : docList) { assertEquals((String) doc.getFieldValue("id"), "123456"); assertEquals((Double) doc.getFieldValue("price"), (Double) 599.99); }

Eine einfachere Möglichkeit ist die Abfrage von Id mit getById () . Dies gibt nur ein Dokument zurück, wenn eine Übereinstimmung gefunden wird:

SolrDocument doc = solr.getById("123456"); assertEquals((String) doc.getFieldValue("name"), "Kenmore Dishwasher"); assertEquals((Double) doc.getFieldValue("price"), (Double) 599.99);

4.4. Dokumente löschen

Wenn wir ein Dokument aus dem Index entfernen möchten, können wir deleteById () verwenden und überprüfen, ob es entfernt wurde:

solr.deleteById("123456"); solr.commit(); SolrQuery query = new SolrQuery(); query.set("q", "id:123456"); QueryResponse response = solr.query(query); SolrDocumentList docList = response.getResults(); assertEquals(docList.getNumFound(), 0);

Wir haben auch die Option deleteByQuery () . Versuchen wir also, ein Dokument mit einem bestimmten Namen zu löschen:

solr.deleteByQuery("name:Kenmore Dishwasher"); solr.commit(); SolrQuery query = new SolrQuery(); query.set("q", "id:123456"); QueryResponse response = solr.query(query); SolrDocumentList docList = response.getResults(); assertEquals(docList.getNumFound(), 0);

5. Schlussfolgerung

In diesem kurzen Artikel haben wir gesehen, wie Sie die SolrJ-Java-API verwenden, um einige der häufigsten Interaktionen mit der Apache Solr-Volltextsuchmaschine durchzuführen.

Sie können die Beispiele in diesem Artikel auf GitHub nachlesen.