Heim  >  Artikel  >  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
PHPznach vorne
2024-02-11 17:15:111191Durchsuche

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;
        }
}

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;

}

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());

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")

...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")

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

f.simpleQueryString().fields("addresses.address_key")
        .matching("123")

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen