Maison > Java > 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
Libérer: 2024-02-11 17:15:11
avant
1280 Les gens l'ont consulté

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;
        }
}
Copier après la connexion

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;

}
Copier après la connexion

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());
Copier après la connexion

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")
Copier après la connexion

...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")
Copier après la connexion

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

f.simpleQueryString().fields("addresses.address_key")
        .matching("123")
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal