# Configuration des domaines de recherche

# Format du fichier de configuration

La configuration d'un domaine est faite dans un fichier XML unique.

Le fichier de configuration doit suivre le schéma https://platform.anakeen.com/4/schemas/search-domain/1.0.

Le domaine de recherche est identifié par son nom (name).

Configuration Description
/search-domain/@name (obligatoire) Identifiant du domaine
/search-domain/@lang (obligatoire) Locale dans laquelle les données de recherche vont être produites
/search-domain/search-stem/ (obligatoire) Identifiant du système de règles de parsing
/search-domain/description/ Description textuelle du domaine
/search-domain/search-config/@structure (obligatoire) Structure utilisée pour définir l'ensemble de recherche
/search-domain/search-config/@collection Identifiant d'une collection permettant de filtrer les Smart Element de la structure donnée
/search-domain/search-config/field/@ref Identifiant du champ à indexer
/search-domain/search-config/field/@weight Poids indiquant l'importance de la donnée (A, B, C, D)
/search-domain/search-config/title/@weight Titre à indexer. Poids indiquant l'importance de ce titre (A, B, C, D)
/search-domain/search-config/file/@ref Identifiant du champ de type file pour indexer le contenu du fichier
/search-domain/search-config/file/@weight Poids indiquant l'importance du contenu du fichier (A, B, C, D)
/search-domain/search-config/callable/@function Méthode PHP spécifique à appeler lors de l'indexation
/search-domain/search-config/callable/@weight Poids indiquant l'importance dee données fournies par la méthode (A, B, C, D)

Exemple:

Domaine restreint au Smart Element de la Smart Structure IUSER. Les données indexées sont les Smart Fields "us_login" (login), "us_fname" (prénom), "us_lname" (nom) , "us_mail" (adresse de courriel)

<smart:search-domain name="users" lang="fr" xmlns:smart="https://platform.anakeen.com/4/schemas/search-domain/1.0">
    <smart:search-stem>simple</smart:search-stem>
    <smart:description>Test sur les utilisateurs</smart:description>
    <smart:search-config structure="IUSER" >
        <smart:field ref="us_login"  weight="A" />
        <smart:field ref="us_fname"  weight="B" />
        <smart:field ref="us_lname"  weight="B" />
        <smart:field ref="us_mail"  weight="C" />
    </smart:search-config>
</smart:search-domain>

# Détail sur les éléments de configuration

# /search-domain/@name

L'identifiant du domaine doit être unique parmi les domaines. Ceci est l'identifiant utilisé dans les méthodes de l'api php

# /search-domain/@lang

La langue généralement fr ou en, est la langue dans laquelle les données de recherche seront produites. Cela a un impact notamment sur les dates et les énumérés.

# /search-domain/search-stem/

Le système de règles référence un des systèmes enregistrés dans la base de données.

Par défaut les règles suivantes sont incluses (cela peut varier en fonction de votre installation de PostgreSql)

> \dF
              List of text search configurations
   Schema   |    Name    |              Description
------------+------------+---------------------------------------
 pg_catalog | danish     | configuration for danish language
 pg_catalog | dutch      | configuration for dutch language
 pg_catalog | english    | configuration for english language
 pg_catalog | finnish    | configuration for finnish language
 pg_catalog | french     | configuration for french language
 pg_catalog | german     | configuration for german language
 pg_catalog | hungarian  | configuration for hungarian language
 pg_catalog | italian    | configuration for italian language
 pg_catalog | norwegian  | configuration for norwegian language
 pg_catalog | portuguese | configuration for portuguese language
 pg_catalog | romanian   | configuration for romanian language
 pg_catalog | russian    | configuration for russian language
 pg_catalog | simple     | simple configuration
 pg_catalog | spanish    | configuration for spanish language
 pg_catalog | swedish    | configuration for swedish language
 pg_catalog | turkish    | configuration for turkish language

Par défaut le français (french) est modifié lors de l'installation du module pour ajouter l'option (unaccent) permettant de rechercher sans tenir compte des accents.

La définition du parser est alors :

> \dF+ french
Text search configuration "pg_catalog.french"
Parser: "pg_catalog.default"
      Token      |     Dictionaries
-----------------+----------------------
 asciihword      | french_stem
 asciiword       | french_stem
 email           | simple
 file            | simple
 float           | simple
 host            | simple
 hword           | unaccent,french_stem
 hword_asciipart | french_stem
 hword_numpart   | simple
 hword_part      | unaccent,french_stem
 int             | simple
 numhword        | simple
 numword         | simple
 sfloat          | simple
 uint            | simple
 url             | simple
 url_path        | simple
 version         | simple
 word            | unaccent,french_stem

Le dictionnaire simple est aussi modifié pour enlever les accents des données de recherche.

Les autres dictionnaires de langue ne sont pas modifiés et donc par conséquent le parser english prend en compte les accents par défaut. Mais comme normalement il n'y a pas d'accent en anglais il est inutile d'ajouter cette règle supplémentaire.

# /search-domain/description/

La description indique le nom affiché dans l'interface d'administration.

# /search-domain/search-config/@structure

Indique la structure des Smart Element à indexer. Par défaut, tous les Smart Element de la Smart Structure, incluant les éventuelles sous-structures, sont indexés. Les révisions ne sont pas prises en comptes.

# /search-domain/search-config/@collection

Permet de filtrer les Smart Element à indexer. La collection est la référence à une recherche (recherche détaillée, rapport) portant sur la structure indiquée.

