Files
lasuite-docs/docs/search.md
T
2025-11-03 15:25:15 +01:00

6.3 KiB

Setup full-text search with Find

This configuration will enable the fulltext search feature for Docs :

  • Each save on core.Document or core.DocumentAccess will trigger the indexer
  • The api/v1.0/documents/search/ will work as a proxy with the Find API for fulltext search.

Create an index service for Docs

In Find application Django admin configure a Service with these settings

  • Name: docs
    request.auth.name of the Docs application.

  • Client id: impress
    Name of the token audience or client_id of the Docs application.

Configure settings

Add those Django settings to enable the feature.

SEARCH_INDEXER_CLASS="core.services.search_indexers.FindDocumentIndexer"
SEARCH_INDEXER_COUNTDOWN=10  # Debounce delay in seconds for the index calls.

# Indexation endpoint.
SEARCH_INDEXER_SECRET=my-token-from-the-find-impress-service
# The token from service "docs" of Find application.
SEARCH_INDEXER_URL="http://app-find:8000/api/v1.0/documents/index/"

# Search endpoint. Uses the OIDC token for authentication
SEARCH_INDEXER_QUERY_URL="http://app-find:8000/api/v1.0/documents/search/"

We also need to enable the OIDC Token refresh or the authentication will fail quickly.

# Store OIDC tokens in the session
OIDC_STORE_ACCESS_TOKEN = True  # Store the access token in the session
OIDC_STORE_REFRESH_TOKEN = True  # Store the encrypted refresh token in the session
OIDC_STORE_REFRESH_TOKEN_KEY = "your-32-byte-encryption-key=="  # Must be a valid Fernet key (32 url-safe base64-encoded bytes)

Installation with docker compose

First see compose installation documentation.

1. Postgresql

Find uses PostgreSQL as its database.

If you are using the example provided, you need to generate a secure key for DB_PASSWORD and set it in env.d/find_postgresql.

# Postgresql db container configuration
POSTGRES_DB=find
POSTGRES_USER=dinum
POSTGRES_PASSWORD=pass

# App database configuration
DB_HOST=postgresql-find
DB_NAME=find
DB_USER=dinum
DB_PASSWORD=<password>
DB_PORT=5432

And the service can be configured in compose.yml.

  postgresql-find:
    image: postgres:15
    env_file:
      - env.d/development/find_postgresql
      - env.d/development/find_postgresql.local
    ports:
      - "15433:5432"

2. Opensearch

Find uses Opensearch as its indexation database.

If you are using the example provided, you need to generate a secure key for OPENSEARCH_INITIAL_ADMIN_PASSWORD and OPENSEARCH_PASSWORD to set them in env.d/opensearch.

OPENSEARCH_INITIAL_ADMIN_PASSWORD=find
OPENSEARCH_PASSWORD=find
OPENSEARCH_USE_SSL=true  # false in Development mode

# Dashboard
OPENSEARCH_HOSTS=["http://opensearch:9200"]
DISABLE_SECURITY_DASHBOARDS_PLUGIN=false  # true in Development mode

And the service & dashboard can be configured in compose.yml.

  opensearch:
    user: ${DOCKER_USER:-1000}
    image: opensearchproject/opensearch:latest
    env_file:
      - env.d/development/opensearch
      - env.d/development/opensearch.local
    environment:
      - discovery.type=single-node
      - plugins.security.disabled=true
      - plugins.security.ssl.http.enabled=false
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - ./data/opensearch:/usr/share/opensearch/data
    ports:
      - "9200:9200"
      - "9600:9600"

  opensearch-dashboards:
    image: opensearchproject/opensearch-dashboards:latest
    ports:
      - "5601:5601"
    env_file:
      - env.d/development/opensearch
      - env.d/development/opensearch.local
    depends_on:
      - opensearch

3. Find (dev mode)

If you are using the example provided, you need to generate a secure key for OIDC_RS_CLIENT_SECRET and set it in env.d/find.

# Django
DJANGO_ALLOWED_HOSTS=*
DJANGO_SECRET_KEY=ThisIsAnExampleKeyForDevPurposeOnly
DJANGO_SETTINGS_MODULE=find.settings
DJANGO_SUPERUSER_PASSWORD=admin

# Python
PYTHONPATH=/app

# find settings

# Backend url
FIND_BASE_URL="http://localhost:9072"

# OIDC
OIDC_OP_URL=http://localhost:8083/realms/impress
OIDC_OP_INTROSPECTION_ENDPOINT=http://nginx:8083/realms/impress/protocol/openid-connect/token/introspect

OIDC_OP_JWKS_ENDPOINT=http://nginx:8083/realms/impress/protocol/openid-connect/certs
OIDC_OP_AUTHORIZATION_ENDPOINT=http://localhost:8083/realms/impress/protocol/openid-connect/auth
OIDC_OP_TOKEN_ENDPOINT=http://nginx:8083/realms/impress/protocol/openid-connect/token
OIDC_OP_USER_ENDPOINT=http://nginx:8083/realms/impress/protocol/openid-connect/userinfo

OIDC_RP_CLIENT_ID=impress
OIDC_RP_CLIENT_SECRET=ThisIsAnExampleKeyForDevPurposeOnly
OIDC_RP_SIGN_ALGO=RS256
OIDC_RP_SCOPES="openid email"

OIDC_REDIRECT_ALLOWED_HOSTS=["http://localhost:8083", "http://localhost:3000"]
OIDC_AUTH_REQUEST_EXTRA_PARAMS={"acr_values": "eidas1"}

# OIDC Resource server
OIDC_RS_SCOPES="openid"
OIDC_RS_CLIENT_ID=impress
OIDC_RS_CLIENT_SECRET=ThisIsAnExampleKeyForDevPurposeOnly
OIDC_RS_SIGN_ALGO=RS256

OIDC_RS_BACKEND_CLASS="core.authentication.FinderResourceServerBackend"

And Find can be configured in compose.yml.

  find-dev:
    user: ${DOCKER_USER:-1000}
    image: find:backend-development
    environment:
      - PYLINTHOME=/app/.pylint.d
      - DJANGO_CONFIGURATION=Development
    env_file:
      - env.d/development/find
      - env.d/development/find.local
      - env.d/development/find_postgresql
      - env.d/development/find_postgresql.local
      - env.d/development/opensearch
      - env.d/development/opensearch.local
    ports:
      - "9071:8000"
    volumes:
      - ../find/src/backend:/app
      - ../find/data/static:/data/static
    depends_on:
        - find_postgresql
        - opensearch
        - redis

Ports (dev defaults)

Port Service
3000 Next.js
8071 Django (main)
9071 Django (Find)
4444 Y-Provider
8080 Keycloak
8083 Nginx proxy
9000/9001 MinIO
15432 PostgreSQL (main)
15433 PostgreSQL (Find)
5433 PostgreSQL (Keycloak)
1081 MailCatcher
9200 Opensearch
9600 Opensearch admin
5601 Opensearch dashboard