Spring Data Solr Tutorial: Dynamische Abfragen

Von Petri Kainulainen @petrikainulaine Solr wird oft als Suchserver bezeichnet, den wir verwenden können, wenn wir Volltextsuchfunktionen implementieren. Es ist…

Von Petri Kainulainen @petrikainulaine

Solr wird oft als Suchserver bezeichnet, den wir verwenden können, wenn wir Volltextsuchfunktionen implementieren. Es ist jedoch oft ratsam, die Leistung von Solr zu nutzen, wenn wir eine Suchfunktion implementieren, die ihre Eingabe aus einem Suchformular bezieht.

In diesem Szenario hängt die ausgeführte Suchanfrage von der empfangenen Eingabe ab. Das bedeutet, dass die Anzahl der Abfrageparameter von den Eingaben in das Suchformular abhängt. Mit anderen Worten, die ausgeführte Suchabfrage ist dynamisch.

Im vorherigen Teil meines Spring Data Solr-Tutorials haben wir gelernt, wie wir einem einzelnen Repository benutzerdefinierte Methoden hinzufügen können. Jetzt ist es an der Zeit, diese Informationen anzuwenden und herauszufinden, wie wir mit Spring Data Solr dynamische Abfragen erstellen können.

Fangen wir an.

Hinweis: Diese Blogeinträge enthalten zusätzliche Informationen, die uns helfen, die in diesem Blogbeitrag beschriebenen Konzepte zu verstehen:

Dynamische Abfragen erstellen

Dieser Abschnitt beschreibt, wie wir mit Spring Data Solr dynamische Abfragen erstellen können. Er ist in zwei Unterabschnitte unterteilt, die im Folgenden beschrieben werden:

  • Der erste Unterabschnitt beschreibt die Grundlagen, die wir kennen müssen, bevor wir mit der eigentlichen Suchfunktion beginnen können.
  • Der zweite Unterabschnitt beschreibt, wie wir die Suchfunktion unserer Beispielanwendung implementieren können, indem wir eine benutzerdefinierte Methode zu unserem Spring Data Solr-Repository hinzufügen.

Lernen Sie die Grundlagen

Bevor wir mit der Implementierung der Suchfunktion unserer Beispielanwendung beginnen können, müssen wir wissen, wie wir mit Spring Data Solr „manuell“ Abfragen erstellen können. Wir können eine Abfrage „manuell“ erstellen, indem wir die folgenden Schritte ausführen:

  1. Erstellen Sie die Suchkriterien.
  2. Erstellen Sie die Abfrage, die die verwendeten Suchkriterien enthält.
  3. Führen Sie die erstellte Abfrage aus.

Diese Schritte werden im Folgenden ausführlicher beschrieben.

Erstellen der Suchkriterien

Zunächst müssen wir die Suchkriterien für unsere Abfrage erstellen. Dies können wir mit Hilfe der Kriterienklassen tun, die im Folgenden beschrieben werden:

  • Die org.springframework.data.solr.core.query.SimpleStringCriteria Klasse ist eine grundlegende Kriterienklasse, die verwendet wird, um die ausgeführte Abfrage mit Hilfe einer bereits formatierten Abfragezeichenfolge zu spezifizieren. Der in dieser Klasse angegebene Abfrage-String wird so ausgeführt, wie er ist. Daher kann diese Klasse nicht zur Erstellung dynamischer Abfragen verwendet werden.
  • Die org.springframework.data.solr.core.query.Criteria ist eine Kriterienklasse, die zur Erstellung dynamischer Abfragen verwendet wird. Sie verfügt über eine fließende API, die die Verkettung mehrerer Criteria-Objekte unterstützt.

Erstellen der ausgeführten Abfrage

Zweitens müssen wir die ausgeführte Abfrage erstellen. Die Abfrageklassen von Spring Data Solr werden im Folgenden beschrieben:

Ausführen der erstellten Abfrage

Drittens müssen wir die erstellte Abfrage ausführen. Die SolrTemplate Klasse implementiert mehrere Methoden, die wir zu diesem Zweck verwenden können. Diese Methoden werden im Folgenden beschrieben:

  • Die Methode long count(final SolrDataQuery query) gibt die Anzahl der gefundenen Dokumente mit der als Methodenparameter angegebenen Abfrage zurück.
  • Die Methode UpdateResponse delete(SolrDataQuery query) löscht die Dokumente, die mit der als Methodenparameter angegebenen Abfrage übereinstimmen, und gibt ein UpdateResponse-Objekt zurück.
  • Die Methode T queryForObject(Query query, Class< T > clazz) gibt ein einzelnes Dokument zurück, das mit der als Methodenparameter angegebenen Abfrage übereinstimmt.
  • Die Methode FacetPage< T > queryForFacetPage(FacetQuery query, Class< T > clazz) führt eine Facettenabfrage gegen den Solr-Index aus und gibt die Abfrageergebnisse als FacetPage Objekt zurück.
  • Die Methode Page< T > queryForPage(Query query, Class< T > clazz) führt die Abfrage gegen den Solr-Index aus und gibt die Abfrageergebnisse als eine Implementierung der Schnittstelle Page zurück.

