[solr 4.7 avancé]: Indexation



Comme vu dans l’ article précédant [solr 4.7 ]: installation configuration et manipulation, on a pu voir comment installer Solr 4.7 avec Apache 7 sous ubuntu. On a aussi pu faire quelques exemples de rêquete basique. On a aussi géré l’application de Solr à partir de son back office.
Dans ce nouvel article, toujours pratique autant que theorique, on va implémenter la base de solr : Indexation. On va manipuler de plus près les fichiers de configuration.


Avant de passer à l’indexation, on va présenter les fichiers de configuration qui sont :
schema.xml, solrconfig.xml et data-config.xml.

Schema.xml :

Le fichier schema.xml représente les format des champs à indexer.
Sois l’exemple complet suivant:

<?xml version="1.0" encoding="UTF-8" ?>
<schema name="example" version="1.1">
<types>
<fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
</types>
<fields>
<field name="id" type="sint" indexed="true" stored="true" required="true" />
<field name="plats" type="string" indexed="true" stored="true" multiValued="true" omitNorms="true"/>
<field name="nomRestaurant" type="string" indexed="true" stored="true"/>
<field name="ville" type="string" indexed="true" stored="false"/>
</fields>
<uniqueKey>id</uniqueKey>
<defaultSearchField>text</defaultSearchField>
<solrQueryParser defaultOperator="AND"/>
<copyField source="id" dest="text"/>
<copyField source="category" dest="text"/>
<copyField source="size" dest="text"/>
</schema>

Le fichier schema.xml contient:
  • <types> : des types de champs des documents à utiliser:
fieldType contient des types de donnée par défaut (int, string, date, float …) , d’autres définis par Solr (text, text_ws...), et on peut aussi définir ses propres types.

  • Analyzer : <analyzer> element fils de <fieldType>, un analyseur examine le texte des champs, ayant comme attribut “class” qui est une classe java et “type” qui peut être index ou query pour faire l’anlyse respectivement au moment de l’indxation du document ou au moment de l’invoquation par une requête:

<fieldType name="text_greek" class="solr.TextField">
<analyzer class="org.apache.lucene.analysis.el.GreekAnalyzer" type=”index”/>
</fieldType>
Pour cet exemple l’analyzer examine tous les fields de type text_greek au moment de l’indexation et génére le résultat correspondant.
Pour plus de détails sur les Analyzer : cwiki.apache.org - analyzer

  • Tokenizers : <tokenizer>
Tokenizers: divise un flux de caractères (à partir de chaque valeur de champ) dans une série de “tokens”. On peut avoir qu'un seul Tokenizer dans chaque analyseur.
Pour plus de détails sur les Tokenizers : cwiki.apache.org - tokenizer
  • Token Filters : <filter>
Les Token produits par le Tokenizer sont passés à travers une série de filtres qui ajoutent, modifient ou suppriment les Tokens. Le champ sera ensuite indexé par le flux de tokens résultant.

<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
Exemple de utilisant le tokenizer StandardTokenizerFactory, et des filtres pour transformer en minuscule et filtrer par un dictionnaire de mots.

Pour plus d’info consulter : cwiki.apache.org - SolrFieldTypes

  • <fields> : décrit les champs des documents à indexer:
  • indexed si =”true”, on peut effectuer des recherches sur ce champs.
  • stored si =”true”, ce champs peut être retourner dans la réponse d’une requête.
  • required si=”true”, pour indexer le document, ce champs doit $etre indexé. si =”false”, ce champs est optionnel.
  • multiValued, permet à un champs d’avoir plusieurs valeurs:
doc { id : 1, category: [ hello, world ]}
  • <uniqueKey>: clé unique par document,
  • <defaultSearchField> champs de recherche par défaut ,
  • <solrQueryParser/> opérateur boolean par defaut .
  • <copyField> : Décrit comment construire des fields à partir d’autres fields.


Indexation :

  • Indexation par requête update:
Il faut respecter le schema défini dans schema.xml.

curl http://localhost:8080/solr/update?commit=true -H "Content-Type: text/xml" --data-binary
'<add>
<doc boost="2.5">
<field name="id">05991</field>
<field name="category" boost="2.0">Bridgewater</field>
<field name="size">4</field>
<field name="text">Description of Bridgewater</field>
</doc>
</add>'


Requête d’update peut être déclenché à chaque mise à jour d'un élément de la base donnée principale.

  • Indexation par Data Import Handler :

De nombreuses applications de recherche stockent le contenu à indexer dans un magasin de données structurées, comme les bases de données relationnelles. Le Data Import Handler (DIH) fournit un mécanisme pour importer du contenu à partir d'une banque de données et l'indexer. En plus l'indexation des bases de données relationnelles, DIH peut indexer le contenu à partir de sources de données passées par HTTP tels que RSS et ATOM, référentiels e-mail, et XML structuré où le processeur XPath est utilisé pour générer des champs. [http://docs.lucidworks.com]

Solrconfig.xml :

Les librairies de DataImportHandler (jars) ne sont plus fournis dans le Solr WAR. Donc on doit les ajouter au répertoire lib de Solr, ou les référencer dans la directive <lib> du fichier de configuration solrconfig.xml du projet :

- Créer le dossier lib/ sous /var/lib/tomcat/solr.
- Ajouter les DIH jars à lib/ :
cp ~/solr-4.7.2/dist/solr-dataimporthandler-*.jar /var/lib/tomcat7/solr/lib
- Ajouter aussi les pilotes de la base de donnée utilisée (pour mysql → mysql-connector-java-bin.jar).
- Ajouter le requestHandler à solr/conf/solrconfig.xml

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>

Data-config.xml :




<dataConfig>
<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1/restoweb" user="root" password="root" />
<document name="Restoweb">
<entity name="Restaurant" query="SELECT id, nomRestaurant, code_postal, type_cuisine FROM Restaurant">
<field column="id" name="id" />
<field column="nomRestaurant" name="nomRestaurant" />
<entity name="Ville" query="SELECT designation FROM Ville where id=${Restaurant.ville_restaurant_id}" >
<field column="designation" name="ville" />
</entity>
 
<entity name="Plat" query="SELECT designation FROM restaurants_plats inner join Plat on Plat.id = restaurants_plats.plat_id where restaurants_plats.restaurant_id=${Restaurant.id}" >
<field column="designation" name="plats" />
</entity>

</entity>
</document>
</dataConfig>


Requêtes d’indexation:
A la fin, on va executer la requete permettant l’indexation, a partir du backoffice Solr
http://localhost:8080/[nom_projet]/dataimport?command=full-import

Pour mieux débuguer les données entrées pour la recherche, on peut utiliser l’outil AnalysisTool du backoffice Solr:




Commentaires

Posts les plus consultés de ce blog

Connecting to MS Exchange Server with Thunderbird

SVN and GIT Tag with Jenkins Job

[Solr 4.7 avancé]: Intégration avec Symfony 2