Recherche plein-texte avec Nextcloud et Elasticsearch

 

Nous allons vous présenter dans cet article la recherche plein texte (ou Full-Text Search) sur une instance Nextcloud. Concrètement, il s'agit de rechercher un mot bien précis dans l'ensemble de vos fichiers. 📂

Le fonctionnement est le suivant : les mots contenus dans les documents sont indexés dans une base Elasticsearch, et lors de la recherche, le moteur se basera sur cet index.

Prérequis

Dans le cadre de cette procédure, vous aurez besoin d'une instance Nextcloud opérationnelle (testé avec la version 22.2.3).

L'indexation se fera avec Elasticsearch. Nous sommes sous Debian 10.

Installation d'Elasticsearch

J'ai remonté certains bugs (en v6) que je n'ai pas rencontrés en v7. C'est pourquoi je vous conseille d'utiliser la version 7.

Tout d'abord, installer Java :

apt-get update
apt-get install apt-transport-https default-jdk

Vérifier que Java est bien installé :

java -version

On installe la clé GPG et la source APT :

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list

Puis on installe le paquet :

apt-get update
apt-get install elasticsearch

Activer le service au démarrage :

systemctl enable elasticsearch
systemctl start elasticsearch

Pour consulter la version d'Elasticsearch :

curl -XGET 'http://localhost:9200'

Si vous souhaitez ajouter des fichiers PDF à votre index, vous devez installer un plugin :

sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install ingest-attachment

Et redémarrer Elasticsearch :

systemctl restart elasticsearch

Par défaut, Elasticsearch écoute sur le port 9200.

Installation de l'extension sur Nextcloud

Vous aurez ainsi besoin de 3 applications depuis le store d'applications Nextcloud :

  • Full text search
  • Full text search - Files
  • Full text search - Elasticsearch Platform

Une fois ces 3 applications installées, aller dans les paramètres, puis "Recherche de texte intégrale", ou "Full text search".

  • Plateforme de recherche : Elasticsearch
  • Cochez l'icône de navigation de façon à pouvoir accéder au moteur de recherche depuis interface
  • Adresse du Servlet : http://localhost:9200
  • Index : exemple : Aukfood_index

Laissez le reste par défaut, au niveau de la rubrique "Fichiers", cochez ce que vous souhaitez.

Indexation

Lancer l'indexation une première fois :

cd /chemin/vers/votre/instance/nextcloud
sudo -u nextcloud php occ fulltextsearch:index

Plus il y a de contenu, plus cela prend du temps. Il est conseillé de lancer cela dans un screen.

Une fois cela fait, vous pouvez commencer à faire une première recherche. Pour les fois suivantes, on peut créer un service, qui indexe les fichiers à chaque modification :

Dans /etc/systemd/system/nextcloud-fulltext-elasticsearch-worker.service (en adaptant le contenu en fonction de votre installation) :

[Unit]
Description=Elasticsearch Worker for Nextcloud Fulltext Search
After=network.target mysql.service
Requires=mysql.service

[Service]
User=nextcloud
Group=nextcloud
WorkingDirectory=/chemin/vers/votre/instance/nextcloud
ExecStart=/usr/bin/php /chemin/vers/votre/instance/nextcloud/occ fulltextsearch:live -q
ExecStop=/usr/bin/php /chemin/vers/votre/instance/nextcloud/occ fulltextsearch:stop
Nice=19
Restart=always

[Install]
WantedBy=multi-user.target

Activer le service et le démarrer :

systemctl enable nextcloud-fulltext-elasticsearch-worker.service
systemctl start nextcloud-fulltext-elasticsearch-worker.service
systemctl status nextcloud-fulltext-elasticsearch-worker.service

Cependant sous Nextcloud 22, il est possible que la recherche à travers l'interface graphique ne fonctionne pas bien, c'est pourquoi je vous conseille de désactiver l'application "Circles". Voir ici : https://help.nextcloud.com/t/fulltextsearch-not-working-after-upgrading-to-nc-22-including-apps/120660

Utilisation

Vous avez ainsi deux possibilités pour faire une recherche :

  • Par ligne de commandes
  • Par l'interface graphique

Je sais d'avance ce que vous allez choisir ! 😁 Mais je vais quand même vous montrer comment on fait via la CLI, cela vous permettra de diagnostiquer si la synchronisation Elasticsearch x Nextcloud fonctionne bien.

Taper la commande suivante :

curl "http://localhost:9200/aukfood_index/_search?q=test"

Avec test le mot à chercher, attention à bien remplacer aukfood_index par le nom de votre index.

Et pour l'interface graphique, cliquer sur l'icône "Search" qui vient d'apparaître sur le Dock d'applications :

Et voilà ! Vous savez à présent comment faire une recherche de mot avec Nextcloud et Elasticsearch !