Lassen Sie uns weitermachen und diese Theorie in die Praxis umsetzen.

Implementierung der Suchfunktion

Die Anforderungen an unsere Suchfunktion sind folgende:

  • Die Suchfunktion muss alle ToDo-Einträge zurückgeben, deren Name oder Beschreibung ein Wort des angegebenen Suchbegriffs enthält. Mit anderen Worten: Wenn der Suchbegriff „Foo Bar“ lautet, muss unsere Suchfunktion ToDo-Einträge zurückgeben, deren Titel oder Beschreibung entweder „Foo“ oder „Bar“ enthält.
  • Bei der Suche muss die Groß- und Kleinschreibung beachtet werden.

Da unsere Suchfunktion nicht statisch ist, müssen wir sie mit Hilfe einer dynamischen Abfrage erstellen. Wir können dynamische Abfragen mit Spring Data Solr erstellen, indem wir eine benutzerdefinierte Methode zu unserem Spring Data Solr Repository hinzufügen. Mit anderen Worten, wir müssen diese Schritte befolgen:

  1. Erstellen Sie eine benutzerdefinierte Schnittstelle, die die hinzugefügte Methode deklariert.
  2. Implementieren Sie die erstellte Schnittstelle.
  3. Ändern Sie die Repository-Schnittstelle, um die erstellte Schnittstelle zu erweitern.

Diese Schritte werden im Folgenden ausführlicher beschrieben.

Erstellen der benutzerdefinierten Schnittstelle

Zunächst müssen wir eine benutzerdefinierte Schnittstelle erstellen, die unsere benutzerdefinierte Suchmethode deklariert. Dazu führen wir die folgenden Schritte aus:

  1. Erstellen Sie eine Schnittstelle namens CustomTodoDocumentRepository.
  2. Deklarieren Sie die Methode search(). Diese Methode nimmt den verwendeten Suchbegriff als Methodenparameter und gibt eine Liste von TodoDocument-Objekten zurück.

Der Quellcode der Schnittstelle CustomTodoDocumentRepository sieht wie folgt aus:

[as3 autolinks=“false“ classname=“myclass“ collapse=“false“ firstline=“1″ gutter=“true“ htmlscript=“false“ light=“false“ padlinenumbers=“false“ smarttabs=“true“ tabsize=“4″ toolbar=“false“]
public interface CustomTodoDocumentRepository {

public List search(String searchTerm);

//Andere Methoden werden weggelassen.
}[/as3]

Implementieren der erstellten Schnittstelle

Zweitens müssen wir die benutzerdefinierte Schnittstelle implementieren, die wir zuvor erstellt haben. Dazu führen wir die folgenden Schritte aus:

  1. Erstellen Sie eine Klasse namens TodoDocumentRepositoryImpl und erweitern Sie die Schnittstelle CustomTodoDocumentRepository.
  2. Annotieren Sie die Klasse mit der @Repository-Anmerkung.
  3. Fügen Sie der Klasse das Feld SolrTemplate hinzu und versehen Sie es mit der Annotation @Resource.
  4. Implementieren Sie die Methode search().

Die Implementierung der Methode search() erfordert eine ausführlichere Beschreibung, die hier gegeben wird. Wir können die search() -Methode implementieren, indem wir diese Schritte befolgen:

  1. Erhalten Sie die Wörter des Suchbegriffs.
  2. Konstruieren Sie die verwendeten Suchkriterien, indem Sie die private Methode createSearchConditions() aufrufen und die Wörter des Suchbegriffs als Methodenparameter übergeben. Diese Methode erstellt die verwendeten Suchkriterien unter Verwendung der API der Klasse Criteria.
  3. Erstellen Sie die ausgeführte Abfrage, indem Sie ein neues SimpleQuery-Objekt erstellen und das erstellte Criteria-Objekt als Konstruktorparameter übergeben.
  4. Rufen Sie die Suchergebnisse ab, indem Sie die Methode queryForPage() der Klasse SolrTemplate aufrufen. Übergeben Sie die erstellte Abfrage und den Typ der erwarteten Ergebnisobjekte als Methodenparameter.
  5. Geben Sie die Suchergebnisse zurück, indem Sie die Methode getContent() der Schnittstelle Page aufrufen.

Der Quellcode der Klasse TodoDocumentRepositoryImpl sieht wie folgt aus:

