Articles

Go Search
  

Other Blogs
There are no items in this list.
XVanneste > Articles > Categories
[Fast Search 2010] Ensemble d'articles sur Fast Search for sharepoint (développement et prise en main)

août

20

[Fast Search 2010] Personnaliser le PipeLine de Fast Search

par  Xavier VANNESTE   le 20/08/2010 11:50

 

juillet

16

[Fast Search 2010] Personnaliser la refinement webpart de Fast Search

par  Xavier VANNESTE   le 16/07/2010 11:48

 

juillet

13

[Fast Search 2010] Comprendre l’architecture de FAST

par  Xavier VANNESTE   le 13/07/2010 09:03

 

juillet

10

[Fast Search 2010] Entity or Metadata Extractor [Fast Search for SharePoint 2010]

par  Xavier VANNESTE   le 10/07/2010 14:57

 

juillet

09

[Fast Search 2010] Ajout du langage du document au Refinement Panel de Fast Search

par  Xavier VANNESTE   le 09/07/2010 11:56

 

juillet

07

[Fast Search 2010] Failed to communicate with the WCF service: Command powershell de fast

par  Xavier VANNESTE   le 07/07/2010 16:12

 

juillet

07

[Fast Search 2010] FAST Search pour SharePoint et PDF

par  Xavier VANNESTE   le 07/07/2010 13:15

 

juillet

07

[Fast Search 2010] Activer les Advanced Filter Pack sous Fast Search For Sharepoint

par  Xavier VANNESTE   le 07/07/2010 12:39

 

juin

12

[Fast Search 2010] Fast : Deux crawl valent mieux qu’un

par  Xavier VANNESTE   le 12/06/2010 09:17

Retrouvez moi le 15 Septembre au mic de mons
J'animerais une session technique le 15 septembre au Microsoft Innovation Center de Mons avec, didier danse, serge luca, ludovic lefort et stephane eykens.
Ma session:
Xavier Vanneste - SharePoint Specialist - List Querying - Linq - CAML - XLST- Architecture RestFul
L'une des principales choses qu'un développeur fait quand il travaille avec SharePoint est de récupérer les informations stockées dans les listes de SharePoint. SharePoint 2010 apporte son lot de nouveautés pour facilité cette tâche. Dans cette session nous aborderons le Linq To Sharepoint, le CAML et l'architecture restful de sharepoint ainsi que le XSLT pour l'affichage des vues.
 
Personnaliser la refinement webpart de Fast Search

Introduction

Le refinement dans le Search center permet de pouvoir facilement filtrer sur l'ensemble des enregistrements afin de rendre la recherche plus pertinente. Cette WebPart se trouve par défaut sur la gauche et affiche les filtres de manière textuelle.

Il y a possibilité de personnaliser le refinement, notamment, l'ordre des catégories ou les catégories à afficher (voir http://blog.xvanneste.com/Lists/Billets/Post.aspx?ID=27 )

Ici j'ai ajouté en haut les Body Parts qui sont des métadonnées extrait de mes documents (voir http://blog.xvanneste.com/Lists/Billets/Post.aspx?ID=28 )

Mais on peut aller beaucoup plus loin dans le refinement et on peut le customiser entièrement en développant notre propre WebPart de refinement.

RefinementManager

La premiére chose à étudier est le RefinementManager. Celui-ci permet de récupérer le XML de refinement et donc les différentes catégories qui seront utilisé par le Refinement Panel.

On utilisera donc la méthode GetRefinementXml pour récupérer le XML du refinement panel.

Voici ce qu'on peut s'attendre à récupérer (seul la partie ResultType est mise pour des raisons de quantité):

<?xml version="1.0" encoding="utf-8"?>

<FilterPanel>

