Setting Up Nextcloud Fulltext Search With Elasticsearch

In this post, we will be setting up Fulltext Search on Nextcloud using nextcloud-aio container and Elasticsearch. For the purpose of this guide, we will be avoiding the use of the container mentioned in the official Nextcloud documentation as it executes processes as root, which is not ideal for many circumstances.

Procedure

1. Edit your Docker Compose file with the following configurations for nextcloud-aio container:

aio-fulltextsearch:
image: nextcloud/aio-fulltextsearch:latest
environment:
  - TZ=${TIMEZONE}
  - ES_JAVA_OPTS=-Xms512M -Xmx512M
  - bootstrap.memory_lock=true
  - cluster.name=nextcloud-aio
  - discovery.type=single-node
  - logger.org.elasticsearch.discovery=WARN
  - http.port=9200
  - xpack.license.self_generated.type=basic
  - xpack.security.enabled=false
volumes:
  - ./aio_elasticsearch:/usr/share/elasticsearch/data:rw
restart: unless-stopped
deploy:
  resources:
    limits:
      cpus: '6'
      memory: 8192m

This configuration provides an Elasticsearch platform to run the Fulltext Search in your Nextcloud instance.
The deploy block is just good practice; I was certainly overly generous here :D and you shall decide how much resources you’d like to allocate based on your host or VM config.

2. Create the required folders:

mkdir aio_elasticsearch
chown 1000:0 aio_elasticsearch

This will create a directory for your Elasticsearch data.

3. Run the modified Compose file:

docker compose up -d

Output:

CONTAINER ID   NAME                                CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O     PIDS
3d0ae49ee0d5   nextcloud-app-1                     8.23%     172MiB / 8GiB         2.10%     62.1MB / 9.34MB   0B / 0B       11
48e7c3b00ae8   nextcloud-redis-1                   0.59%     4.516MiB / 8GiB       0.06%     5.48MB / 34.1MB   0B / 0B       5
acf8cdf7147d   nextcloud-aio-fulltextsearch-1      0.39%     909.6MiB / 8GiB       11.10%    1.46kB / 0B       0B / 0B       83
12fa5273a92d   nextcloud-db-1                      0.64%     91.67MiB / 8GiB       1.12%     3.08MB / 27.4MB   0B / 0B       7

Now your nextcloud-aio container should take approximately 1GB of RAM while idle.

4. Install the necessary Nextcloud apps:

5. Enter your Elasticsearch server settings in Nextcloud’s Fulltext Search settings in the Admin area.

  • Search platform: http://aio-fulltextsearch:9200
  • Address of the Servlet: http://aio-fulltextsearch:9200

Link to screenshot

6. Test your set-up.

After installation and configuration of the necessary apps, we need to test if our setup works correctly. We can use Nextcloud’s OCC command line tool to do this.
If everything is set up correctly, you should see a series of ‘ok’ messages, and your files should now be indexed and searchable through Nextcloud’s Fulltext Search feature.

> $ docker exec -it -u 33 nextcloud-app-1 php occ fulltextsearch:check
Full text search 27.0.1
 
- Search Platform:
Elasticsearch 27.0.2 (Selected)
{
    "elastic_host": [
        "http://aio-fulltextsearch:9200"
    ],
    "elastic_index": "nextcloud-index",
    "fields_limit": "10000",
    "es_ver_below66": "0",
    "analyzer_tokenizer": "standard"
} 

- Content Providers:
Deck 1.10.0
[]
Files 27.0.1
{
    "files_local": "1",
    "files_external": "0",
    "files_group_folders": "0",
    "files_encrypted": "0",
    "files_federated": "0",
    "files_size": "20",
    "files_pdf": "1",
    "files_office": "1",
    "files_image": "0",
    "files_audio": "0",
    "files_chunk_size": "2"
}

And more importantly:

> $ docker exec -it -u 33 nextcloud-app-1 php 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' - user2 -  (result: 1, expected: ["license"]) ok  
 - 'license' - user3 -  (result: 1, expected: ["license"]) ok  
Removing test. ok  
Unlocking process ok

7. Index your files.

Lastly, if you’re coming from a NC version anterior to NC 24, you will need to run fulltextsearch:migration:24 before executing the index command:

docker exec -it -u 33 nextcloud-app-1 php occ fulltextsearch:migration:24
docker exec -it -u 33 nextcloud-app-1 php occ fulltextsearch:index

Enjoy!

You can now enjoy near-instant, effective text searching in Nextcloud with Elasticsearch powering the Fulltext Search feature!