Heim > Java > So durchsuchen Sie alle Felder einer indizierten Entität in ElasticSeacrch mit hibernateSearch 6

So durchsuchen Sie alle Felder einer indizierten Entität in ElasticSeacrch mit hibernateSearch 6

PHPz
Freigeben: 2024-02-11 17:15:11
nach vorne
1225 Leute haben es durchsucht

Der

php-Editor Baicao führt eine Methode ein, mit der Hibernate Search 6 alle Felder von Indexentitäten in Elasticsearch durchsuchen kann. Hibernate Search 6 ist eine leistungsstarke Volltextsuchmaschine, die sich nahtlos in Elasticsearch integriert. Durch die Konfiguration und Verwendung von Hibernate Search 6 können Sie alle Felder einer Entität problemlos in Elasticsearch indizieren und effiziente Volltextsuchfunktionen implementieren. In diesem Artikel erfahren Sie, wie Sie Hibernate Search 6 konfigurieren und verwenden, um dieses Ziel zu erreichen. Wenn Sie die Schritte in diesem Artikel befolgen, können Sie schnell eine leistungsstarke Volltextsuchmaschine erstellen und die Suchfunktionen Ihrer Anwendung verbessern.

Frageninhalt

Ich habe die folgende Methode, um in Elasticsearch mithilfe der Hibernate-Such-API zu suchen. Ich übergebe den Abfragezeichenfolgenwert als „addresses.address_key:123“, der in „adresses.address_key“ gesucht wird, wie in den Feldern (addresses.address_key) angegeben.

So veranlassen Sie diese Methode, alle Eingaben in der Abfragezeichenfolge zu akzeptieren, zum Beispiel: Vorname:John und lassen Sie es in allen Volltextfeldern suchen.

elasticsearch-Version: 8.10 Hibernatesearch-Version: 6.2.2

public page<employee> searchemployee(string querystring) {
       try {
            searchsession searchsession = search.session(entitymanager);

            searchresult<employee> searchresult = searchsession.search(employee.class)
                    .extension(elasticsearchextension.get())
                    .where(f -> f.simplequerystring().fields("addresses.address_key").matching(querystring))
                    .fetch(math.tointexact(page.getoffset()), page.getpagesize());

            page<employee> pageresult = new pageimpl<>(searchresult.hits(), page, searchresult.total().hitcount());
            return pageresult;
        } catch (searchexception pe) {
           throw pe;
        }
}
Nach dem Login kopieren

Indizierte Entitätsklasse:

@Indexed(index = "employee")
public class Employee {

  @FullTextField(name = "employee_key")
  private String employeeKey;

  @FullTextField(name = "first_name")
  private String firstName;
    
  @IndexedEmbedded(includeEmbeddedObjectId = true, includeDepth = 2)
  private Address addresses;
}

public class Address {
    
  @FullTextField(name = "address_key")
  private String addressKey;

  @FullTextField(name = "street_name")
  private String streetName;

}
Nach dem Login kopieren

Workaround

Sie können mehrere Felder gezielt ansprechen , wenn Sie ein Prädikat definieren:

searchresult<employee> searchresult = searchsession.search(employee.class)
        .where(f -> f.simplequerystring()
                .fields("employee_key", "first_name", "addresses.address_key")
                .matching(querystring))
        .fetch(math.tointexact(page.getoffset()), page.getpagesize());
Nach dem Login kopieren

Es gibt derzeit keine Option, nur auf „alle Textfelder“ abzuzielen; siehe https://www.php.cn/link/0b36451530d9491114523d4b66253837.

Außerdem unterstützt die einfache Abfragezeichenfolgensyntax keinen expliziten Verweis auf Felder in der Abfragezeichenfolge.

In diesem Beispiel:

f.simplequerystring().fields("addresses.address_key")
        .matching("addresses.address_key:123")
Nach dem Login kopieren

...Das Präfix „addresses.address_key:“ („addresses.address_key:123“) in der Suchzeichenfolge hat keine spezifische Bedeutung und wird nur als der im Dokument gefundene Begriff interpretiert.

Du könntest genauso gut so schreiben:

f.simplequerystring().fields("addresses.address_key")
        .matching("addresses.address_key 123")
Nach dem Login kopieren

Aber eigentlich denke ich, was Sie wollen, ist Folgendes:

f.simpleQueryString().fields("addresses.address_key")
        .matching("123")
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonSo durchsuchen Sie alle Felder einer indizierten Entität in ElasticSeacrch mit hibernateSearch 6. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage