PROJET AUTOBLOG


Planet-Libre

source: Planet-Libre

⇐ retour index

Littlewing : Premiers pas avec SOLR

lundi 28 octobre 2013 à 15:23

Après avoir pas mal touché à Apache Lucene il y a quelques années ce ça ( je vous par le d'un temps que les moins de vingt ans ne peuvent pas connaître...), j'ai décidé de me pencher sur les moteurs de recherche opensource. J'ai donc décidé de me pencher sur SOLR et ElasticSearch. Ces deux projets sont basés sur lucene.

Le cas d'utilisation que je souhaite mettre en œuvre est assez simple pour l'instant : indexer le résultat d'une requête faite dans un SGBD. Celle ci prend énormément de temps ( environ 30 secondes ) et je souhaite avoir un résultat immédiat le tout en REST.

Le cas elasticsearch

J'ai tout d'abord essayé elasticsearch. Ce dernier est le projet qui a le vent en poupe et présente de nombreux sous-projets très intéressants ( logstash, kibana). Le seul moyen d'extraire les données d'un SGBD est le jdbc-river. Ce moyen ne m'a pas trop séduit , il y a pas mal de problèmes liés à la saisie d'une requête complexe. Aussi j'en ai discuté brièvement avec David Pilato ( qui a fait une super présentation sur Kibana) lors du JugSummerCamp . Il m'a confirmé l'extension du scope du projet logstash aux autres sources de données (ex. JDBC). Cette mutation devrait être effective mi 2014. Bref, en attendant j'ai exploré SOLR.

Présentation de SOLR

SOLR est donc un moteur de recherche ( ça vous l'aviez deviné) qui s'appuie sur Apache Lucene ( ça aussi ...) . Il présente des fonctionnalités semblables à ElasticSearch. A ce que j'ai pu lire sur le net ici ou , ce dernier est supérieur sur la gestion des recherches distribuées. Je n'aurais pas besoin de cette fonctionnalité dans un premier temps. Les fonctionnalités qui m'intéressent sont les suivantes :

Configuration

Pour mon projet, je me suis basé sur un archetype maven disponible sur le net. Ce dernier crée un exemple de projet qui lance un jetty avec le war de solr

Vous devez également disposer de la distribution de SOLR pour que le livrable soit déployé. C'est la seule solution que j'ai trouvé pour l'instant. Ce n'est pas très élégant, car je préférerai avoir le tout embarqué dans la webapp.

Mon projet s'appelle customer-indexer . Il indexe les données d'une base de clients. Dans le répertoire src/main/resources, j'ai crée un répertoire customers. J'ai copié le contenu du répertoire collection1 présent dans les exemples de la distribution.

J'exposerai ici la configuration indispensable pour mon cas d'étude

le fichier solr.xml

  1. version="1.0" encoding="UTF-8" ?>
  2. persistent="true">
  3. adminPath="/admin/cores" defaultCoreName="refper" host="${host:}" hostPort="${jetty.port:}" hostContext="${hostContext:}" zkClientTimeout="${zkClientTimeout:15000}">
  4. name="customers" instanceDir="." />
  5. >
  6. >

Dans le répertoire src/main/resources/customers/conf, il faut ajouter a minima les fichiers solrconfig.xml schema.xml et data-config.xml.

solrconfig.xml

Les deux premiers sont déjà présents J'ai modifié le premier avec les informations suivantes :

j'ai mis le chemin en dur de la distribution et non le relatif

  1. dir="c:/java/solr-4.5.0/contrib/extraction/lib" regex=".*\\.jar" />
  2. dir="c:/java/solr-4.5.0/dist/" regex="solr-cell-\\d.*\\.jar" />
  3.  
  4. dir="c:/java/solr-4.5.0/contrib/clustering/lib/" regex=".*\\.jar" />
  5. dir="c:/java/solr-4.5.0/dist/" regex="solr-clustering-\\d.*\\.jar" />
  6. dir="c:/java/solr-4.5.0/dist/" regex="solr-dataimporthandler-\\d.*\\.jar" />
  7.  
  8. dir="c:/java/solr-4.5.0/contrib/langid/lib/" regex=".*\\.jar" />
  9. dir="c:/java/solr-4.5.0/dist/" regex="solr-langid-\\d.*\\.jar" />
  10.  
  11. dir="c:/java/solr-4.5.0/contrib/velocity/lib" regex=".*\\.jar" />
  12. dir="c:/java/solr-4.5.0/dist/" regex="solr-velocity-\\d.*\\.jar" />

La configuration de l'élément elevator semblait erronée

  1. name="elevator" class="solr.QueryElevationComponent" >
  2. name="queryFieldType">string>
  3. name="config-file">elevate.xml>
  4. >

J'ai rajouté également le module d'import des données

  1. name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
  2. name="defaults">
  3. name="config">data-config.xml>
  4. >
  5. >

schema.xml

Ce fichier décrit la structure des documents présents dans l'index du moteur de recherche. On définit les données à indexer, les types de données et les filtres à appliquer (exemple: tout passer en minuscule)

  1. name="customers" version="1.5">
  2. >
  3.  
  4. name="idpp" type="string" indexed="true" stored="true" required="true" multiValued="false"/>
  5.  
  6. name="_root_" type="string" indexed="true" stored="false"/>
  7.  
  8.  
  9. name="dtcrea" type="date" indexed="true" stored="true" omitNorms="true"/>
  10. name="dtlastupd" type="date" indexed="true" stored="true"/>
  11. name="title" type="lowercase" indexed="true" stored="true" omitNorms="true"/>
  12. name="lastname" type="lowercase" indexed="true" stored="true" multiValued="true"/>
  13. name="fstname" type="lowercase" indexed="true" stored="true" multiValued="true"/>
  14. name="dtbirth" type="date" indexed="true" stored="true" termVectors="true" termPositions="true"
  15. termOffsets="true"/>
  16. name="status" type="float" indexed="true" stored="true"/>
  17. name="content" type="text_general" indexed="false" stored="true" multiValued="true"/>
  18.  
  19. name="text" type="text_general" indexed="true" stored="false" multiValued="true"/>
  20.  
  21. name="text_rev" type="text_general_rev" indexed="true" stored="false" multiValued="true"/>
  22. name="_version_" type="long" indexed="true" stored="true"/>
  23.  
  24.  
  25. >
  26. >idpp>
  27.  
  28. source="title" dest="text"/>
  29. source="lastname" dest="text"/>
  30. source="firstname" dest="text"/>
  31. source="birthday" dest="text"/>
  32. >

data-config.xml

Dans ce fichier on spécifie les données récupérées de la base de données

  1. >
  2. driver="oracle.jdbc.OracleDriver" url="urljdbc" user="user" password="pwd"/>
  3. name="customer">
  4. name="customer" query="Marequete">
  5. column="id" name="id" />
  6. column="LASTNAME" name="lastname" />
  7. column="FIRSTNAME" name="firstname" />
  8. column="DTCREATION" name="dtcreation" />
  9. column="DTLASTUPDATE" name="dtlastupdate" />
  10. column="BIRTHDAY" name="birthday" />
  11. column="STATUS" name="status" />
  12. >
  13. >
  14. >

Configuration maven

voici le contenu du pom.xml

  1. version="1.0" encoding="UTF-8"?>
  2. xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. >4.0.0>
  6.  
  7. >customer-indexer>
  8. >customer-indexer>
  9. >1.0-SNAPSHOT>
  10. >war>
  11.  
  12. >
  13. >UTF-8>
  14. >1.7.5>
  15. >1.2.17>
  16. >4.5.0>
  17. >customers>
  18. >customers>
  19. >c:/java/solr-4.5.0/>
  20. >
  21.  
  22. >
  23. >
  24. >org.slf4j>
  25. >slf4j-api>
  26. >${slf4j-api.version}>
  27. >
  28. >
  29. >org.slf4j>
  30. >jcl-over-slf4j>
  31. >${slf4j-api.version}>
  32. >
  33. >
  34. >org.slf4j>
  35. >jul-to-slf4j>
  36. >${slf4j-api.version}>
  37. >
  38. >
  39. >org.slf4j>
  40. >slf4j-log4j12>
  41. >${slf4j-api.version}>
  42. >
  43. >
  44. >log4j>
  45. >log4j>
  46. >${log4j.version}>
  47. >
  48.  
  49. >
  50. >com.oracle.ojdbc>
  51. >ojdbc>
  52. >10.2.0.2.0>
  53.  
  54. >
  55. >
  56. >org.apache.solr>
  57. >solr>
  58. >${solr.version}>
  59. >war>
  60. >
  61. >
  62.  
  63. >
  64. >customers>
  65. >
  66. >
  67. >true>
  68. >src/main/resources>
  69. >
  70. >
  71. >
  72. >
  73. >maven-antrun-plugin>
  74. >1.7>
  75. >
  76. >
  77. >copy-to-solr>
  78. >
  79. >run>
  80. >
  81. >package>
  82. >
  83. >
  84. todir="${solr.solr.home}" includeemptydirs="true" overwrite="true">
  85. dir="${project.build.outputDirectory}">
  86. >
  87. >
  88. >
  89. >
  90. >
  91. >
  92. >
  93. >
  94. >org.eclipse.jetty>
  95. >jetty-maven-plugin>
  96. >9.0.4.v20130625>
  97. >
  98. >9966>
  99. >stop>
  100. >
  101. >/refper>
  102. >
  103. >
  104. >
  105. >
  106. >
  107. >

Démarrage

Dans mon cas il me suffit de lancer la commande

  1. mvn clean install jetty:run

Import des données

On peut le faire soit par un appel REST, soit par la console : Sélectionner la collection puis cliquer sur Data Import

backup_sonar034.png

Conclusion

Pour l'instant j'ai rapidement fait une première indexation de mes données. je suis conscient qu'il y a pas mal d'améliorations à apporter, notamment sur la modélisation de mon index avec les bonnes entités (ex. une entité customer, une entité address,...)

Je verrai le requêtage dans un autre post.

Gravatar de Littlewing
Original post of Littlewing.Votez pour ce billet sur Planet Libre.