Einführung in Spring Data Solr

1. Übersicht

In diesem Artikel werden die Grundlagen von Spring Data Solr auf praktische Weise erläutert .

Apache Solr ist eine Open Source-Version, die für die Bereitstellung von Volltextsuchmaschinen für Unternehmen bereit ist. Weitere Informationen zu den Funktionen von Solr finden Sie auf der offiziellen Website.

Wir zeigen Ihnen, wie Sie eine einfache Solr-Konfiguration durchführen und natürlich mit dem Server interagieren.

Zuerst müssen wir einen Solr-Server starten und einen Kern zum Speichern von Daten erstellen (der von Solr standardmäßig im schemenlosen Modus erstellt wird).

2. Federdaten

Wie bei jedem anderen Spring Data-Projekt hat Spring Data Solr das klare Ziel, Boilerplate-Codes zu entfernen, die wir auf jeden Fall nutzen werden.

2.1. Maven-Abhängigkeit

Beginnen wir mit dem Hinzufügen der Spring Data Solr-Abhängigkeit zu unserer pom.xml :

 org.springframework.data spring-data-solr 2.0.5.RELEASE 

Die neuesten Abhängigkeiten finden Sie hier.

2.2. Dokument definieren

Definieren wir ein Dokument mit dem Namen Produkt :

@SolrDocument(solrCoreName = "product") public class Product { @Id @Indexed(name = "id", type = "string") private String id; @Indexed(name = "name", type = "string") private String name; }

Die Annotation @SolrDocument gibt an, dass die Produktklasse ein Solr-Dokument ist und auf das Kernprodukt mit dem Namen indiziert ist . Mit @Indexed kommentierte Felder werden in Solr indiziert und können durchsucht werden.

2.3. Repository-Schnittstelle definieren

Als Nächstes müssen wir eine Repository-Schnittstelle erstellen, indem wir ein von Spring Data Solr bereitgestelltes Repository erweitern. Wir werden dies natürlich mit Product und String als Entitäts-ID parametrisieren :

public interface ProductRepository extends SolrCrudRepository { public List findByName(String name); @Query("id:*?0* OR name:*?0*") public Page findByCustomQuery(String searchTerm, Pageable pageable); @Query(name = "Product.findByNamedQuery") public Page findByNamedQuery(String searchTerm, Pageable pageable); }

Beachten Sie, wie wir hier drei Methoden definieren, zusätzlich zu der von SolrCrudRepository bereitgestellten API . Wir werden in den nächsten Abschnitten darüber sprechen.

Beachten Sie außerdem, dass die Product.findByNamedQuery- Eigenschaft in der Solr- Abfragedatei solr-named-queries.properties im Ordner classpath definiert ist :

Product.findByNamedQuery=id:*?0* OR name:*?0*

2.4. Java-Konfiguration

Jetzt werden wir die Spring-Konfiguration der Solr-Persistenzschicht untersuchen:

@Configuration @EnableSolrRepositories( basePackages = "com.baeldung.spring.data.solr.repository", namedQueriesLocation = "classpath:solr-named-queries.properties", multicoreSupport = true) @ComponentScan public class SolrConfig { @Bean public SolrClient solrClient() { return new HttpSolrClient("//localhost:8983/solr"); } @Bean public SolrTemplate solrTemplate(SolrClient client) throws Exception { return new SolrTemplate(client); } }

Wir verwenden @EnableSolrRepositories , um die Pakete nach Repositorys zu durchsuchen . Beachten Sie, dass wir den Speicherort der benannten Abfrageeigenschaftendatei angegeben und die Multi-Core-Unterstützung aktiviert haben.

Wenn Multi-Core nicht aktiviert ist, geht Spring Data standardmäßig davon aus, dass die Solr-Konfiguration für einen einzelnen Core gilt. Wir aktivieren hier Multi-Core, nur als Referenz.

3. Indizieren, Aktualisieren und Löschen

Um Dokumente in Solr zu durchsuchen, sollten Dokumente im Solr-Repository indiziert werden.

Das folgende Beispiel indiziert ein Produktdokument im Solr-Repository einfach mithilfe der Speichermethode von SolrCrudRepository :

Product phone = new Product(); phone.setId("P0001"); phone.setName("Phone"); productRepository.save(phone);

Lassen Sie uns nun ein Dokument abrufen und aktualisieren:

Product retrievedProduct = productRepository.findOne("P0001"); retrievedProduct.setName("Smart Phone"); productRepository.save(retrievedProduct);

Dokumente können durch einfaches Aufrufen der Löschmethode gelöscht werden:

productRepository.delete(retrievedProduct);

4. Abfragen

Lassen Sie uns nun verschiedene Abfragetechniken untersuchen, die von der Spring Data Solr-API bereitgestellt werden.

4.1. Generierung von Methodennamenabfragen

Auf Methodennamen basierende Abfragen werden generiert, indem der Methodenname analysiert wird, um die erwartete auszuführende Abfrage zu generieren:

public List findByName(String name);

In unserer Repository-Schnittstelle haben wir die findByName- Methode, die eine Abfrage basierend auf dem Methodennamen generiert:

List retrievedProducts = productRepository.findByName("Phone");

4.2. Abfrage mit @ Query- Annotation

Solr-Suchabfragen können erstellt werden, indem die Abfrage in einer @ Query- Annotation einer Methode enthalten ist. In unserem Beispiel wird findByCustomQuery mit @Query- Annotation versehen:

@Query("id:*?0* OR name:*?0*") public Page findByCustomQuery(String searchTerm, Pageable pageable);

Verwenden Sie diese Methode, um Dokumente abzurufen:

Page result = productRepository.findByCustomQuery("Phone", new PageRequest(0, 10));

Durch Aufrufen von findByCustomQuery ("Telefon", neue Seitenanforderung (0, 10)) erhalten wir die erste Seite der Produktdokumente, die das Wort "Telefon" in einem der Felder ID oder Name enthalten .

4.3. Benannte Abfrage

Benannte Abfragen ähneln Abfragen mit @Query- Annotation, außer dass die Abfragen in einer separaten Eigenschaftendatei deklariert werden:

@Query(name = "Product.findByNamedQuery") public Page findByNamedQuery(String searchTerm, Pageable pageable);

Beachten Sie, dass die Annotation @Query nicht erforderlich ist, wenn der Schlüssel ( findByNamedQuery ) der Abfrage in der Eigenschaftendatei mit dem Methodennamen übereinstimmt.

Lassen Sie uns einige Dokumente mit der benannten Abfragemethode abrufen:

Page result = productRepository.findByNamedQuery("one", new PageRequest(0, 10));

5. Schlussfolgerung

Dieser Artikel ist eine schnelle und praktische Einführung in Spring Data Solr. Er behandelt die Grundkonfiguration, das Definieren von Repositorys und das natürliche Abfragen.

Und wie immer stehen die hier verwendeten Beispiele als Beispielprojekt auf Github zur Verfügung.