<FilterCategory Id="Microsoft_Office_Server_Search_WebControls_ManagedPropertyFilterGenerator__-357320691" ConfigId="Microsoft_Office_Server_Search_WebControls_ManagedPropertyFilterGenerator__-357320691" Type="Microsoft.Office.Server.Search.WebControls.ManagedPropertyFilterGenerator" DisplayName="Result Type" ManagedProperty="format" ShowMoreLink="True" FreeFormFilterHint="" MoreLinkText="show more" LessLinkText="show fewer" ShowCounts="Count">

<Filters>

<Filter>

<Value>Any Result Type</Value>

<Tooltip>Any Result Type</Tooltip>

<Url>/Search/Pages/results.aspx?k=anatomie&amp;r=</Url>

<Selection>Implied</Selection>

<Count></Count>

<Percentage></Percentage>

</Filter>

<Filter>

<Value>Rich Text</Value>

<Tooltip>Rich Text</Tooltip>

<Url>/Search/Pages/results.aspx?k=anatomie&amp;r=format%3D%22AQlSaWNoIFRleHQGZm9ybWF0AQJeIgIiJA%3D%3D%22</Url>

<Selection>Deselected</Selection>

<Count>20</Count>

<Percentage>0.3174603</Percentage>

</Filter>

<Filter>

<Value>Adobe PDF</Value>

<Tooltip>Adobe PDF</Tooltip>

<Url>/Search/Pages/results.aspx?k=anatomie&amp;r=format%3D%22AQlBZG9iZSBQREYGZm9ybWF0AQJeIgIiJA%3D%3D%22</Url>

<Selection>Deselected</Selection>

<Count>17</Count>

<Percentage>0.2698413</Percentage>

</Filter>

<Filter>

<Value>Microsoft Word</Value>

<Tooltip>Microsoft Word</Tooltip>

<Url>/Search/Pages/results.aspx?k=anatomie&amp;r=format%3D%22AQ5NaWNyb3NvZnQgV29yZAZmb3JtYXQBAl4iAiIk%22</Url>

<Selection>Deselected</Selection>

<Count>15</Count>

<Percentage>0.2380952</Percentage>

</Filter>

<Filter>

<Value>Microsoft PowerPo…</Value>

<Tooltip>Microsoft PowerPoint</Tooltip>

<Url>/Search/Pages/results.aspx?k=anatomie&amp;r=format%3D%22ARQBTWljcm9zb2Z0IFBvd2VyUG9pbnQGZm9ybWF0AQJeIgIiJA%3D%3D%22</Url>

<Selection>Deselected</Selection>

<Count>9</Count>

<Percentage>0.1428571</Percentage>

</Filter>

</Filters>

<MoreFilters>

<Filter>

<Value>Any Result Type</Value>

<Tooltip>Any Result Type</Tooltip>

<Url>/Search/Pages/results.aspx?k=anatomie&amp;r=</Url>

<Selection>Implied</Selection>

<Count></Count>

<Percentage></Percentage>

</Filter>

<Filter>

<Value>Rich Text</Value>

<Tooltip>Rich Text</Tooltip>

<Url>/Search/Pages/results.aspx?k=anatomie&amp;r=format%3D%22AQlSaWNoIFRleHQGZm9ybWF0AQJeIgIiJA%3D%3D%22</Url>

<Selection>Deselected</Selection>

<Count>20</Count>

<Percentage>0.3174603</Percentage>

</Filter>

<Filter>

<Value>Adobe PDF</Value>

<Tooltip>Adobe PDF</Tooltip>

<Url>/Search/Pages/results.aspx?k=anatomie&amp;r=format%3D%22AQlBZG9iZSBQREYGZm9ybWF0AQJeIgIiJA%3D%3D%22</Url>

<Selection>Deselected</Selection>

<Count>17</Count>

<Percentage>0.2698413</Percentage>

</Filter>

<Filter>

<Value>Microsoft Word</Value>

<Tooltip>Microsoft Word</Tooltip>

<Url>/Search/Pages/results.aspx?k=anatomie&amp;r=format%3D%22AQ5NaWNyb3NvZnQgV29yZAZmb3JtYXQBAl4iAiIk%22</Url>

