# 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'attributlang
)timestamp
: format strftime%A %d %B %Y %m %H:%M:%S
: exemple : Lundi 12 mars 2020 03 14:54:00 (dépend de l'attributlang
)enum
: libellé de l'énuméré (dépend de l'attributlang
). Si c'est un énuméré à plusieurs niveau, le libellé de ces parents est aussi donné.docid
: Titre de la relationaccount
: Titre de la relationfile
: 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