Si vous souhaitez exposer une interface Z3950 pour une récupération d’informations, tôt ou tard, vous rencontrerez le profil BATH, qui est essentiellement un ensemble de règles visant à promouvoir des comportements standardisés entre les serveurs Z3950. L’objectif de ces spécifications est de déterminer une liste de recherches (champs, attributs) qui doivent être prises en charge par un service Z3950.
L’objectif de cet article n’est pas de vous expliquer comment configurer un point d’accès Z3950 avec SOLR en coulisses, car il existe de nombreux endroits où vous pouvez trouver cette information. Au lieu de cela, je vais rédiger une brève note sur la recherche dite “Exact Match”, qui est l’une des parties les plus intéressantes de l’histoire. Allons directement au problème. Voici les spécifications de la recherche “Exact Match” :
- Position : premier dans le champ
- Troncature : ne pas tronquer
- Complétude : champ complet
- Structure : phrase
C’est un scénario assez simple avec une petite question (qui, après cette lecture, pourrait encore rester ouverte car ce que vous lisez ici n’est que mon interprétation de l’histoire, pas la vérité absolue). En général, la définition est assez claire :
- Vous devez rechercher dans l’index donné en supposant que la correspondance doit être effectuée en gardant à l’esprit que les termes saisis par l’utilisateur doivent être considérés comme une valeur de départ.
- Les termes saisis par l’utilisateur sont supposés être des “mots complets” (ne pas tronquer).
- Ce que l’utilisateur a saisi est un champ complet (par exemple, un titre complet ou un nom d’auteur).
Si dans notre index il y a un document avec Alessandro Manzoni comme auteur, une requête de correspondance exacte ne trouvera ce document que si les valeurs saisies par l’utilisateur sont :
- Alessandro Manzoni
- alessandro manzoni (en supposant qu’une analyse minimale du texte a été effectuée en convertissant en minuscules).
Par exemple, les requêtes suivantes ne correspondraient pas à ce document :
- manzoni alessandro
- Manzoni alessandro
Car la recherche par proximité n’est pas mentionnée dans la spécification (d’accord, c’est utile dans la vie réelle, mais c’est une autre histoire). Un autre type d’analyse de texte qui pourrait être appliqué sans violer la spécification est la suppression des délimiteurs intra-mots.
Faisons un exemple. Si j’ai :
- Manzoni, Alessandro.
Il est difficile d’imaginer qu’un utilisateur sera capable de faire une requête de correspondance exacte en tapant exactement ce qui est écrit dans l’index. Il serait préférable (à la fois au moment de l’indexation et de la requête) de supprimer la ponctuation intra-mots et finale et de faciliter la tâche. De cette manière, les requêtes suivantes :
- manzoni alessandro
- Manzoni, Alessandro.
- manzoni alessandro..
- manzoni. alessandro,
correspondraient au document.
Quelles sont les manipulations appropriées qu’un champ SOLR doit effectuer pour satisfaire cette exigence “Exact Match” ? Si je devais adhérer strictement aux exigences BATH, mon champ devrait être une simple chaîne comme ceci :
Mais dans ce cas, seule une recherche pour Manzoni, Alessandro. (avec la ponctuation exacte) correspondra au document correspondant, ce qui n’est pas exactement ce que nous voulons.
Une approche plus flexible consisterait à attribuer un type solr.TextField à notre champ. Le type TextField vous permet d’associer une analyse de texte à un champ.
Prenons un autre exemple. Cette fois, l’auteur est
Contessa Serbelloni Mazzanti Viendalmare
Suivant l’approche mentionnée, cette valeur d’entrée serait transformée ainsi :
Contessa Serbelloni Mazzanti Viendalmare (original)
contessa serbelloni mazzanti viendalmare (lowercase)
contessa, serbelloni, mazzanti, viendalmare (word tokenizer)
Si un utilisateur saisit la requête suivante
q="contessa Serbelloni MAZZANTI viendalmare"
Une correspondance est trouvée. Maintenant, la raison pour laquelle cela n’est pas suffisant pour notre profil BATH conforme peut être trouvée dans la spécification de la recherche “Exact Match” :
- Position : premier dans le champ
- Troncature : ne pas tronquer
- Complétude : champ complet
- Structure : phrase
Le fait d’être premier dans le champ signifie que, pour correspondre à un document, le champ indexé doit contenir les termes saisis par l’utilisateur (dans l’ordre donné car il s’agit d’une recherche “phrase”) en première position. De plus, “champ complet” signifie que ce que l’utilisateur a saisi est censé être la valeur complète du champ cible. Donc, l’approche d’indexation suivie ci-dessus violerait ces deux préconditions. Comment ? Voici la réponse : si l’utilisateur saisit ce qui suit
q="MAZZANTI viendalmare"
Une correspondance avec le même document sera toujours trouvée, car les termes sont dans le champ indexé cible avec l’ordre donné. Mais ils ne sont pas au début du champ et ne représentent pas la valeur littérale complète. Donc, même si c’est un peu mieux, cette approche ne fonctionne pas.
Voici une autre approche qui introduit une chaîne de traitement de texte plus articulée. À la fois lors de l’indexation et de la requête, à partir de
Contessa Serbèlloni, Mazzànti Viendalmarè.
Tokeniseur de mots-clés
Le filtre ne fait rien, il considère l’entrée comme une valeur entière (c’est-à-dire un seul jeton).
Minuscule
Il s’agit de la première normalisation que nous appliquons. Cela entraîne la transformation suivante :
Remplacement des diacritiques
contessa serbelloni, mazzanti viendalmare.
Suppression des délimiteurs intra-mots
Le dernier filtre supprime les délimiteurs intra-mots, y compris les espaces et la ponctuation de fin. Voici le résultat :
contessaserbellonimazzantiviendalmare
C’est tout. Comme dernière remarque, rappelez-vous que la chaîne décrite doit être appliquée à la fois au moment de l’indexation et de la requête. Exécutons quelques tests pour vérifier l’implémentation.
- Rechercher Contessa serbelloni mazzanti viendalmare produira 1 résultat ;
- Rechercher serbelloni mazzanti ne produira aucun résultat ;
- Rechercher Contessa serbelloni mazzanti ne produira aucun résultat ;
- Rechercher Contessa serbel loni maz zanti vien dal mare produira 1 résultat ; ok, cela pourrait être considéré comme une violation et je suis d’accord avec vous… j’y réfléchis… en attendant, disons que ce “bug” est très utile car (le moteur de recherche) vous ne pouviez pas savoir comment le nom de l’auteur est écrit exactement.