NextCloud — полнотекстовый поиск

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

После установки приложений, переходим в параметры сервера NextCloud и настраиваем полнотекстовый поиск:

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

Сводка
NextCloud - полнотекстовый поиск
Имя статьи
NextCloud - полнотекстовый поиск
Описание
В этой статье я покажу как включить полнотекстовый поиск на вашем NextCloud сервере. Он для этого использует elasticsearch

Оставьте комментарий