Solr : importation via HTTP

Implémenter Solr dans une application web Java

Ce site ne sera plus alimenté de contenu après août 2014. Tous les nouveaux articles seront redigés pour www.waitingforcode.com
On a déjà vu qu'il est très simple d'importer une base de données au Solr. Cependant, on n'a pas encore vu s'il est possible d'effectuer la même opération, mais à travers le protocle HTTP. L'article ci-dessous aura comme sujet cette problématique.

A travers cet article on verra d'abord l'aspect théorique de la transmission des données au Solr via le protocole HTTP. Ensuite on passera à l'exemple précis qui, en même temps, sera la première occasion de présenter le projet d'un client pour le moteur de recherche Solr.

Importer les données au Solr via HTTP
Si l'on analyse bien notre fichier de configuration, on s'appercevra qu'il contient un gestionnaire de requête qui agit sur l'URL /update/json. Ce gestionnaire est la classe solr.JsonUpdateRequestHandler. On utilise ce gestionnaire par rapport à la légerté d'un fichier JSON. Grâce à sa légerté, il sera également traité plus rapidement par Solr. L'indexation des 10 000 documents prend à peu près 200 ms moins que pour un fichier XML. Cependant, juste au titre de comparaison, JSON n'est le format le plus performant. Il est dépassé par les fichiers CSV, quasiment 4 fois plus légers et insérés plus rapidement (200 ms de différence pour 100 000 documents).

Cependant, les formats mentionnés ne sont pas les seuls à être supportés par Solr. En fait, ce moteur de recherche peut facilement analyser les fichiers .pdf ou .doc, et ensuite les indéxer.

L'indexation via la requête HTTP se fait en POST. Les données peuvent être envoyées exactement de la même manière que les champs d'un formulaire. Il faut alors soit spécifier les données dans le paramètre stream.body, soit indiquer le chemin d'accès vers le fichier avec stream.file ou stream.url. On peut également envoyer ces informations en tant que données binaires, en spécifiant l'en-tête correspondant au fichier (application/json dans le cas de JSON).

Dans les exemples ci-dessous on verra ces 3 moyens d'indexation à travers une classe Java.

Exemple d'une classe d'import des données Solr
Solr possède une libraire Java, Solrj (connu également sous le nom SolrJava). C'est elle qu'on utilisera dans notre projet pour illustrer le branchement au web service Solr. Ce projet utilise également le même vocabulaire que le moteur de recherche. On y retrouve, entre autres, un document (SolrInputDocument), des champs (fields), ainsi que une requête (SolrRequest) et une réponse (SolrResponse). Imaginons que pour notre application on doit rajouter deux anciennes Allemagnes, RFN et DDR. Voici le code du Solrj qui permet de le faire :

try {
SolrInputDocument dataDDR = new SolrInputDocument();
dataDDR.addField("id", "255");
dataDDR.addField("countryName", "DDRAs");
dataDDR.addField("iso", "ddr");
dataDDR.addField("isoNumeric", "9909");
dataDDR.addField("capital", "Berlin");
dataDDR.addField("area", "109");
dataDDR.addField("population", "784784");
dataDDR.addField("continent", "EU");
dataDDR.addField("currency", "Deutche Mark");
dataDDR.addField("currencyCode", "DM");
dataDDR.addField("postalCodeFormat", "NNNNNN");
dataDDR.addField("postalCodeRegex", "(.*)");

SolrInputDocument dataRFN = new SolrInputDocument();
dataRFN.addField("id", "256");
dataRFN.addField("countryName", "RFN");
dataRFN.addField("iso", "RF");
dataRFN.addField("isoNumeric", "9910");
dataRFN.addField("capital", "Berlin");
dataRFN.addField("area", "93899");
dataRFN.addField("population", "999");
dataRFN.addField("continent", "EU");
dataRFN.addField("currency", "Deutche Mark");
dataRFN.addField("currencyCode", "DM");
dataRFN.addField("postalCodeFormat", "NNNN");
dataRFN.addField("postalCodeRegex", "(.*)");

String target = "http://localhost:8080/world/update/json";
SolrServer solrServer = new HttpSolrServer(target);
UpdateRequest solrRequest = new UpdateRequest(target);
solrRequest.add(dataDDR);
solrRequest.add(dataRFN);
solrRequest.setAction(AbstractUpdateRequest.ACTION.COMMIT, false, false );
solrRequest.setParam("stream.contentType", "application/json");
solrRequest.setMethod(SolrRequest.METHOD.POST);
System.out.println("Sending Solr request : " + solrRequest.toString());
System.out.println("Sending Solr request's params : " + solrRequest.getParams());
UpdateResponse solrResponse = solrRequest.process(solrServer);
System.out.println("Received Solr response : "+solrResponse.toString());
} catch (Exception e) {
System.out.println("An exception occured " + e.getMessage());
e.printStackTrace(System.out);
}



Suite à l'exécution de ce code, il faut attendre quelques secondes (voire parfois quelques minutes) avant que les modifications soient visibles.

A travers cet article on a rapidement vu comment interagir avec Solr à travers le protocole HTTP. On a vu que l'importation était possible sous différents formats qui ont tous un temps de traitement différent. Cependant, ces formats n'ont pas d'influence sur le code d'ajout qui construit plutôt des documents que des formats de données.
Bartosz KONIECZNY 08-09-2013 17:21 Solr
Moi

Développeur d'applications Internet et journaliste passionné par l'adjectif français. Un aigle polonais orienté vers la progression, volant très haut et écoutant du zouk après les matches du foot français.

Vous appréciez mon travail ?

Pour contribuer au développement de ce site, ou pour remercier pour des articles rédigés, vous pouvez faire un don.

Un conseil PHP

Fonctions dynamiques.

PHP permet de construire des fonctions à partir des variables. On peut très simplement construire une méthode dynamique qui génère une image en fonction du type de fichier transféré :

// filename has only alphanumerical caracters
$names = explode('.', $_FILES['image1']['name']);
$fname = "imagecreatefrom".$names[1];
$fname('fileOne');