В этой статье я покажу как включить полнотекстовый поиск на вашем 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 файлы, полнотекстовый поиск должен работать и с ними.

Если понравилась статья, подпишись на мой канал в VK или Telegram.