В этой статье я покажу как включить полнотекстовый поиск на вашем NextCloud сервере. Для этого используется elasticsearch.
Установка дополнительных пакетов
Для работы полнотекстового поиска необходимо использовать Elasticsearch, а он в свою очередь использует Java. Поэтому для начала установим Java:
# apt install openjdk-11-jre
Так как официальный репозиторий Elasticsearch не доступен на территории россии, то добавляем зеркало репозитория от Yandex. Я использую 7 версию Elasticsearch. Для установки выполним следующее:
# nano /etc/apt/sources.list.d/elastic.list deb [trusted=yes] https://mirror.yandex.ru/mirrors/elastic/7/ stable main # apt install elasticsearch # systemctl daemon-reload # systemctl enable elasticsearch
Перед запуском нужно ограничить elasticsearch в памяти, для этого отредактируем конфиг /etc/elasticsearch/jvm.options. В этом примере я указал лимит в 2 GB:
# nano /etc/elasticsearch/jvm.options -Xms2g -Xmx2g
Теперь можем и включить elasticsearch, не боясь что его прибьёт OOM Killer:
# systemctl start elasticsearch # systemctl status elasticsearch ● elasticsearch.service - Elasticsearch Loaded: loaded (/lib/systemd/system/elasticsearch.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2024-02-26 16:46:05 MSK; 15s ago Docs: https://www.elastic.co Main PID: 4588 (java) CPU: 24.208s CGroup: /system.slice/elasticsearch.service ├─4588 /usr/share/elasticsearch/jdk/bin/java -Xshare:auto -Des.networkaddress.cache.ttl=60 -Des.networkaddress.cache.negative.ttl=10 -XX:+AlwaysPreTou> └─4782 /usr/share/elasticsearch/modules/x-pack-ml/platform/linux-x86_64/bin/controller
Для того чтобы полнотекстовый поиск мог обрабатывать pdf файлы нужно установить плагин ingest-attachment. Но так как официальный репозиторий не доступен, то я вручную скачал его с помощью этой ссылки:
Измените версию плагина, если у вас другая версия elasticsearch.
Затем загрузим этот архив на сервер и установим:
# /usr/share/elasticsearch/bin/elasticsearch-plugin install file:////root/ingest-attachment-7.17.9.zip Плагин потребует дополнительных разрешений, соглашаемся
Ещё кое-что донастроим в elasticsearch. Для этого отредактируем конфиг /etc/elasticsearch/elasticsearch.yml:
# nano /etc/elasticsearch/elasticsearch.yml xpack.security.enabled: true discovery.type: single-node # systemctl restart elasticsearch
Теперь запустим генерацию паролей для elasticsearch:
# /usr/share/elasticsearch/bin/elasticsearch-setup-passwords auto
Нужно записать все пароли, но нам понадобится только один — от пользователя elastic! Проверим работу:
# curl -X GET "http://localhost:9200" -u elastic:PASSWORD { "name" : "<имя_вашего_хоста>", "cluster_name" : "elasticsearch", "cluster_uuid" : "LyGDmy-9Sw6IVRNSGnc7ug", "version" : { "number" : "7.17.9", "build_flavor" : "default", "build_type" : "deb", "build_hash" : "ef48222227ee6b9e70e502f0f0daa52435ee634d", "build_date" : "2023-01-31T05:34:43.305517834Z", "build_snapshot" : false, "lucene_version" : "8.11.1", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search" }
Настройка полнотекстового поиска
Дальше переходим в web-интерфейс NextCloud. И устанавливаем следующие приложения в NextCloud:
- Full text search;
- Full text search — Elasticsearch Platform;
- Full text search — Files.
После установки приложений, переходим в параметры сервера NextCloud и настраиваем полнотекстовый поиск:
- Платформа — Elasticsearch;
- Значок навигации — Ставим флаг;
- Строка подключения:
http://elastic:PASSWORD@localhost:9200/
; - Обязательно пишем имя индекса — my_index (иначе получим ошибку);
- Анализатор токенов — standard;
- И настраиваем правила индексации файлов.
Донастройка полнотекстового поиска
Возвращаемся в консоль сервера для проверки работы полнотекстового поиска и создания службы поиска.
Временно разрешим заходить под www-data:
# nano /etc/passwd www-data:x:33:33:www-data:/var/www:/bin/bash
Выполняем тест настроек:
# su www-data -c 'php /var/www/nextcloud/occ fulltextsearch:test' .Testing your current setup: Creating mocked content provider. ok Testing mocked provider: get indexable documents. (2 items) ok Loading search platform. (Elasticsearch) ok Testing search platform. ok Locking process ok Removing test. ok Pausing 3 seconds 1 2 3 ok Initializing index mapping. ok Indexing generated documents. ok Pausing 3 seconds 1 2 3 ok Retreiving content from a big index (license). (size: 32386) ok Comparing document with source. ok Searching basic keywords: - 'test' (result: 1, expected: ["simple"]) ok - 'document is a simple test' (result: 2, expected: ["simple","license"]) ok - '"document is a test"' (result: 0, expected: []) ok - '"document is a simple test"' (result: 1, expected: ["simple"]) ok - 'document is a simple -test' (result: 1, expected: ["license"]) ok - 'document is a simple +test' (result: 1, expected: ["simple"]) ok - '-document is a simple test' (result: 0, expected: []) ok - 'document is a simple +test +testing' (result: 1, expected: ["simple"]) ok - 'document is a simple +test -testing' (result: 0, expected: []) ok - 'document is a +simple -test -testing' (result: 0, expected: []) ok - '+document is a simple -test -testing' (result: 1, expected: ["license"]) ok - 'document is a +simple -license +testing' (result: 1, expected: ["simple"]) ok Updating documents access. ok Pausing 3 seconds 1 2 3 ok Searching with group access rights: - 'license' - [] - (result: 0, expected: []) ok - 'license' - ["group_1"] - (result: 1, expected: ["license"]) ok - 'license' - ["group_1","Group_2"] - (result: 1, expected: ["license"]) ok - 'license' - ["group_3","Group_2"] - (result: 1, expected: ["license"]) ok - 'license' - ["group_3"] - (result: 0, expected: []) ok Searching with share rights: - 'license' - notuser - (result: 0, expected: []) ok - 'license' - User number_2 - (result: 1, expected: ["license"]) ok - 'license' - User3 - (result: 1, expected: ["license"]) ok - 'license' - User@4 - (result: 1, expected: ["license"]) ok Removing test. ok Unlocking process ok
Выполняем первое индексирование:
# su www-data -c 'php /var/www/nextcloud/occ fulltextsearch:index' Options: [] Memory: 39 MB ┌─ Indexing ──── │ Action: indexDocument │ Provider: Files Account: username │ Document: 242 │ Info: httpd/unix-directory │ Title: │ Content size: 0 │ Chunk: 1/1 │ Progress: all/2 └── ┌─ Results ──── │ Result: 50/50 │ Index: files:242 │ Status: ok │ Message: {"_index":"my_index","_type":"_doc","_id":"files:242","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":54,"_pr │ imary_term":1} │ └── ┌─ Errors ──── │ Error: 0/0 │ Index: │ Exception: │ Message: │ │ └── ## x:first result ## c/v:prec/next result ## b:last result ## f:first error ## h/j:prec/next error ## d:delete error ## l:last error ## q:quit ## p:pause
Теперь можем проверить полнотекстовый поиск в web-интерфейсе NextCloud.
—> Дополнительные команды, которые могут пригодиться для тестирования и ручной индексации
su www-data -c 'php /var/www/nextcloud/occ fulltextsearch:test' su www-data -c 'php /var/www/nextcloud/occ fulltextsearch:index' su www-data -c 'php /var/www/nextcloud/occ fulltextsearch:live' su www-data -c 'php /var/www/nextcloud/occ fulltextsearch:index "{\"user\":\"username\"}"' su www-data -c 'php /var/www/nextcloud/occ fulltextsearch:document:platform files 1026437 --content' su www-data -c 'php /var/www/nextcloud/occ fulltextsearch:reset' su www-data -c 'php /var/www/nextcloud/occ fulltextsearch:check'
Отключим возможность подключаться под пользователем www-data:
# nano /etc/passwd www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
Теперь нам нужно настроить индексацию на лету, для этого создаём службу systemd:
# nano /etc/systemd/system/fulltextsearch_nextcloud.service [Unit] Description=Elasticsearch Worker for Nextcloud Fulltext Search After=network.target [Service] User=www-data Group=www-data WorkingDirectory=/var/www/nextcloud ExecStart=/usr/bin/php /var/www/nextcloud/occ fulltextsearch:live -q ExecStop=/usr/bin/php /var/www/nextcloud/occ fulltextsearch:stop Nice=19 Restart=always [Install] WantedBy=multi-user.target
Запустим созданную службу:
# systemctl daemon-reload # systemctl enable fulltextsearch_nextcloud # systemctl start fulltextsearch_nextcloud # systemctl status fulltextsearch_nextcloud ● fulltextsearch_nextcloud.service - Elasticsearch Worker for Nextcloud Fulltext Search Loaded: loaded (/etc/systemd/system/fulltextsearch_nextcloud.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2024-02-26 17:26:30 MSK; 16s ago Main PID: 9684 (php) CPU: 190ms CGroup: /system.slice/fulltextsearch_nextcloud.service └─9684 /usr/bin/php /var/www/nextcloud/occ fulltextsearch:live -q
Теперь можете создать несколько текстовых файлов и проверить работу полнотекстового поиска. Или можете загрузить pdf файлы, полнотекстовый поиск должен работать и с ними.
Итог
Для работы полнотекстового поиска серверу NextCloud нужен elasticsearch и плагин ingest-attachment. А им, в свою очередь нужна Java. В статье я продемонстрировал как всё это установить, настроить, и создать службу полнотекстового поиска, которая бы работала на лету.