Introduction à Spring Data Solr

Introduction à Spring Data Solr

1. Vue d'ensemble

Dans cet article,we’ll explore the basics of Spring Data Solr d'une manière pratique.

Apache Solr est un logiciel Open Source prêt à déployer le moteur de recherche en texte intégral de l'entreprise. Vous pouvez en savoir plus sur les fonctionnalités de Solr sur lesofficial website.

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

Premièrement, nous devons démarrer un serveur Solr et créer un noyau pour stocker les données (que Solr créera par défaut 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 allons certainement profiter.

2.1. Dépendance Maven

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


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

Vous pouvez trouver les dernières dépendanceshere.

2.2. Définition du document

Définissons un document appeléProduct:

@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 classeProduct est un document Solr et indexée sur le noyau nomméproduct. Les champs annotés avec@Indexed sont indexés dans Solr et pourront être recherchés.

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

Ensuite, nous devons créer une interface de référentiel en développant un référentiel fourni par Spring Data Solr. Nous allons naturellement paramétrer ceci avecProduct etString 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 parSolrCrudRepository. Nous en parlerons dans les prochaines sections.

Notez également que la propriétéProduct.findByNamedQuery est définie dans Solr nommé fichier de requêtesolr-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.example.spring.data.solr.repository",
  namedQueriesLocation = "classpath:solr-named-queries.properties",
  multicoreSupport = true)
@ComponentScan
public class SolrConfig {

    @Bean
    public SolrClient solrClient() {
        return new HttpSolrClient("http://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 la requête nommée 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 de Solr concerne 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 en utilisant simplement la méthode de sauvegardeSolrCrudRepository’s:

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 simplement en appelant la méthode delete:

productRepository.delete(retrievedProduct);

4. Requête

Explorons maintenant différentes techniques de requête 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 afin de générer la requête à exécuter:

public List findByName(String name);

Dans notre interface de référentiel, nous avons la méthodefindByName 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 lesfindByCustomQuery(“Phone”, new PageRequest(0, 10)), nous obtenons la première page des documents produit qui contiennent le mot «Téléphone» dans l'un de ses champsid ouname.

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 à l'aide de 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, qui couvre la configuration de base, définit les référentiels et interroge naturellement.

Et comme toujours, les exemples utilisés ici sont disponibles ensample project on Github.