[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.
- 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.
- 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.
- <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
Enregistrer un commentaire