[as3 autolinks=“false“ classname=“myclass“ collapse=“false“ firstline=“1″ gutter=“true“ htmlscript=“false“ light=“false“ padlinenumbers=“false“ smarttabs=“true“ tabsize=“4″ toolbar=“false“]
import org.springframework.data.domain.Page;
import org.springframework.data.solr.core.SolrTemplate;
import org.springframework.data.solr.core.query.Criteria;
import org.springframework.data.solr.core.query.SimpleQuery;
import org.springframework.stereotype.Repository;

import javax.annotation.Resource;

@Repository
public class TodoDocumentRepositoryImpl implements CustomTodoDocumentRepository {

@Resource
private SolrTemplate solrTemplate;

@Override
public List search(String searchTerm) {
String[] words = searchTerm.split(“ „);

Criteria conditions = createSearchConditions(words);
SimpleQuery search = new SimpleQuery(conditions);

Seite results = solrTemplate.queryForPage(search, TodoDocument.class);
return results.getContent();
}

private Criteria createSearchConditions(String[] words) {
Criteria conditions = null;

for (String word: words) {
if (conditions == null) {
conditions = new Criteria(„title“).contains(word)
.or(new Criteria(„description“).contains(word));
}
else {
conditions = conditions.or(new Criteria(„title“).contains(word))
.or(new Criteria(„description“).contains(word));
}
}

return conditions;
}

//Andere Methoden werden weggelassen
}
[/as3]

Ändern der Repository-Schnittstelle

Drittens müssen wir unsere benutzerdefinierte search() -Methode für die Benutzer unseres Repositorys sichtbar machen. Dies können wir tun, indem wir die Schnittstelle CustomTodoDocumentRepository erweitern. Der Quellcode der Schnittstelle TodoDocumentRepository sieht wie folgt aus:

[as3 autolinks=“false“ classname=“myclass“ collapse=“false“ firstline=“1″ gutter=“true“ htmlscript=“false“ light=“false“ padlinenumbers=“false“ smarttabs=“true“ tabsize=“4″ toolbar=“false“]
import org.springframework.data.solr.repository.SolrCrudRepository;

public interface TodoDocumentRepository extends CustomTodoDocumentRepository, SolrCrudRepository {

}
[/as3]

Wir haben jetzt eine benutzerdefinierte search() -Methode zu unserem Spring Data Solr-Repository hinzugefügt. Lassen Sie uns herausfinden, wie wir diese Methode verwenden können.

Verwendung der benutzerdefinierten Methode

Wir können die benutzerdefinierte Methode verwenden, indem wir die Methode search() der Klasse RepositoryTodoIndexService ändern. Die neue Implementierung dieser Methode ist sehr einfach. Sie holt sich die Suchergebnisse, indem sie die search() -Methode unseres Spring Data Solr-Repositorys aufruft und die Suchergebnisse zurückgibt.

Der Quellcode der Klasse RepositoryTodoIndexService sieht wie folgt aus:

[as3 autolinks=“false“ classname=“myclass“ collapse=“false“ firstline=“1″ gutter=“true“ htmlscript=“false“ light=“false“ padlinenumbers=“false“ smarttabs=“true“ tabsize=“4″ toolbar=“false“]
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

@Service
public class RepositoryTodoIndexService implements TodoIndexService {

@Resource
private TodoDocumentRepository repository;

//Andere Methoden werden weggelassen.

@Override
public List search(String searchTerm) {
return repository.search(searchTerm);
}
}
[/as3]

Zusammenfassung

Wir haben jetzt eine dynamische Suchfunktion mit Spring Data Solr implementiert. Obwohl unsere Suchfunktion eher einfach war, sollten wir nun auch komplexere Abfragen implementieren können.

Dieses Tutorial hat uns zwei Dinge gelehrt:

  • Wir haben gelernt, wie wir mit Spring Data Solr „manuell“ Abfragen erstellen können.
  • Wir haben gelernt, dass wir dynamische Suchmethoden implementieren müssen, indem wir eine benutzerdefinierte Methode zu einem einzelnen Repository hinzufügen.

Der nächste Teil meines Spring Data Solr-Tutorials beschreibt, wie wir unsere Abfrageergebnisse sortieren können.

P.S. Die Beispielanwendung zu diesem Blogbeitrag ist auf Github verfügbar.

Den Originalbeitrag von Petri Kainulainen @petrikainulaine finden Sie hier.

You Might Also Like

Vom Suchunternehmen zum praktischen KI-Pionier: Unsere Vision für 2025 und darüber hinaus

CEO Mike Sinoway gibt Einblicke in die Zukunft der KI und stellt...

Read More

Wenn KI schief geht: Fehlschläge in der realen Welt und wie man sie vermeidet

Lassen Sie nicht zu, dass Ihr KI-Chatbot einen 50.000 Dollar teuren Tahoe...

Read More

Lucidworks Kernpakete: Branchenoptimierte KI-Such- und Personalisierungslösungen

Entdecken Sie unsere umfassenden Core Packages, die Analytics Studio, Commerce Studio und...

Read More

Quick Links