Anleitung zu Solr in Java mit Apache SolrJ

Anleitung zu Solr in Java mit Apache SolrJ

1. Überblick

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 das Indizieren, Abfragen und Löschen von Dokumenten bereitstellt.

In diesem Artikel werden wirhow to interact with an Apache Solr server using SolrJ untersuchen.

2. Konfiguration

Informationen zum Installieren eines Solr-Servers auf Ihrem Computer finden Sie unterSolr QuickStart Guide.

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 auf eingehende HTTP-Abfragen. Sie können überprüfen, ob es erfolgreich gestartet wurde, indem Sie die URL vonhttp://localhost:8983/solr/#/bigboxstorein einem Browser öffnen und das Solr-Dashboard beobachten.

3. Maven-Konfiguration

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


    org.apache.solr
    solr-solrj
    6.4.0

Sie können immer die neueste Version finden, die vonMaven Central gehostet wird.

4. Apache SolrJ Java API

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

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

Hinweis:SolrJ uses a binary format, rather than XML als Standardantwortformat. Aus Kompatibilitätsgründen mit Solr musssetParser() wie oben gezeigt explizit in XML aufgerufen werden. Weitere Details hierzu finden Sie inhere.

4.1. Indizieren von Dokumenten

Definieren wir die zu indizierenden Daten mitSolrInputDocument und fügen sie mit der Methodeadd() 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 Aktioncommit() folgen.

4.2. Indizierung mit Bohnen

You can also index Solr documents using beans. Definieren wir eine ProductBean, deren Eigenschaften mit @Field versehen 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
}

Fügen wir dann die Bean zu unserem Index hinzu:

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

4.3. Abfragen indizierter Dokumente nach Feld und ID

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

DieQueryResponse vom Server enthalten eine Liste vonSolrDocument Objekten, die einer Abfrage mit dem Formatfield:value entsprechen. 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 Option besteht darin, mitgetById() nachId abzufragen. Das 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 wirdeleteById() 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 OptiondeleteByQuery(). 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. Fazit

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

Sie können sich die Beispiele in diesem Artikelover on GitHub ansehen.