Maison  >  Article  >  Comment rechercher tous les champs d'une entité indexée dans ElasticSeacrch à l'aide d'hibernateSearch 6

Comment rechercher tous les champs d'une entité indexée dans ElasticSeacrch à l'aide d'hibernateSearch 6

PHPz
PHPzavant
2024-02-11 17:15:111141parcourir

L'éditeur php Baicao introduit une méthode permettant d'utiliser Hibernate Search 6 pour rechercher tous les champs des entités d'index dans Elasticsearch. Hibernate Search 6 est un puissant moteur de recherche en texte intégral qui s'intègre parfaitement à Elasticsearch. En configurant et en utilisant Hibernate Search 6, vous pouvez facilement indexer tous les champs d'une entité dans Elasticsearch et mettre en œuvre des fonctionnalités de recherche en texte intégral efficaces. Cet article vous expliquera comment configurer et utiliser Hibernate Search 6 pour atteindre cet objectif. En suivant les étapes de cet article, vous serez en mesure de créer rapidement un puissant moteur de recherche en texte intégral et d'améliorer les capacités de recherche de votre application.

Contenu de la question

J'ai la méthode suivante pour effectuer une recherche dans elasticsearch à l'aide de l'API de recherche hibernate. Je transmets la valeur de la chaîne de requête sous la forme "addresses.address_key:123" qui est recherchée dans adresses.address_key comme mentionné dans les champs (adresses.address_key).

Comment faire en sorte que cette méthode accepte n'importe quelle entrée dans la chaîne de requête, par exemple : prénom:john et faites-le rechercher dans tous les champs de texte intégral.

version de recherche élastique : 8.10 version de recherche en veille prolongée : 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;
        }
}

Classe d'entité indexée :

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

}

Solution de contournement

Vous pouvez cibler plusieurs champs explicitement lors de la définition d'un prédicat :

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

Il n'existe actuellement aucune option pour cibler uniquement « tous les champs de texte » ; voir https://www.php.cn/link/0b36451530d9491114523d4b66253837.

De plus, pour être clair, la syntaxe de chaîne de requête simple ne prend pas en charge les références explicites aux champs de la chaîne de requête.

Dans cet exemple :

f.simplequerystring().fields("addresses.address_key")
        .matching("addresses.address_key:123")

...Le préfixe "addresses.address_key:" ("addresses.address_key:123") dans la chaîne de recherche n'a pas de signification spécifique et sera uniquement interprété comme le terme trouvé dans le document.

Autant écrire ainsi :

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

Mais en fait, je pense que ce que tu veux, c'est ceci :

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer