17.8.1.12 Recherche globale
La classe SearchDoc
peut aussi être utilisée pour rechercher des
valeurs sur l'ensemble des attributs des documents. Pour cela il faut utiliser
la méthode ::addGeneralFilter()
. Cette méthode prend en
argument un ou plusieurs mots. Ce filtre ne tient pas compte de la casse. Il
n'est pas possible de filtrer sur un mot en tenant compte de sa casse.
$s=new SearchDoc('',"ANIMAL"); $s->addGeneralFilter('cheval'); $s->search();
L'exemple ci-dessus permet de rechercher dans la famille "Animal" tous les documents dont au moins une valeur contient le mot "cheval". Dans cet exemple cela permet aussi de retrouver les documents contenant leur forme plurielle, dans ce cas : "chevaux". Par contre cette recherche ne retournera pas les documents contenant "chevaleresques". Cette recherche ne tient pas compte des accents.
17.8.1.12.1 Terme exact
Pour rechercher un terme exact il faut le mettre entre "
(double quotes). Ainsi
$s->addGeneralFilter('"cheval"');
retourne les documents contenant le mot "cheval" mais pas "chevaux", cette recherche tient aussi compte des accents.
$s->addGeneralFilter('"cheval blanc"');
retourne tous les documents contenant exactement le terme cheval blanc (attention, ici, blanc doit être positionné immédiatement à la suite de cheval).
17.8.1.12.2 Partie de mot
Pour rechercher une partie de mot, il faut utiliser le caractère *
devant la
partie à rechercher.
$s->addGeneralFilter('cheva*');
retourne tous les documents contenant des mots commençant par cheva, comme
cheval
, chevalier
, chevaux
, etc.
$s->addGeneralFilter('*vage');
retourne tous les documents contenant des mots se terminant par vage, comme élevage, gavage, pavage, etc.
17.8.1.12.3 Plusieurs mots
Pour rechercher plusieurs mots il suffit de les indiquer en les séparant par un
espace ou le mot clef AND
en majuscule.
$s->addGeneralFilter('cheval noir'); $s->addGeneralFilter('cheval AND noir'); // forme équivalente avec AND
Cet exemple recherche tous les documents dont un attribut contient le mot "cheval" et aussi le mot "noir" (sur le même attribut ou un autre). Attention le filtre suivant
$s->addGeneralFilter('"cheval noir"');
recherche les documents contenant "cheval" suivi de "noir"
La disjonction est aussi disponible en utilisant le mot clef OR
en majuscule
entre deux mots
$s->addGeneralFilter('cheval OR poulain');
Différentes combinaisons peuvent ensuite être utilisées pour réaliser un filtre plus complexe
$s->addGeneralFilter('(cheval noir) OR (jument blanche)');
Cet exemple recherche les chevaux noirs ou les juments blanches.
17.8.1.12.4 Utilisation de l'option de correction d'orthographe
La méthode SearchDoc::addGeneralFilter() dispose d'une option (deuxième paramètre) pour vérifier l'orthographe des mots en français.
$s->addGeneralFilter('méson',true);
Cet exemple lance une recherche sur les mots "méson" ou "maison". Cette
vérification n'est pas effectuée sur les termes exacts (avec double quote) ni
sur les expressions (usage du *
).
17.8.1.12.5 Ordonnancement par pertinence
Par défaut les documents retournés par SearchDoc sont triés par titre. Il est possible de les trier par pertinence.
Le calcul de la pertinence est effectué par PostgreSql. Elle prend en compte l'information lexicale, la proximité et la structure ; en fait sont considérés
- le nombre de fois où les termes de la requête apparaissent dans le document,
- la proximité des termes de la recherche avec ceux de la requête,
- l'importance du passage du document où se trouvent les termes du document.
Les poids des mots sont en fonction de l'endroit où le terme est trouvé.
- poids A : titre du document,
- poids B : attributs résumés,
- poids C : autres attributs non résumé,
- poids D : contenu des fichiers attachés (si indexation activé).
Si le terme recherché est de poids A, la pertinence sera plus élevée que s'il
est trouvé avec un poids B. Si on a utilisé une recherche générale sans
expression ni mot exact, on peut utiliser la méthode
::setPertinenceOrder()
sans argument :
$s=new SearchDoc('',"ANIMAL"); $s->addGeneralFilter('cheval'); $s->setPertinenceOrder(); $s->search();
Dans ce cas, les clefs d'ordonnancement sont celles du filtre. Le résultat est trié par pertinence sur le mot "cheval" (ou "chevaux"). Si on utilise le mot exact, la pertinence sera équivalente à la recherche par mot. On obtiendra le même ordre avec un calcul sur la forme lemmatisé de "cheval" (incluant "chevaux").
$s->addGeneralFilter('"chevaux"'); $s->setPertinenceOrder(); // la pertinence est sur le mot cheval
La pertinence sans argument ne peut pas être utilisée avec une recherche d'expression. Si on veut maîtriser plus précisément la pertinence, il est possible d'utiliser ses propres mots.
$s=new SearchDoc('',"ANIMAL"); $s->addFilter("an_description ~ * 'Equus'"); $s->setPertinenceOrder('cheval poulain jument'); $s->search();
Dans ce cas, la recherche étant sur des attributs précis, il faut préciser explicitement le critère de pertinence. Dans cet exemple, la pertinence se fera sur les occurrences des mots "cheval", "poulain" ou "jument" trouvés dans les documents retournés qui contiennent 'Equus' dans leur description.
17.8.1.12.6 Mise en évidence des mots trouvés
La méthode SearchDoc::getHighlightText()
permet de retourner la partie où le
texte recherché a été rencontré. Cette fonctionnalité ne peut être utilisée
qu'avec une recherche de mots. Cela ne fonctionne pas avec les expressions ni
avec les mots exacts.
$s = new SearchDoc('', 'ANIMAL'); $s->addGeneralFilter("cheval noir"); $s->setObjectReturn(true); $s->search(); $dl = $s->getDocumentList(); foreach ($dl as $doc) { $ht = $dl->getSearchDocument()->getHighLightText($doc); printf("%d) %s : %s\n"),$doc->id, $doc->getTitle(), $ht); }
Les mots trouvés sont par défaut entourés des balises <strong>
et
</strong>;
. Elles peuvent être modifiées avec les arguments optionnels de
la méthode.