Introduction à Spring Data Solr

1. Vue d'ensemble

Dans cet article, nous allons explorer les bases de Spring Data Solr de manière pratique.

Apache Solr est un moteur de recherche en texte intégral open source prêt à déployer. Vous pouvez en savoir plus sur les fonctionnalités de Solr sur le site officiel.

Nous montrerons comment faire une configuration Solr simple et bien sûr comment interagir avec le serveur.

Tout d'abord, nous devons démarrer un serveur Solr et créer un noyau pour stocker les données (qui, par défaut, Solr créera en mode sans schéma).

2. Données de printemps

Comme tout autre projet Spring Data, Spring Data Solr a pour objectif clair de supprimer les codes passe-partout, dont nous profiterons certainement.

2.1. Dépendance de Maven

Commençons par ajouter la dépendance Spring Data Solr à notre pom.xml :

 org.springframework.data spring-data-solr 2.0.5.RELEASE 

Vous pouvez trouver les dernières dépendances ici.

2.2. Définition du document

Définissons un document appelé Produit :

@SolrDocument(solrCoreName = "product") public class Product { @Id @Indexed(name = "id", type = "string") private String id; @Indexed(name = "name", type = "string") private String name; }

L' annotation @SolrDocument indique que la classe Product est un document Solr et est indexée sur le produit nommé principal . Les champs annotés avec @Indexed sont indexés dans Solr et pourront faire l'objet d'une recherche.

2.3. Définition de l'interface du référentiel

Ensuite, nous devons créer une interface de référentiel en étendant un référentiel fourni par Spring Data Solr. Nous allons naturellement paramétrer cela avec Product et String comme identifiant d'entité:

public interface ProductRepository extends SolrCrudRepository { public List findByName(String name); @Query("id:*?0* OR name:*?0*") public Page findByCustomQuery(String searchTerm, Pageable pageable); @Query(name = "Product.findByNamedQuery") public Page findByNamedQuery(String searchTerm, Pageable pageable); }

Remarquez comment nous définissons ici trois méthodes, en plus de l'API fournie par SolrCrudRepository . Nous en parlerons dans les prochaines sections.

Notez également que la propriété Product.findByNamedQuery est définie dans le fichier de requête Solr nommé solr-named-queries.properties dans le dossier classpath:

Product.findByNamedQuery=id:*?0* OR name:*?0*

2.4. Configuration Java

Nous allons maintenant explorer la configuration Spring de la couche de persistance Solr:

@Configuration @EnableSolrRepositories( basePackages = "com.baeldung.spring.data.solr.repository", namedQueriesLocation = "classpath:solr-named-queries.properties", multicoreSupport = true) @ComponentScan public class SolrConfig { @Bean public SolrClient solrClient() { return new HttpSolrClient("//localhost:8983/solr"); } @Bean public SolrTemplate solrTemplate(SolrClient client) throws Exception { return new SolrTemplate(client); } }

Nous utilisons @EnableSolrRepositories pour analyser les packages à la recherche de référentiels. Notez que nous avons spécifié l'emplacement du fichier de propriétés de requête nommé et activé la prise en charge multicœur.

Si le multicœur n'est pas activé, Spring Data supposera par défaut que la configuration Solr est pour un seul cœur. Nous activons le multicœur ici, juste pour référence.

3. Indexation, mise à jour et suppression

Afin de rechercher des documents dans Solr, les documents doivent être indexés dans le référentiel Solr.

L'exemple suivant indexe un document produit dans le référentiel Solr simplement en utilisant la méthode save de SolrCrudRepository :

Product phone = new Product(); phone.setId("P0001"); phone.setName("Phone"); productRepository.save(phone);

Maintenant, récupérons et mettons à jour un document:

Product retrievedProduct = productRepository.findOne("P0001"); retrievedProduct.setName("Smart Phone"); productRepository.save(retrievedProduct);

Les documents peuvent être supprimés en appelant simplement la méthode de suppression:

productRepository.delete(retrievedProduct);

4. Requête

Explorons maintenant différentes techniques d'interrogation fournies par l'API Spring Data Solr.

4.1. Génération de requête de nom de méthode

Les requêtes basées sur le nom de la méthode sont générées en analysant le nom de la méthode pour générer la requête attendue à exécuter:

public List findByName(String name);

Dans notre interface de référentiel, nous avons la méthode findByName qui génère une requête basée sur le nom de la méthode:

List retrievedProducts = productRepository.findByName("Phone");

4.2. Requête avec annotation @Query

Les requêtes de recherche Solr peuvent être créées en plaçant la requête dans une annotation @Query d'une méthode. Dans notre exemple, findByCustomQuery est annoté avec l' annotation @Query :

@Query("id:*?0* OR name:*?0*") public Page findByCustomQuery(String searchTerm, Pageable pageable);

Utilisons cette méthode pour récupérer des documents:

Page result = productRepository.findByCustomQuery("Phone", new PageRequest(0, 10));

En appelant le findByCustomQuery («Phone», new PageRequest (0, 10)), nous obtenons la première page des documents produit qui contiennent le mot «Phone» dans l'un de ses champs id ou name .

4.3. Requête nommée

Les requêtes nommées sont similaires aux requêtes avec l' annotation @Query, sauf que les requêtes sont déclarées dans un fichier de propriétés distinct:

@Query(name = "Product.findByNamedQuery") public Page findByNamedQuery(String searchTerm, Pageable pageable);

Notez que l' annotation @Query n'est pas requise si la clé ( findByNamedQuery ) de la requête dans le fichier de propriétés correspond au nom de la méthode.

Récupérons quelques documents en utilisant la méthode de requête nommée:

Page result = productRepository.findByNamedQuery("one", new PageRequest(0, 10));

5. Conclusion

Cet article est une introduction rapide et pratique à Spring Data Solr, couvrant la configuration de base, la définition des référentiels et naturellement - les requêtes.

Et comme toujours, les exemples utilisés ici sont disponibles sous forme d'exemple de projet sur Github.