Java >> Java Tutorial >  >> Tag >> Spring

Spring Data Solr Tutorial:Sortieren

Wenn wir eine Wortsuchfunktion implementieren, möchten wir die Suchergebnisse normalerweise in absteigender Reihenfolge sortieren, indem wir die Relevanz der einzelnen Suchergebnisse verwenden. Dies ist auch das Standardverhalten von Solr.

Es gibt jedoch Situationen, in denen es sinnvoll ist, die Sortierreihenfolge manuell festzulegen. Eine solche Situation ist die Implementierung einer "normalen" Suchfunktion, die im vorherigen Teil meines Spring Data Solr-Tutorials besprochen wurde.

Dieser Blogbeitrag beschreibt, wie wir unsere Abfrageergebnisse mit Spring Data Solr sortieren können. Um genauer zu sein, müssen wir die Suchfunktion unserer Beispielanwendung ändern, um die Suchergebnisse in absteigender Reihenfolge zu sortieren, indem wir den Wert der id verwenden aufstellen.

Dieser Blogbeitrag ist in drei Abschnitte unterteilt:

  • Der erste Abschnitt beschreibt, wie wir die in unseren Abfragen verwendeten Sortieroptionen angeben können.
  • Der zweite Abschnitt beschreibt, wie wir unsere Abfrageergebnisse sortieren können, wenn wir unsere Abfragen mithilfe von Abfragemethoden erstellen.
  • Der dritte Abschnitt lehrt uns, die Abfrageergebnisse dynamischer Abfragen zu sortieren.

Fangen wir an.

Festlegen der Sortieroptionen einer Abfrage

Die Sortieroptionen einer Abfrage werden mit der Sortierung angegeben Klasse. Die typischen Anforderungen zum Sortieren von Abfrageergebnissen sind im Folgenden angegeben:

  • Sortieren Sie die Abfrageergebnisse anhand des Werts eines einzelnen Felds.
  • Sortieren Sie die Abfrageergebnisse anhand der Werte mehrerer Felder, wenn die Sortierreihenfolge verschiedener Felder gleich ist.
  • Sortieren Sie die Abfrageergebnisse anhand der Werte mehrerer Felder, wenn die Sortierreihenfolge verschiedener Felder nicht gleich ist.

Schauen wir uns an, wie wir eine Sortierung erstellen können Objekt, das die angegebenen Anforderungen erfüllt.

Zuerst müssen wir eine Sortierung erstellen -Objekt, das angibt, dass Abfrageergebnisse mithilfe eines einzelnen Felds sortiert werden. Nehmen wir an, wir möchten die Abfrageergebnisse anhand der id in aufsteigender Reihenfolge sortieren aufstellen. Wir können die Sortierung erstellen Objekt, indem Sie den folgenden Code verwenden:

new Sort(Sort.Direction.ASC, "id")

Zweitens müssen wir eine Sortierung erstellen -Objekt, das angibt, dass Abfrageergebnisse anhand der Werte mehrerer Felder sortiert werden, wenn die Sortierreihenfolge verschiedener Felder gleich ist. Nehmen wir an, dass wir die Abfrageergebnisse in absteigender Reihenfolge sortieren müssen, indem wir die id verwenden und Beschreibung Felder. Wir können die Sortierung erstellen Objekt, indem Sie den folgenden Code verwenden:

new Sort(Sort.Direction.DESC, "id", "description")

Drittens möchten wir die Abfrageergebnisse sortieren, indem wir die Werte mehrerer Felder verwenden, wenn die Sortierreihenfolge verschiedener Felder nicht dieselbe ist. Nehmen wir an, wir möchten die Abfrageergebnisse anhand der Beschreibung in absteigender Reihenfolge sortieren Feld und in aufsteigender Reihenfolge unter Verwendung der id aufstellen. Wir können die Sortierung erstellen Objekt, indem Sie den folgenden Code verwenden:

new Sort(Sort.Direction.DESC, "description").and(new Sort(Sort.Direction.ASC, "id"))

Wir wissen jetzt, wie wir eine neue Sortierung erstellen können Objekte. Lassen Sie uns weitermachen und diese Theorie in die Praxis umsetzen.

Sortieren der Abfrageergebnisse von Abfragemethoden

Wenn wir unsere Abfragen mithilfe von Abfragemethoden erstellen, können wir die Abfrageergebnisse folgendermaßen sortieren:

  1. Fügen Sie eine neue Sortierung hinzu Parameter für die Abfragemethode. Dieser Methodenparameter gibt die verwendeten Sortieroptionen an.
  2. Erstellen Sie eine neue Sortierung Objekt in der Dienstschicht und übergeben Sie es als Methodenparameter, wenn die Abfragemethode aufgerufen wird.

Lassen Sie uns weitermachen und herausfinden, wie das gemacht wird.

Ändern der Repository-Schnittstelle

Wir können die Abfrageergebnisse unserer Abfrage sortieren, indem wir eine neue Sortierung hinzufügen Parameter für unsere Abfragemethode. Dieser Methodenparameter gibt die Sortieroptionen der ausgeführten Abfrage an. Lassen Sie uns weitermachen und einen Blick auf die Deklarationen unserer Abfragemethoden werfen.

Abfragegenerierung aus Methodenname

Wenn die ausgeführte Abfrage mithilfe der Abfragegenerierungsstrategie aus Methodennamen erstellt wird, müssen wir eine Sortierung hinzufügen -Parameter zu findByTitleContainsOrDescriptionContains() -Methode des TodoDocumentRepository Schnittstelle. Der Quellcode unserer Repository-Schnittstelle sieht wie folgt aus:

import org.springframework.data.domain.Sort;
import org.springframework.data.solr.repository.Query;
import org.springframework.data.solr.repository.SolrCrudRepository;

import java.util.List;

public interface TodoDocumentRepository extends PartialUpdateRepository, SolrCrudRepository<TodoDocument, String> {

    public List<TodoDocument> findByTitleContainsOrDescriptionContains(String title, String description, Sort sort);
}

Benannte Abfragen

Wenn die ausgeführte Abfrage mithilfe benannter Abfragen erstellt wird, müssen wir eine Sortierung hinzufügen -Parameter zu findByNamedQuery() -Methode des TodoDocumentRepository Schnittstelle. Der Quellcode unserer Repository-Schnittstelle sieht wie folgt aus:

import org.springframework.data.domain.Sort;
import org.springframework.data.solr.repository.Query;
import org.springframework.data.solr.repository.SolrCrudRepository;

import java.util.List;

public interface TodoDocumentRepository extends PartialUpdateRepository, SolrCrudRepository<TodoDocument, String> {

    @Query(name = "TodoDocument.findByNamedQuery")
    public List<TodoDocument> findByNamedQuery(String searchTerm, Sort sort);
}

Hinweis: Dieser Ansatz funktioniert aufgrund eines bekannten Fehlers nicht, wenn wir Spring Data Solr RC1 verwenden. Wir müssen entweder die Build-Snapshot-Abhängigkeit verwenden oder auf die Veröffentlichung von RC2 warten.

Die @Query-Anmerkung

Wenn die ausgeführte Abfrage mithilfe von @Query erstellt wird Anmerkung, müssen wir eine Sortierung hinzufügen -Parameter zu findByQueryAnnotation() -Methode des TodoDocumentRepository Schnittstelle. Der Quellcode unserer Repository-Schnittstelle sieht wie folgt aus:

import org.springframework.data.domain.Sort;
import org.springframework.data.solr.repository.Query;
import org.springframework.data.solr.repository.SolrCrudRepository;

import java.util.List;

public interface TodoDocumentRepository extends PartialUpdateRepository, SolrCrudRepository<TodoDocument, String> {

    @Query("title:*?0* OR description:*?0*")
    public List<TodoDocument> findByQueryAnnotation(String searchTerm, Sort sort);
}

Hinweis: Dieser Ansatz funktioniert aufgrund eines bekannten Fehlers nicht, wenn wir Spring Data Solr RC1 verwenden. Wir müssen entweder die Build-Snapshot-Abhängigkeit verwenden oder auf die Veröffentlichung von RC2 warten.

Verwendung der Abfragemethode

Wir können die modifizierte Abfragemethode verwenden, indem wir die folgenden Änderungen an search() vornehmen Methode des RepositoryIndexService Klasse:

  1. Erstellen Sie eine private sortByIdDesc() -Methode, die angibt, dass die Abfrageergebnisse anhand der id in absteigender Reihenfolge sortiert werden des Dokuments.
  2. Erhalten Sie die sortierten Abfrageergebnisse, indem Sie die im TodoDocumentRepository deklarierte Abfragemethode aufrufen Schnittstelle.
  3. Geben Sie die Abfrageergebnisse zurück.

Lassen Sie uns weitermachen und einen Blick auf die verschiedenen Implementierungen von search() werfen Methode.

Abfragegenerierung aus Methodenname

Wenn wir unsere Abfragen mithilfe der Abfragegenerierungsstrategie aus Methodennamen erstellen, können wir die Abfrageergebnisse mithilfe von findByTitleContainsOrDescriptionContains() abrufen -Methode des TodoDocumentRepository Schnittstelle.

Der Quellcode des relevanten Teils von RepositoryTodoIndexService Klasse sieht wie folgt aus:

import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;

@Service
public class RepositoryTodoIndexService implements TodoIndexService {

    @Resource
    private TodoDocumentRepository repository;

    @Override
    public List<TodoDocument> search(String searchTerm) {
        return repository.findByTitleContainsOrDescriptionContains(searchTerm, searchTerm, sortByIdDesc());
    }

	private Sort sortByIdDesc() {
		return new Sort(Sort.Direction.DESC, "id");
	}
	
	//Other methods are omitted
}

Benannte Abfragen

Wenn wir unsere Abfragen mithilfe benannter Abfragen erstellen, können wir die Abfrageergebnisse mithilfe von findByNamedQuery() abrufen -Methode des TodoDocumentRepository Schnittstelle.

Der relevante Teil des RepositoryTodoIndexService sieht wie folgt aus:

import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;

@Service
public class RepositoryTodoIndexService implements TodoIndexService {

    @Resource
    private TodoDocumentRepository repository;

    @Override
    public List<TodoDocument> search(String searchTerm) {
        return repository.findByNamedQuery(searchTerm, sortByIdDesc());
    }

	private Sort sortByIdDesc() {
		return new Sort(Sort.Direction.DESC, "id");
	}
	
	//Other methods are omitted
}

Die @Query-Anmerkung

Wenn wir unsere Abfragen mithilfe von @Query erstellen Annotation können wir die Abfrageergebnisse mithilfe von findByQueryAnnotation() erhalten -Methode des TodoDocumentRepository Schnittstelle.

Der relevante Teil des RepositoryTodoIndexService Klasse sieht wie folgt aus:

import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;

@Service
public class RepositoryTodoIndexService implements TodoIndexService {

    @Resource
    private TodoDocumentRepository repository;

    @Override
    public List<TodoDocument> search(String searchTerm) {
        return repository.findByQueryAnnotation(searchTerm, sortByIdDesc());
    }

	private Sort sortByIdDesc() {
		return new Sort(Sort.Direction.DESC, "id");
	}
	
	//Other methods are omitted
}

Sortieren der Abfrageergebnisse dynamischer Abfragen

Da dynamische Abfragen durch Hinzufügen einer benutzerdefinierten Methode zu einer Repository-Schnittstelle erstellt werden, haben die zum Sortieren der Abfrageergebnisse einer dynamischen Abfrage erforderlichen Schritte keine Auswirkungen auf die Dienstschicht unserer Beispielanwendung.

Wir können die Abfrageergebnisse dynamischer Abfragen sortieren, indem wir die folgenden Änderungen an der Implementierung unserer benutzerdefinierten Repository-Schnittstelle vornehmen:

  1. Fügen Sie ein privates sortByIdDesc() hinzu -Methode zum TodoDocumentRepositoryImpl Klasse. Diese Methode gibt eine Sortierung zurück -Objekt, das angibt, dass die Abfrageergebnisse mithilfe der id in absteigender Reihenfolge sortiert werden des Dokuments.
  2. Ändern Sie die Suche() -Methode des TodoDocumentRepositoryImpl Klasse. Setzen Sie die Sortieroptionen auf die ausgeführte Abfrage, indem Sie addSort() verwenden Methode der Abfrage -Schnittstelle und übergeben Sie die erstellte Sortierung Objekt als Methodenparameter.

Der relevante Teil des TodoDocumentRepositoryImpl Klasse sieht wie folgt aus:

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Sort;
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;
import java.util.List;

@Repository
public class TodoDocumentRepositoryImpl implements CustomTodoDocumentRepository {

    @Resource
    private SolrTemplate solrTemplate;

    @Override
    public List<TodoDocument> search(String searchTerm) {
        String[] words = searchTerm.split(" ");

        Criteria conditions = createSearchConditions(words);
        SimpleQuery search = new SimpleQuery(conditions);
        
		//SET SORT OPTIONS
		search.addSort(sortByIdDesc());

        Page 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("id").contains(word)
                        .or(new Criteria("description").contains(word));
            }
            else {
                conditions = conditions.or(new Criteria("id").contains(word))
                        .or(new Criteria("description").contains(word));
            }
        }

        return conditions;
    }

    private Sort sortByIdDesc() {
        return new Sort(Sort.Direction.DESC, "id");
    }

	//Other methods are omitted
}

Zusammenfassung

Wir haben nun gelernt, wie wir Abfrageergebnisse mit Spring Data Solr sortieren können. Dieses Tutorial hat uns drei Dinge gelehrt:

  • Wir wissen, dass wir die verwendeten Sortieroptionen mit der Sortierung angeben können Klasse.
  • Wir haben gelernt, dass wir das Abfrageergebnis von Abfragemethoden sortieren können, indem wir der Abfragemethode einen neuen Methodenparameter hinzufügen.
  • Wir haben gelernt, dass wir die Sortieroptionen für eine dynamische Abfrage festlegen können, indem wir addSort() verwenden Methode der Abfrage Schnittstelle.

Der nächste Teil meines Spring Data Solr-Tutorials beschreibt, wie wir die Abfrageergebnisse unserer Abfragen paginieren können.

P.S. Die Beispielanwendungen dieser Blogbeiträge sind auf Github verfügbar (Abfragemethoden und dynamische Abfragen).


Java-Tag