L'extraction de métadonnées permet, dans un document, d'en remonter les informations importante, par exemple dans un document historique les dates sont importantes, dans des fiches de produits le nom des produits mais aussi leur catégorie sont importants pour en faire un catalogue par exemple.
Avec Fast certaines extractions de propriété sont built in comme les compagnies, les personnes ou la localisation du document. Par exemple suite a une recherche on peut voir la liste des compagnies présentent dans les documents :
Bien entendu on peut créer notre propre extraction de métadonnées.
L'extraction de métadonnées se configure en 4 parties :
- Création et déploiement du dictionnaire d'extraction, probablement l'étape la plus importante
- Configuration de Fast Search pour prendre en compte le dictionnaire
- Création de la managed metadata
- Configuration du refinement.
Création et déploiement du dictionnaire d'extraction
Le dictionnaire est un fichier XML, vous avez droit a trois dictionnaire whole words (mot entier) et deux part word (partie de mots). Les dictionnaires sont dans c:\FastSearch\Components\resourcestore\dictionaries\matching.
Les dictionnaires en questions sont :
Wholewords_extraction{1,2,3} et
Wordparts_extraction{1,2}
Le dictionnaire que nous allons créer permet de faire un refinement en fonction de la partie du corps dont parle le document. On va donc créé un dictionnaire qui fait le matching avec :
Regroupement | Partie du corps |
Tete | cou
tete
nuque
oreille
nez
bouche
dent
langue
cerveau |
Buste | ventre
poitrine
dos
poumon
cœur
estomac
intestin
foie
buste |
Bras | coude
mains
bras |
Bassin | bassin
rein
uretre
penis
hanche
vagin
fesse
anus |
Jambe | jambe
genou
pied
cheville
cuisse |
Pour faire le dictionnaire le xml doit etre de la forme :
<dictionary>
<entry
key="valeur a chercher"
value="valeur de correspondance"/>
</dictionary>
Par exemple :
<entry key="William H. Gates" value="Bill Gates"/>
Signifie qu'à chaque fois que le moteur de recherche trouvera William H. Gates il fera le regroupement avec Bill Gates ainsi les recherches sur Bill Gates retourneront Bill Gates ET William H. Gates.
Dans notre cas il faut indiquer au moteur de recherche qu'a chaque fois qu'une recherche sur tête, par exemple, est effectuée il faut retourner tous les documents qui contiennent cou, tête, nuque, oreille, nez, bouche, dent, langue, cerveau.
On aura donc :
<dictionary>
<entry
key="cou"
value="Tete"/>
<entry
key="tete"
value="Tete"/>
<entry
key="nuque"
value="Tete"/>
<entry
key="crane"
value="Tete"/>
<entry
key="oreille"
value="Tete"/>
<entry
key="nez"
value="Tete"/>
<entry
key="bouche"
value="Tete"/>
<entry
key="dent"
value="Tete"/>
<entry
key="langue"
value="Tete"/>
<entry
key="cerveau"
value="Tete"/>
</dictionary>
Voilà le dictionnaire final bodyParts.xml:
<?xml
version="1.0"
encoding="UTF-8"?>
<dictionary>
<!-- the following entry will recognize the name "William H. Gates" and normalize it to "Bill Gates"
<entry key="William H. Gates" value="Bill Gates"/>
-->
<entry
key="cou"
value="Tete"/>
<entry
key="tete"
value="Tete"/>
<entry
key="nuque"
value="Tete"/>
<entry
key="crane"
value="Tete"/>
<entry
key="oreille"
value="Tete"/>
<entry
key="nez"
value="Tete"/>
<entry
key="bouche"
value="Tete"/>
<entry
key="dent"
value="Tete"/>
<entry
key="langue"
value="Tete"/>
<entry
key="cerveau"
value="Tete"/>
<entry
key="ventre"
value="Buste"/>
<entry
key="poitrine"
value="Buste"/>
<entry
key="dos"
value="Buste"/>
<entry
key="poumon"
value="Buste"/>
<entry
key="coeur"
value="Buste"/>
<entry
key="estomac"
value="Buste"/>
<entry
key="intestin"
value="Buste"/>
<entry
key="foie"
value="Buste"/>
<entry
key="buste"
value="Buste"/>
<entry
key="coude"
value="Bras"/>
<entry
key="mains"
value="Bras"/>
<entry
key="bras"
value="Bras"/>
<entry
key="bassin"
value="Bassin"/>
<entry
key="rein"
value="Bassin"/>
<entry
key="uretre"
value="Bassin"/>
<entry
key="penis"
value="Bassin"/>
<entry
key="hanche"
value="Bassin"/>
<entry
key="vagin"
value="Bassin"/>
<entry
key="fesse"
value="Bassin"/>
<entry
key="anus"
value="Bassin"/>
<entry
key="jambe"
value="Jambe"/>
<entry
key="genou"
value="Jambe"/>
<entry
key="pied"
value="Jambe"/>
<entry
key="cheville"
value="Jambe"/>
<entry
key="cuisse"
value="Jambe"/>
</dictionary>
Maintenant on n'a plus qu'à l'uploader dans les resources de fast. Pour cela on lance le PowerShell de Fast et on met la commande :
Add-FastSearchResource –FilePath C:\Users\Administrator.XVDOM\Desktop\bodyparts.xml –Path dictionaries/matching/wholewords_extraction1.xml
Une fois que cela est fait le fichier Wholewords_extraction1.xml contient le contenu de bodyparts.xml
Configuration de Fast Search
Maintenant que le dictionnaire est fait, il faut activer le wholewordsextractor1 (qui utilise le dictionnaire XML Wholewords_extraction1.xml).
Pour cela on va dans C:\FastSearch\etc\config_data\DocumentProcessor\. Dans ce répertoire on ouvre optionalprocessing.xml.
Dans le bas du fichier on a les processors :
<processor
name="wholewordsextractor1"
active="no" />
<processor
name="wholewordsextractor2"
active="no" />
<processor
name="wholewordsextractor3"
active="no" />
<processor
name="wordpartextractor1"
active="no" />
<processor
name="wordpartextractor2"
active="no" />
Par défaut ils sont tous a no, bien entendu comme nous on a besoin que le wholewordsextractor1 fonctionne on va le passer a yes:
<processor
name="wholewordsextractor1"
active="yes" />
Pour que le fichier de configuration soit pris en compte par Fast on va redemarrer le procserver_1:
On ouvre une commande Dos (attention pas une commande powershell mais bien une Dos)
Nctrl status pour avoir l'état des services fast :
Nctrl restart procserver_1 pour redémarrer le document processor 1. Ensuite on utilise nctrl status pour voir quand il a fini de démarrer.
Maintenant on peut refaire un full crawl du connector et du query (autrement seul les nouveaux documents prendront en compte la metadata extraction)
Création de la managed metadata
Maintenant qu'on a l'extraction de configurer il faut la mapper a une manage metadata.
Premièrement on va dans Manage Service Application/ Fast Search Query/ Fast Search Administration.
Et là on sélectionne Managed Properties :
On clique sur Add Managed Properties :
Notre propriétés s'appellera BodyParts. Ensuite on clique sur add mapping car on va la mapper a wholewordsextractor1 qui est dans la catégorie MESG Linguistics.
On clique sur Add.
On met en place le stemming pour que les mots s'y rapprochant soit pris en compte (exemple cœur et coeur)
Ensuite on met que la propriété peut être query et refinement :
Maintenant on peut faire une query avec BodyParts.
Ici on a tous les documents qui parle de cou, tête, nuque, oreille, nez, bouche, dent, langue, cerveau
Configuration du refinement
Comme pour la langue on va ajouter un refinement pour bodyparts.
Dans le fichier XML du refinement (voir pour la langue) on ajoute la ligne :
<Category
Title="Body Parts"
Description="Use this filter to restrict results by company"
Type="Microsoft.Office.Server.Search.WebControls.ManagedPropertyFilterGenerator"
MetadataThreshold="1"
NumberOfFiltersToDisplay="4"
MaxNumberOfFilters="20"
ShowMoreLink="True"
MappedProperty="bodyparts"
MoreLinkText="show more"
LessLinkText="show fewer"
ShowCounts="Count" />
Attention il faut, peut-être, aussi augmenter le nombre de catégorie.
Résultat
Si une personne fait une recherche sur anatomie par exemple :
On a une catégorie dans le refinement en plus :
Si je clique sur tete :
Ici on voit dans les quelques lignes retournées dans la description quelque mot clés. Bien entendu comme tout le document n'est pas affiché les autres documents les mots clé sont dans le contenu mais pas dans la description.