Guide de Solr en Java avec Apache SolrJ

Guide de Solr en Java avec Apache SolrJ

1. Vue d'ensemble

Apache Solr est une plateforme de recherche open-source construite sur Lucene. Apache SolrJ est un client Java pour Solr qui fournit des interfaces pour les principales fonctionnalités de recherche telles que l'indexation, l'interrogation et la suppression de documents.

Dans cet article, nous allons explorerhow to interact with an Apache Solr server using SolrJ.

2. Installer

Pour installer un serveur Solr sur votre machine, veuillez vous référer auxSolr QuickStart Guide.

Le processus d'installation est simple: il suffit de télécharger le package zip / tar, d'extraire le contenu et de démarrer le serveur à partir de la ligne de commande. Pour cet article, nous allons créer un serveur Solr avec un noyau appelé «bigboxstore»:

bin/solr start
bin/solr create -c 'bigboxstore'

Par défaut, Solr écoute le port 8983 pour les requêtes HTTP entrantes. Vous pouvez vérifier qu'il a été lancé avec succès en ouvrant l'URL dehttp://localhost:8983/solr/#/bigboxstore dans un navigateur et en observant le tableau de bord Solr.

3. Configuration Maven

Maintenant que notre serveur Solr est opérationnel, passons directement au client Java SolrJ. Pour utiliser SolrJ dans votre projet, vous aurez besoin de déclarer la dépendance Maven suivante dans votre fichierpom.xml:


    org.apache.solr
    solr-solrj
    6.4.0

Vous pouvez toujours trouver la dernière version hébergée parMaven Central.

4. API Java Apache SolrJ

Lançons le client SolrJ en nous connectant à notre serveur Solr:

String urlString = "http://localhost:8983/solr/bigboxstore";
HttpSolrClient solr = new HttpSolrClient.Builder(urlString).build();
solr.setParser(new XMLResponseParser());

Remarque:SolrJ uses a binary format, rather than XML, comme format de réponse par défaut. Pour la compatibilité avec Solr, il est nécessaire d'appeler explicitementsetParser() en XML comme indiqué ci-dessus. Plus de détails à ce sujet peuvent être trouvéshere.

4.1. Indexation de documents

Définissons les données à indexer en utilisant unSolrInputDocument et ajoutons-les à notre index en utilisant la méthodeadd():

SolrInputDocument document = new SolrInputDocument();
document.addField("id", "123456");
document.addField("name", "Kenmore Dishwasher");
document.addField("price", "599.99");
solr.add(document);
solr.commit();

Remarque: toute action qui modifie la base de données Solr nécessite que l'action soit suivie decommit().

4.2. Indexation avec des haricots

You can also index Solr documents using beans. Définissons un ProductBean dont les propriétés sont annotées avec @Field:

public class ProductBean {

    String id;
    String name;
    String price;

    @Field("id")
    protected void setId(String id) {
        this.id = id;
    }

    @Field("name")
    protected void setName(String name) {
        this.name = name;
    }

    @Field("price")
    protected void setPrice(String price) {
        this.price = price;
    }

    // getters and constructor omitted for space
}

Ensuite, ajoutons le bean à notre index:

solrClient.addBean( new ProductBean("888", "Apple iPhone 6s", "299.99") );
solrClient.commit();

4.3. Interroger les documents indexés par champ et par identifiant

Vérifions que notre document est ajouté en utilisantSolrQuery pour interroger notre serveur Solr.

LesQueryResponse du serveur contiendront une liste d'objetsSolrDocument correspondant à n'importe quelle requête au formatfield:value. Dans cet exemple, nous interrogeons par prix:

SolrQuery query = new SolrQuery();
query.set("q", "price:599.99");
QueryResponse response = solr.query(query);

SolrDocumentList docList = response.getResults();
assertEquals(docList.getNumFound(), 1);

for (SolrDocument doc : docList) {
     assertEquals((String) doc.getFieldValue("id"), "123456");
     assertEquals((Double) doc.getFieldValue("price"), (Double) 599.99);
}

Une option plus simple consiste à interroger parId en utilisantgetById(). qui ne renverra qu'un document si une correspondance est trouvée:

SolrDocument doc = solr.getById("123456");
assertEquals((String) doc.getFieldValue("name"), "Kenmore Dishwasher");
assertEquals((Double) doc.getFieldValue("price"), (Double) 599.99);

4.4. Suppression de documents

Lorsque nous voulons supprimer un document de l'index, nous pouvons utiliserdeleteById() et vérifier qu'il a été supprimé:

solr.deleteById("123456");
solr.commit();
SolrQuery query = new SolrQuery();
query.set("q", "id:123456");
QueryResponse response = solr.query(query);
SolrDocumentList docList = response.getResults();
assertEquals(docList.getNumFound(), 0);

Nous avons également la possibilité dedeleteByQuery(), alors essayons de supprimer tout document avec un nom spécifique:

solr.deleteByQuery("name:Kenmore Dishwasher");
solr.commit();
SolrQuery query = new SolrQuery();
query.set("q", "id:123456");
QueryResponse response = solr.query(query);
SolrDocumentList docList = response.getResults();
assertEquals(docList.getNumFound(), 0);

5. Conclusion

Dans cet article rapide, nous avons vu comment utiliser l'API Java de SolrJ pour effectuer certaines des interactions courantes avec le moteur de recherche de texte intégral Apache Solr.

Vous pouvez consulter les exemples fournis dans cet articleover on GitHub.