Blog

Lisez ce qui Nous Passionne: Développement Web et Technologies

Rechercher des PDF avec Umbraco

Rechercher des PDF avec Umbraco

Umbraco a longtemps utilisé le puissant moteur d’indexation et de recherche Lucene.Net pour piloter ses recherches de backoffice. Ainsi, lorsque le besoin de construire des modules de recherche s’est fait sentir, Umbraco a utilisé Examine, une interface de programmation (API) basée sur un prestataire et qui fonctionne facilement avec les indexes de Lucene. Examine permet aux utilisateurs de rechercher ou d’indexer rapidement des données parmi n’importe quel type de contenu (pdf, docx, doc, etc…) et enveloppe le moteur d’indexation et de recherche Lucene.Net. Lucene fonctionne très rapidement même sur un gros volume de données. Par conséquent, il était évident pour Umbraco d’instaurer ‘Umbraco Examine’ – une combinaison d’Umbraco, Examine et de Lucene.Net.

Umbraco Examine utilise Umbraco comme la source de données pour son index Lucene et fournit des recherches de site qui procurent des résultats par mot-clé. La recherche par défaut d’Examine explorera uniquement les nœuds d’Umbraco mais il n’effectuera aucune recherche de contenu parmi les fichiers multimédias Umbraco comme les PDF. Pour chercher des contenus de fichiers PDF, il faudra installer un plugin additionnel de NuGet appelé UmbracoExamine.PDF.

Avant d’explorer la méthode pour réaliser vos recherches de fichiers PDF, voyons tout d’abord comment Umbraco Examine peut être facilement configuré pour effectuer des tâches comme l’indexation et les recherches sur Umbraco.

Les notions de base d’Umbraco Examine

Nous savons tous qu’Examine n’est pas exclusif à Umbraco. Il peut être utilisé comme un composant indépendant pour n’importe quel projet qui nécessite un index rapide. Examine est une interface de programmation basée sur un prestataire, elle est extensible et vous pouvez configurer autant d’index que vous le souhaitez, chacun étant configuré individuellement.

Par défaut, Umbraco Examine est fourni dans l’ensemble des fonctionnalités d’Umbraco avec des configurations basiques. Et comme l’utilisation d’Examine est basée sur la configuration, les développeurs doivent gérer les paramètres et les configurations selon leurs besoins.

Gestion des paramètres et des configurations

  1. Séries d’index

Les développeurs commencent habituellement avec ce qu’on appelle une série d’index, qui est tout simplement la définition d’index, avec déscription des champs et types de champs qui sont inclus dans l’index).

Pour configurer une série d’index, il faudra aller sur le fichier /config/ ExamineIndex.config

Les paramètres et configurations de la recherche indexée peuvent être modifiés à l’aide des fichiers de configuration ci-dessous :

~\config\ExamineIndex.config

~\config\ExamineSettings.config

Par défaut, le fichier ~\config\ExamineIndex.config a trois séries d’index - InternalIndexSet, InternalMemberIndexSet et ExternalIndexSet.

L’ensemble d’index par défaut ressemble à ceci :

<IndexSet SetName="InternalIndexSet" IndexPath="~/App_Data/TEMP/ExamineIndexes/Internal/"/>

Vous pouvez modifier les configurations de la série d’index (IndexSet) en spécifiant les types de documents et de propriétés utilisés pour indexer.

Un exemple de série indexée personnalisée ressemble à ceci :

<IndexSet SetName="ExternalIndexSet" IndexPath="~/App_Data/TEMP/ExamineIndexes/External/">

    <IndexAttributeFields>

      <!-- Set here all page properties that we want to be indexed. -->

      <add Name="id" />

      <add Name="version" />

      <add Name="parentID" />

      <add Name="writerID" />

      <add Name="creatorID" />

    </IndexAttributeFields>

    <IndexUserFields>

      <!-- Set here all site custom properties that we want to be indexed. -->

      <add Name="testTitle" EnableSorting="true" />

      <add Name="testDescription" EnableSorting="true" />

    </IndexUserFields>

    <IncludeNodeTypes>

      <!-- Set here all site document types that we want to be indexed. -->

      <add Name="Test"/>

    </IncludeNodeTypes>

    <ExcludeNodeTypes>

      <!-- Set here all site document types that we want to NOT be indexed. -->

    </ExcludeNodeTypes>

  </IndexSet>

Pour plus de détails sur comment configurer Indexset, consultez https://github.com/Shazwazza/Examine/wiki/IndexSet

  1. Fournisseurs d’index et de recherches d’Examine

Une fois que l’index a été défini, il vous faudra « former » Examine précisément à ce qu’il devra faire avec cette configuration. Pour cela, vous devrez premièrement configurer votre « Indexeur » et « Chercheur ».

Pour configurer l’Indexeur et le Chercheur, vous devrez vous diriger vers le fichier /Config/ExamineSettings.config

Le fichier /Config/ExamineSettings.config contient deux sections principales : les paramètres de ExamineIndexProviders et de ExamineSearchProviders.

Voici un exemple de fournisseur d’Index (Index Providers)

<add name="ExternalIndexer" type="UmbracoExamine.UmbracoContentIndexer, UmbracoExamine"/>

Vous pouvez l’étendre avec des propriétés supplémentaires comme :

  1. dataService (service de donnés) - le type de fournisseur sera utilisé pour invoquer Umbraco en fonction des données dont il a besoin. Généralement, cela ne nécessite pas de changements à moins que vous souhaitiez tester des données depuis une source non-Umbraco ou que vous ayez des exigences personnelles spécifiques.
  2. indexSet (série d’Index) – Spécifie explicitement l’ensemble d’index qui doit être utilisé. Généralement, ceci est basé sur la nomination des conventions.
  3. supportUnpublished (support non-publié) – Ceci est utilisé si vous souhaitez que l’indexeur indexe du contenu non-publié.
  4. supportProtected (support protégé) – Ceci est utilisé si vous souhaitez que l’indexeur indexe les contenus protégés.
  5. runAsync – Ceci va traiter les fichiers en file d’attente dans l’index de façon asynchrone, sauf si vous êtes en mode « test ».
  6. Interval – Cela définit la fréquence à laquelle le service asynchrone traitera la file d’attente en secondes.

Un élément de recherche externe (Default External searcher) ressemble à ceci :

<ExamineSearchProviders defaultProvider="ExternalSearcher">

    <providers>

<add name="ExternalSearcher" type="UmbracoExamine.UmbracoExamineSearcher, UmbracoExamine" />

</providers>

  </ExamineSearchProviders>

Vous pouvez personnaliser le paramètre du prestataire de recherche en entrant des valeurs pour des propriétés comme enableLeadingWildcard, analyzer etc.

Consulter les configurations d’index d’Examine sur Umbraco

Pour voir les configurations d’index d’Examine sur le backoffice d’Umbraco, il vous faudra aller dans la section « Developers » comme montré dans la capture d’écran ci-dessous :

Configuration pour trouver des contenus dans des fichiers PDF

Comme mentionné précédemment, la recherche par défaut d’Examine cherchera uniquement les nœuds d’Umbraco mais il ne fera aucune recherche de contenus parmi les fichiers multimédias comme des fichiers PDF. Pour trouver du contenu sous fichiers PDF, il vous faut installer un plugin additionnel disponible sur NuGet appelé UmbracoExamine.PDF

Pendant que vous installez le plugin, si vous rencontrez une quelconque erreur en lien avec ‘Newtonsoft.Json’ ou ‘System.Threading.Tasks.Dataflow’, supprimez leurs références depuis le fichier packages.config

Une fois l’installation du plugin Nuget terminée, vous allez voir que les fichiers ~\config\ExamineIndex.config et ~\config\ExamineSettings.config sont mis à jour avec les éléments de configuration ci-dessous :

  1. ~\config\ExamineIndex.config