<Selection>Deselected</Selection>

<Count>15</Count>

<Percentage>0.2380952</Percentage>

</Filter>

<Filter>

<Value>Microsoft PowerPo…</Value>

<Tooltip>Microsoft PowerPoint</Tooltip>

<Url>/Search/Pages/results.aspx?k=anatomie&amp;r=format%3D%22ARQBTWljcm9zb2Z0IFBvd2VyUG9pbnQGZm9ybWF0AQJeIgIiJA%3D%3D%22</Url>

<Selection>Deselected</Selection>

<Count>9</Count>

<Percentage>0.1428571</Percentage>

</Filter>

<Filter>

<Value>Web Page</Value>

<Tooltip>Web Page</Tooltip>

<Url>/Search/Pages/results.aspx?k=anatomie&amp;r=format%3D%22AQhXZWIgUGFnZQZmb3JtYXQBAl4iAiIk%22</Url>

<Selection>Deselected</Selection>

<Count>2</Count>

<Percentage>0.03174603</Percentage>

</Filter>

</MoreFilters>

</FilterCategory>

</FilterPanel>

Comme on peut le voir on a deux grosses parties, la première est Filters qui contient la collection de filtre. Cette collection de filtre est composée du nom, du Tooltip, de l'url de refinement, du nombre de document et du pourcentage par rapport au total.

La deuxième partie est le MoreFilters qui reprend le filtre mais correspond à l'ensemble des données. (Attention dans MoreFilters on a une redondance par rapport à Filters).

Commençons notre WebPart. La première chose à faire est d'hériter de RefinementWebPart afin de récuperer l'ensemble des caractéristiques de cette webpart.

[ToolboxItemAttribute(false)]

public class RefineWP : RefinementWebPart

{}

A partir de là, on peut personnaliser le comportement du web part.

Dans le CreateChildControl on va utiliser le GetRefinementXml pour récuperer le XML. Pour cela on utilisera la variable _RefinementManager qui est héritée de RefinementWebPart.

protected override void CreateChildControls()
{
XDocument xdoc = GetXDocFromXmlDoc(this._RefinementManager.GetRefinementXml());
var q = from c in xdoc.Descendants("FilterCategory") select new RefinementXmlPart((string)c.Attribute("DisplayName").Value, (string)c.Attribute("Id").Value, (XElement)c);
FillControlLst(q);
foreach (Control ctrl in lstControl)
{
this.Controls.Add(ctrl);
}
base.CreateChildControls();
}

Ici il manque quelque test, en effet _RefinementManager peut être nulle si le xml des filter categories est mal formaté, GetRefinementXml peut aussi retourner nulle. Mais ce code est pour la démo.

 

GetXPathNavigator

Si on prend notre code tel quel, il y aura un problème de redondance, en effet la webpart RefinementWebPart dont on hérite va créer son refinement textuel, nous on veut ajouter un refinement graphique pour le Format et pour BodyPart. On aura donc deux fois format et bodypart dans le panel refinement. On va surcharger GetXPathNavigator qui permet de modifier le XML utiliser.

protected override XPathNavigator GetXPathNavigator(string viewPath)
{
XPathNavigator xpath= base.GetXPathNavigator(viewPath);
if (xpath == null)
return xpath;

XmlDocument xmldoc = new XmlDocument();
xmldoc.LoadXml(xpath.OuterXml);
XDocument xdoc = GetXDocFromXmlDoc(xmldoc);
var q = (from e in xdoc.Descendants("FilterCategory") where e.Attribute("ManagedProperty").Value == "format" || e.Attribute("ManagedProperty").Value == "bodyparts" select e);
q.Remove();
return xdoc.CreateNavigator();
}

Ici on sélectionne tous les nœuds du fichier XML qui pointent sur format et sur bodyparts et on les enlève du XML retourné par XPathNavigator.

