Vous voulez vous exercer avec Elastic Search mais vous ne savez pas par où commencer ? Et si on s'installait une stack en local avec Docker pour y effectuer des tests ? Je vous propose aujourd'hui de créer tout ça de 0, ainsi que d'y injecter un premier jeu de données.
Pour faire rapide 👉 Elastic Search est un moteur de recherche.
Maintenant, qu'est-ce qu'un moteur de recherche ?
Vous stockez probablement déjà des informations dans une base de données. Lorsque vous recherchez des informations dans cette base, vous allez utiliser des requêtes. Si vous voulez faire des tris dans ces requêtes, en base de données vous aurez les possibilités suivantes:
Supposez qu'un utilisateur recherche le terme: Volleyball, il est possible que ce terme apparaisse dans le titre d'un article ou dans le contenu de l'article.
👍 S'il s'agit du titre, la probabilité est forte que cette article intéresse notre utilisateur.
👎 Dans le cas où l'article contient le terme Volleyball, il n'est pas garantie que cela corresponde à un article intéressant. En effet, ce terme peut très bien faire partie d'une phrase comme:
La municipalité interdit toute pratique de sport de ballon tel que le football et le volleyball dans ce secteur.
Vous voyez le terme apparait bien, mais il est peu probable que son occurence soit intéressante pour notre utilisateur.
Comment fait-on pour classer et trier les contenus par intérêt avec une base de données traditionnelle ?
La réponse est simple : on ne peut pas vraiment, car ces bases ne sont pas faîtes pour ça.
Ce que vous devrez faire, c'est faire la requête puis retraiter les résultats au niveau du code avec votre langage de programmation, en repoussant encore plus le délai de réponse à votre utilisateur, soit une expérience dégradée pour ce dernier. 😒
C'est à ce moment qu'entrent en jeu les moteurs de recherches 🤠.
Mais avant de faire des manipulations poussées et toute sorte de test de scoring, il convient de préparer son index. Pour les moteurs de recherches on ne parle pas de base de données mais d'index. En d'autre termes, d'injecter des données dans le moteur pour qu'il puisse les classer et les scorer.
Nous allons utiliser Elastic Search en tant que moteur de recherche, c'est un outil qui a fait ses preuves et qui est utilisé aujourd'hui par Cisco, Adobe, BMW, Yelp, etc...
Dans l'ordre nous allons:
Nous allons commencer par créer nos serveurs grâce à Docker. Ici, je pars du principe que vous avez déjà docker et docker-compose d'installé sur votre machine. Si ce n'est pas le cas, je vous prie de commencer par là et de reprendre ensuite la lecture de cet article. Je pars aussi du principe que vous êtes sur un système qui permet de bosser rapidement avec docker et bash, donc un système Linux ou Darwin (Mac OS).
Pour aller vite, sachez que les développeurs d'elastic search ont eux même mis en place un repo qui permet la création rapide d'une stack docker disponible à cette adresse
Si vous voulez lire l'article associé à ce repository, le voici .
Cependant, dans cet article, la configuration est découpée en plusieurs blocs rendant tout cela difficilement lisible. Aussi je vous recommande de faire un pull du repo et de passer directement à la configuration de votre fichier .env.
# Project namespace (defaults to the current folder name if not set)
#COMPOSE_PROJECT_NAME=myproject
# Password for the 'elastic' user (at least 6 characters)
ELASTIC_PASSWORD=changeme
# Password for the 'kibana_system' user (at least 6 characters)
KIBANA_PASSWORD=changeme
# Version of Elastic products
STACK_VERSION=8.7.1
# Set the cluster name
CLUSTER_NAME=docker-cluster
# Set to 'basic' or 'trial' to automatically start the 30-day trial
LICENSE=basic
#LICENSE=trial
# Port to expose Elasticsearch HTTP API to the host
ES_PORT=9200
# Port to expose Kibana to the host
KIBANA_PORT=5601
# Increase or decrease based on the available host memory (in bytes)
ES_MEM_LIMIT=1073741824
KB_MEM_LIMIT=1073741824
LS_MEM_LIMIT=1073741824
# SAMPLE Predefined Key only to be used in POC environments
ENCRYPTION_KEY=c34d38b3a14956121ff2170e5030b471551370178f43e5626eec58b04a30fae2
Modifier les mots de passe dans le fichier .env en replaçant les occurences de changeme par quelque chose de votre choix.
Nous allons maintenant démarrer nos containers.
sudo docker-compose up -d
Une fois votre container démarré, votre elastic search est lancé, mais en HTTPS !
Je vais créer un index avec 2 shards.
Les shards pour faire simple sont des points d'entrées vers les données. Splitter un index en deux shards permet de les parcourir simultanément (si votre disque dur le permet).
⚠️ Attention un shard n'est pas un cluster, d'ailleurs si vous utilisez un cluster, sachez que vos shards seront répartis sur ces derniers. C'est à dire qu'ils ne seront pas multipliés par le nombre d'instance.
👉 Le fait de passer par un faux certificat risque de poser problème à curl, mais nous allons forcer les appels grâce au flag insecure.
👉 L'utilisation d'un user/password a une incidence sur comment vous allez requêter le service:
curl --insecure -X PUT \
-u elastic:<mot de passe> \
https://localhost:9200/<nom de votre index> \
-H 'Content-Type: application/json' \
-d '{"settings":{"number_of_shards": 2}}' -v
Si jamais vous vous êtes trompé dans le nom, vous pouvez toujours supprimer cet index avec:
curl --insecure -X DLETE \
-u elastic:<mot de passe> \
https://localhost:9200/<nom de votre index> -v
Vous pouvez aussi bien utiliser Postman pour le faire. Cependant, n'ayant pas de raccourci --user, vous devrez utiliser un header 'Authorization' avec en value 'Basic [base64 de username:password]'.
Pour obtenir votre base64, vous pouvez utiliser la console, ou ce site .
echo -n "username:password" | base64
Commençons par télécharger un dataset. J'ai choisi les catégories d'articles du Huffington Post de 2012 à 2022. Rendez-vous ici pour télécharger le dataset .
Décompressez cela dans un dossier et vous obtiendrez le fichier:
News_Category_Dataset_v3.json
Maintenant que vous avez votre index Elastic Search et votre jeu de données, il ne reste plus qu'à y injecter les données.
Vous pouvez créer une plus petite version du dataset pour commencer ce script, cela vous permettra de faire des tests au lieu de vous farcir les 209 000 lignes du dataset.
Nous allons batcher la lecture de ce fichier en faisant de chacun de ces JSON en appels curl.
Pour cela, nous avons besoin de bash, donc je crée un fichier 'start_index.sh' :
url="https://localhost:9200/"
index_name="<nom de votre index>"
username=elastic
pwd=<votre mot de passe>
input="./News_Category_Dataset_v3.json"
echo "Start indexing data"
index_path=$(echo "${url}${index_name}/_doc")
credentials=$(echo -n "${username}:${pwd}" | base64)
while IFS= read -r line
do
echo "\nPushing new line..."
curl --insecure -X POST $index_path -H 'Content-Type: application/json' -H "Authorization: Basic ${credentials}" -d "$line" -v
done < "$input"
Remplacez ce dont vous avez besoin.
Et vous pouvez lancer cela en faisant:
sh start-index.sh
Vous laissez tourner car ça risque d'être long en fonction de la taille du dataset. ⌚
Une fois que vous avez nourri votre Elastic Search 🍚, vous pouvez le requêter:
curl --insecure -X GET 'https://localhost:9200/<nom de votre index>/_search' \
-u <username>:<password> \
-H 'Content-Type: application/json' \
-d '{
"query": {
"query_string": {
"query": "Obama"
}
}
}'
Pour que ce soit plus lisible depuis la console vous pouvez | jq à la fin, à condition que vous ayez jq.
Idem, remplacez ce dont vous avez besoin et n'hésitez pas à utiliser Postman.
On obtient:
# ...
"_id": "EQbHQosBiMuykQNzVA3o",
"_score": 8.201126,
"_source": {
"category": "POLITICS",
"headline": "Team Obama",
"authors": "Jeff Danziger, ContributorPolitical cartoonist syndicated by the NYTimes worldwide",
"link": "https://www.huffingtonpost.com/entry/team-obama_1_b_6125962.html",
"short_description": "Team Obama",
"date": "2014-11-08"
}
},
{
"_index": "news",
"_id": "6gfQQosBiMuykQNzlQiE",
"_score": 7.803393,
"_source": {
"category": "STYLE & BEAUTY",
"headline": "White House Tree Lighting Photos: Michelle Obama & Family Cozy Up! (PHOTOS, VIDEO)",
"authors": "Jessica Misener",
"link": "https://www.huffingtonpost.com/entry/white-house-tree-lighting-michelle-obama-malia-sasha-photos_us_5b9c97dde4b03a1dcc802043",
"short_description": "Plus... President Obama sings!",
"date": "2012-12-07"
}
},
{
"_index": "news",
"_id": "CAXEQosBiMuykQNzgsCL",
"_score": 7.5903983,
"_source": {
"category": "POLITICS",
"headline": "Obama and the 'N' Word",
"authors": "Jonathan Richards, ContributorCartoonist",
"link": "https://www.huffingtonpost.com/entry/obama-and-the-n-word_b_7646922.html",
"short_description": "Obama and the 'N' Word",
"date": "2015-06-23"
}
},
{
"_index": "news",
"_id": "8gS4QosBiMuykQNzkXdu",
"_score": 7.5273933,
"_source": {
"category": "COMEDY",
"headline": "Conan O’Brien Zings Donald Trump In Spoof Barack Obama Netflix Trailer",
"authors": "Lee Moran",
"link": "https://www.huffingtonpost.com/entry/conan-barack-obama-netflix-spoof-stand-up-special_us_5ab22b23e4b008c9e5f2ce5a",
"short_description": "Fake Obama brings the gags.",
"date": "2018-03-21"
}
},
{
"_index": "news",
"_id": "zAS9QosBiMuykQNzIvVo",
"_score": 7.5273933,
"_source": {
"category": "WOMEN",
"headline": "Obama Spent His First Week In Office Championing Women's Rights To Equal Pay",
"authors": "Jenavieve Hatch",
"link": "https://www.huffingtonpost.com/entry/obama-spent-his-first-week-in-office-championing-womens-rights-to-equal-pay_us_588f7aa5e4b02772c4e8105f",
"short_description": "The Obama Foundation looks back.",
"date": "2017-01-30"
}
}
]
}
}
Et voilà votre index est configuré et contient des données. Vous pouvez maintenant y effectuer des requêtes et tester toute sorte de classement et de tris à votre guise.
Développeur passionné depuis plus de 20 ans, j'ai une appétence particulière pour les défis techniques et changer de technologie ne me fait pas froid aux yeux.
Nous utilisons des cookies sur ce site pour améliorer votre expérience d'utilisateur.