<IndexSet SetName="PDFIndexSet" IndexPath="~/App_Data/TEMP/ExamineIndexes/PDFs"/ 

  1. ~\config\ExamineSettings.config

Index Provider

<add name="PDFIndexer" type="UmbracoExamine.PDF.PDFIndexer, UmbracoExamine.PDF" extensions=".pdf" umbracoFileProperty="umbracoFile"/>

      Search Provider

<add name="PDFSearcher" type="UmbracoExamine.UmbracoExamineSearcher, UmbracoExamine"/>

Idéalement, le but est d’éviter de créer des moteurs de recherche séparés pour les nœuds d’Umbraco et pour les fichiers PDF. Pour combiner les deux recherches en un seul résultat, nous devons créer MultiIndexSearcher (recherche multi-index) dans le fichier ~\config\ExamineSettings.config

Un exemple d’un élément de MultiIndexSearcher ressemble à ceci :

<add name="ContentAndPdfSearcher" type="Examine.LuceneEngine.Providers.MultiIndexSearcher,Examine" analyzer="Lucene.Net.Analysis.Standard.StandardAnalyzer,Lucene.Net" enableLeadingWildcards="true" indexSets="ExternalIndexSet,PDFIndexSet"/>

A présent, modifiez le code dans le contrôleur de recherche en utilisant l’exemple dessous :

var searcher = ExamineManager.Instance["ContentAndPdfSearcher"];

var searchCriteria = searcher.CreateSearchCriteria();

var query = searchCriteria.GroupedOr(new[] { "nodeName", "name", "title", "body", "FileTextContent" }, filter.Keyword).Compile();

var searchResults = searcher.Search(query);

Ce code recherchera des mots-clés dans le champ du nom du nœud, champ du nom, champ du titre, l’élément du corps et le contenu PDF (en supposant que les propriétés ‘name (nom)’, ‘title (titre)’, ‘body (corps)’, existent. Le contenu du PDF est ajouté à la propriété du ‘FileTextContent’ (contenu texte du fichier).

Étant donné que les propriétés des résultats de la recherche PDF et les recherches régulières de contenus sont différentes, on peut utiliser l’exemple ci-dessous pour coder et créer un ensemble de résultats pour la page de résumé.

Items = new List<SearchResultItem>();

foreach (var item in pages)

{

    if (item.Fields.ContainsKey("FileTextContent"))

    {

        var node = helper.TypedMedia(item.Fields["__NodeId"]);

        Items.Add(new SearchResultItem()

        {

            Title = node.Name,

            Url = node.Url,

            Summary = StringHelpers.Truncate(item.Fields["FileTextContent"] ?? string.Empty, 300)

        });

    }

    else

    {

        var node = helper.TypedContent(item.Fields["id"]);

        Items.Add(new SearchResultItem()

        {

            Title = item.Fields["title"],

            Url = node.Url,

            Summary = item.Fields.ContainsKey("body") ? StringHelpers.Truncate(item.Fields["body"] ?? string.Empty, 300) : MvcHtmlString.Empty

        });

    }

}

En installant le plugin NuGet et en utilisant des paramètres de configuration simples comme ceux décrits en haut, vous pourrez profiter d’une recherche de site pleinement opérationnelle qui donne des résultats par mot-clé, non seulement pour le contenu du nœud d’Umbraco mais aussi pour les fichiers PDF sauvegardés et le contenu textuel qu’ils contiennent.

Shwetha Bhat | Blogger

Manjunath Govindappa | ASP.NET Technical Lead

Laissez un commentaire

Aix-en-Provence – Bangalore – Montréal

Nous valorisons la diversité et nous travaillons depuis 3 villes fantastiques, situées sur 3 continents et autant de fuseaux horaires différents.


Contactez-nous
Nous vous rappellerons dès que possible !