On aurait pu les retirer du Filter Categories definition mais le souci c'est que les informations sont importantes pour créer les aspects visuels de refinement.

Apres nettoyage, voici le refinement panel :

Résultat

Une fois le Filter Categorie Definition complété correctement et le code de création des Charts et de l'ImageMap body de compilé. Voici ce que l'on obtient :

Les images sont bien entendu réactives :

 

Et permettent en cliquant dessus de filtrer la recherche :

Le code se trouve sur http://xvanneste.codeplex.com Nom du projet XVRefinementWP.

Comprendre l’architecture de FAST

L'architecture de Fast Search est composée de plusieurs parties principales, ci-dessous le diagramme des différentes parties :

Nom

Rôle

Crawler

Le crawler permet de faire la connexion à la source de données (SharePoint Site, Web Site…..)

Content Processor

Le content processor compile les données récupérées

Indexer

L'indexer stocke les informations traité par le content processor

Query Processor

Le Query processor traite les requêtes de l'utilisateur pour en ressortir les informations indexées

Federation

La fédération permet d'agréger différente source de données compatible Open Search

 

Le Content Processor permet de travailler les données inclues dans les documents. Le content processor, aussi appelé Pipeline de Fast Search, peut entièrement être personnalisé par code. Chaque partie peut être customisée pour les besoins de la recherche.
Par exemple des dictionnaires propres à la société peuvent être insérés dans l'entity extractor, des formats spécifiques peuvent être appris et transformés par le format conversion.

 

 

Format Conversion : Transforme différents type de fichiers en format texte

Language Encoding et Detection : Détecte le langage du document et l'encodage de celui-ci ce qui permettra le traitement sur la langue par la suite

Tokenisation : par rapport à la culture et a la langue du texte, retrouve les dates, numéro de téléphone, currency etc….

Lemmatization : Recherche les synonymes des mots et regroupe ceux-ci, par exemple résoudre, résolve, résolution.

Entity Extraction : Extrait des termes par rapport au contenu et a un ou plusieurs dictionnaires, OOTB extrait les compagnies, les personnes, la localité.

Date and Time Normalization : normalise les dates, par exemple 10/05/2010, 10 mai 2010, 10-05-2010, Lundi 10 mai 2010.

Document Vector : vectorise les documents pour retrouver les documents similaires voir les doublons.

Web Links Analysis : analyse le nombre de fois qu'un document est pris en référence pour augmenter le ranking de celui-ci.

Map Crawled Properties : Finit par mapper les métadonnées qui ont été trouvées dans les documents

Entity or Metadata Extractor [Fast Search for SharePoint 2010]

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.

Le site migre petit a petit vers 2010
Bonjour a tous,
mon site va migrer petit a petit vers SharePoint 2010.
User profile Synchronization Service Starting and Stopped

Si le service de synchronisation des profils est en statuts démarrage puis, au bout d'un moment, se mets en status stopped, voici ce qu'il faut faire :

Premièrement il faut ajouter l'utilisateur du service de synchronisation au groupe administrateur local. C'est pour cela qu'il est conseillé d'avoir un utilisateur différent de l'utilisateur dans lequel tourne SharePoint.

Ensuite il faut donner des droits spécifiques à l'utilisateur de synchronisation dans la console Active Directory Users and Computers :

On ajoute l'utilisateur au droit Active Directory :

On ajoute les droits allow a Replication Directory Changes, Replication Directory Changes All et Replication Synchronisation :

On Fait un iisreset si l'utilisateur est celui de sharepoint car celui-ci doit se reloguer.

Et voilà au bout de quelques instant le timerjob de synchronisation est lancé :

[Update] Pour Compléter l'article Benoit Hamet  :
"pas mal, mais il manque quelques informations
le IISRESET est à exécuter APRES la demande de démarrage des 2 services dans la Central Admin
Un pool d'appli IIS doit se créer; si ce n'est le cas, il faut faire démarrer le pool SharePoint Root qui est arrêté"