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 !