# WEM, Labo 1
Authors: Mathieu Jee, Kamil Amrani
Date: Mars 2020
## 1. Crawler
Le site de référence crawlé pour ce laboratoire est https://www.techpowerup.com
Plus précisément: les articles de ce site web.
Au niveau de l'implémentation, nous faisons la différence entre une page quelconque du site et un article en analysant les attributs open graph des balises **meta**. Un article sur le site **techpowerup** possède une balise **meta** dont l'attribut **property** vaut `og:type` et un second attribut **content** qui vaut `article`:
```htmlmixed=
<meta property="og:type" content="article">
```
En plus du type, nous utilisons OpenGraph pour extraire l'url, le titre et la description de l'article. Le texte de l'article, quant à lui, se situe dans la balise `<div class="text p">`.
## 2. Indexation Spécialisée
Nous avons décidé de récupérer les éléments principaux constituant un article sur le site **techpowerup**.
| nom | type | indexed | stored | multiValued |
| ----------- | ------------ | ------- | ------ | ----------- |
| id | string | true | true | false |
| url | string | false | true | false |
| title | text_general | true | true | false |
| description | text_general | false | true | false |
| text | text_general | true | false | false |
Les champs **url** et **description** ne sont pas indexés, car aucune recherche ne sera effectuée dessus. Il est en effet peu intéressant d'effectuer des recherches d'articles directement sur le champ **url** par exemple.
Ensuite, le champ **text** n'est pas stocké, car nous ne voulons pas enregistrer l'article dans son intégralité, mais uniquement un léger descriptif accompagné du lien vvers cet article.
Afin d'avoir un **id** unique pour chaque article indexé, nous avons choisi d'utiliser le hash (`java.lang.String.hashCode`) de l'url de cet article.
## 3. Recherche
Une recherche par défaut (`q=*/*`) retourne tous les articles présents au sein du Core solr.
Une recherche avec un mot qui se trouve dans l'index retourne uniquement les articles possèdant ce mot dans l'index désiré.
Dans notre cas, une recherche s'effectue sur le titre et le texte de l'article. Le titre possède un poids plus élevé.
## 4. Questions théoriques
### 4.1
Pour indexer des pages dans plusieurs langues, une des solutions serait d'utiliser un Core solr par langue. Avec cette approche, il n'est pas possible d'effectuer des requêtes sur plusieurs langues en même temps. Il est cependant peu intéressant d'effectuer de telles requêtes.
Il faut faire attention à la gestion des stopwords et autres particularités propres à chaque langue. Il faudra donc paramétrer chaque Core solr en fonction de la langue qui lui est attribué.
### 4.2
La recherche floue (*fuzzy search*) autorise un certain nombre de caractères erronés. Il est ainsi possible de retrouver un mot malgré une ou plusieurs fautes de frappes ou d'orthographes.
Pour utiliser la recherche floue sur Solr, il faut utiliser le symbole `~` à la fin du/des mot(s).
Solr se base sur les algorithmes de distances de Levenshtein (https://en.wikipedia.org/wiki/Levenshtein_distance) ou d'édition sur les arbres (https://en.wikipedia.org/wiki/Edit_distance).
Concernant l'exemple de variation orthographique proposé dans la question, certaines variantes du nom diffèrent sur une proportion trop importante de caractère (exemple: *Caitlin* et *Katelynn*). Si nous autorisions Solr a prendre en compte de telles variations, il est possible que les résultats obtenus nous amènent vers des mots/noms complètement hors contexte.
La solution est de faire de la lemmatisation. Cette méthode est en revanche peu appliquable à des noms propres. Il faudrait donc, ici, avoir soit un dictionnaire avec tous les variations des noms propres, ou alors définir des règles personnalisées permettant de lier certaines lettre aux prononciations équivalentes (exemple: *C* et *K* sont phonétiquement semblables).