NextcloudとElasticsearchを組み合わせて全文検索をする

Tips
2019年10月02日 10:00

概要

私は、Nextcloudというオンラインストレージを使用しているのですが、NextcloudではElasticsearchという全文検索エンジンを使用することで、ファイルの内容に関する検索ができるようになります。

ここでは、NextcloudとElasticsearchを連携してNextcloudにアップロードされたファイルの内容を検索できるようにする方法を紹介します。

環境

  • Ubuntu 18.04
  • Nextcloud 16
  • Elasticsearch 6

Elasticsearchの準備

Elasticsearchをあらかじめインストールしておきます。

Elasticsearchのインストール方法はいろいろなところで紹介されているので、ここでは詳しく説明しません。

NextcloudとElasticsearchを連携する時には、Elasticsearchの方に「ingest-attachment」というプラグインをインストールする必要があります。

ingest-attachmentのインストールは、elasticsearch-pluginというコマンドを使用します。
elasticsearch-pluginは、私の場合は/usr/share/elasticsearch/bin/にありました。

次のコマンドでインストールできます。

elasticsearch-plugin install ingest-attachment

これでElasticsearchの準備は完了です。

Nextcloudの準備

Nextcloudには、管理者アカウントでログインしてアプリをインストールします。

アプリは、次のものをインストールします。

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

これらのアプリの設定は、設定画面の全文検索というところから行います。
設定として、Elasticsearchのアドレスを設定しておきましょう。

インデックスの作成

アプリをインストールしたら、Elasticsearchにファイルを登録します。
ここでいうファイルの登録は、すでにNextcloudにアップロードされているファイルをElasticsearchに登録するということです。

ファイルの登録は、Nextcloudをインストールしたサーバからコマンドを実行して行います。

次のコマンドで登録します。

sudo -u www-data php ./occ fulltextsearch:index

www-dataはユーザ名なので、それぞれの環境にあった値に変えてください。

登録には、時間がかかります。私の場合、約200GBの使用量で3時間ほどかかりました。

これで、登録は終わりました。

常駐サービスの登録

すでにあるファイルを登録するのは、上記のコマンドでできるのですが新たにアップロードしたファイルは自動で登録されません。

そこで、アップロードしたファイルを監視し自動で登録するサービスをサーバに登録し、自動で起動するようにします。

今回は、systemdを使って自動起動するサービスを作成します。
/etc/systemd/system/という場所に、nextcloud-fulltext-elasticsearch-worker.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

phpやNextcloudの場所によって、内容を変える必要があります。

次に、systemctlコマンドを使って自動起動の設定、起動をします。

sudo systemctl daemon-reload
sudo systemctl enable nextcloud-fulltext-elasticsearch-worker.service
sudo systemctl start nextcloud-fulltext-elasticsearch-worker.service

これで、サーバの起動時に自動で監視を始め、変更があったら自動でElasticsearchに登録するようになりました。

さいごに

すでにあるファイルの量にもよりますが、結構時間がかかる処理なので、時間がある時にやるといいでしょう。