Cette collection peut permettre de filtrer sur les révisions ou sur des états passées.

# /search-domain/search-config/field/@ref

Référence à un Smart Field à indexer. Ce Smart Field doit appartenir à la Smart Structure.

La valeur indexée dépend du type de Smart Field:

  • date: format strftime %A %d %B %Y %m : exemple : Lundi 12 mars 2020 03 (dépend de l'attribut lang)
  • timestamp: format strftime %A %d %B %Y %m %H:%M:%S : exemple : Lundi 12 mars 2020 03 14:54:00 (dépend de l'attribut lang)
  • enum: libellé de l'énuméré (dépend de l'attribut lang). Si c'est un énuméré à plusieurs niveau, le libellé de ces parents est aussi donné.
  • docid : Titre de la relation
  • account: Titre de la relation
  • file: Nom du fichier

Pour les autres types de Smart Field, c'est la valeur brute qui est retournée.

Note

Pour les types htmltext, l'interpréteur de PostgreSql enlève nativement les balises html.

# /search-domain/search-config/field/@weight

Le poids est l'importance donnée à l'information. A est le plus important et D le moins important.

Pour information, c'est la fonction ts_rank_cd qui est utilisée.

Cette fonction calcule le classement de la densité de couverture pour le vecteur de document et la requête donnés, comme décrit dans Clarke, Cormack et Tudhope dans "Relevance Ranking for One to Three Term Queries" de la revue "Information Processing and Management", 1999.

Ce poids est utilisé si le tri par pertinence est réalisé.

# /search-domain/search-config/file/@ref

Les contenu de fichiers peuvent être inclus dans les données de recherche. L'extraction du texte du fichier est réaliser par le moteur de transformation.

Le moteur utilisé est le moteur utf8.

L'indexation des fichiers est réalisée de manière asynchrone. Le résultat de l'extraction du texte est inséré lorsque le moteur de transformation a fini l'extraction.

Les résultats des extractions est mise en cache dans la table file.contents. Cette table contient aussi les éventuelles erreurs d'indexation. L'interface d'administration indique le nombre d'erreur d'extraction. La méthode \Anakeen\Fullsearch\SearchDomainDatabase::getFailingFiles() permet de récupérer les erreurs d'extraction.

# /search-domain/search-config/title/@weight

Indique que le titre du Smart Element soit être indexé. L'attribut weight indique le poids du titre.

# /search-domain/search-config/callable/@function

Indique que la fonction indiquée doit être appelée lors de l'indexation. Le retour de cette méthode est ajouté aux données de recherche. Cette fonction est appelée après l'indexation des autres données.

La fonction doit faire référence à une méthode statique ou classe __invoke.

Exemple :

Ajout d'informations provenant de l'historique et du nom logique

<smart:search-domain name="testDomainCustom" lang="fr"
                     xmlns:smart="https://platform.anakeen.com/4/schemas/search-domain/1.0">
    <smart:search-stem>simple</smart:search-stem>
    <smart:search-config structure="MY_BILL">
        <smart:title weight="A"/>
        <smart:callable function="My\Config\CustomData::addHisto" weight="C" />
        <smart:callable function="My\Config\CustomData::getName" weight="D" />
        <smart:callable function="My\Config\CustomData::addProductInfo" weight="D" />
    </smart:search-config>
</smart:search-domain>

Pour indexer des données provenant d'autres Smart Element, la méthode Anakeen\Fullsearch\SearchSmartElementIndex::getSmartFieldIndex() retourne les données textuelles pour un Smart Element et un Smart Field donné comme indiqué dans le paragraphe field/@ref.

Attention

La méthode getSmartFieldIndex ne réalise pas l'extraction des données textuelles du contenu des fichiers pour les Smart Field de type file.

<?php
namespace My\Config;

use Anakeen\Core\Internal\SmartElement;
use Anakeen\Core\SEManager;
use Anakeen\Fullsearch\SearchSmartElementIndex;

class CustomData
{
  /**
   * Retourne les codes et les commentaires de l'historique
   * @param SmartElement $smartElement
   * @return string
   */
  public static function addHisto(SmartElement $smartElement)
  {
    $history = $smartElement->getHisto();
    $s = "";
    foreach ($history as $item) {
      $s .= sprintf("%s - %s ", $item["code"], $item["comment"]);
    }
    return $s;
  }
  /**
   * Retourne le nom logique
   * @param SmartElement $smartElement
   * @return string
   */
  public static function getName(SmartElement $smartElement)
  {
    return $smartElement->name;
  }

  /**
   * ajouter des données en provenance d'un Smart Element "produits" :
   */
  public static function addProductInfo(SmartElement $smartElement)
  {
    $info = [];
    // Récupération du Smart Element lié par la Smart Field "my_product"
    $productId = $smartElement->getRawValue("my_product");
    if ($productId) {
      $product = SEManager::getDocument($productId);
      if ($product) {
        // Ajout des données sur les 2 Smart Field "produit" : "prod_livraison_date" et "prod_description"
        $info[] = SearchSmartElementIndex::getSmartFieldIndex($product, $product->getAttribute("prod_livraison_date"));
        $info[] = SearchSmartElementIndex::getSmartFieldIndex($product, $product->getAttribute("prod_description"));
      }
    }

    return implode(", ", $info);
  }
}

# Enregistrement d'un domaine de recherche

./ank.php --script=importSearchDomain --file=vendor/My/Config/iuserSearchConfig.xml