Files
Containr/templates/meilisearch.md
T
2026-04-10 12:02:36 +02:00

8.5 KiB

MeiliSearch Search Engine Template

Overview

MeiliSearch is a fast, typo-tolerant search engine for your applications and websites.

Quick Start

# Create docker-compose.yml with the content below
docker-compose up -d

Docker Compose

version: '3.8'

services:
  meilisearch:
    image: getmeili/meilisearch:v1.8
    container_name: meilisearch
    restart: unless-stopped
    ports:
      - "7700:7700"
    environment:
      - MEILI_MASTER_KEY=your-master-key-here
      - MEILI_ENV=production
      - MEILI_DB_ENGINE=rocksdb
      - MEILI_DB_PATH=/meili_data
      - MEILI_HTTP_ADDR=0.0.0.0:7700
      - MEILI_SCHEDULE_SNAPSHOTS_ENABLED=true
      - MEILI_SCHEDULE_SNAPSHOTS_INTERVAL=3600
      - MEILI_SNAPSHOT_DIR=/meili_data/snapshots
    volumes:
      - meilisearch-data:/meili_data
    networks:
      - meilisearch-network

volumes:
  meilisearch-data:

networks:
  meilisearch-network:
    driver: bridge

Environment Variables

  • MEILI_MASTER_KEY: Master key for API authentication
  • MEILI_ENV: Environment (development/production)
  • MEILI_DB_ENGINE: Database engine (rocksdb)
  • MEILI_DB_PATH: Database storage path
  • MEILI_HTTP_ADDR: HTTP bind address
  • MEILI_SCHEDULE_SNAPSHOTS_ENABLED: Enable automatic snapshots
  • MEILI_SCHEDULE_SNAPSHOTS_INTERVAL: Snapshot interval in seconds

Setup Guide

  1. Generate Master Key:

    openssl rand -base64 32
    
  2. Deploy:

    docker-compose up -d
    
  3. Verify Installation:

    curl http://localhost:7700/health
    
  4. Access: Open http://localhost:7700 for basic info

API Usage

Index Creation

# Create an index
curl -X POST 'http://localhost:7700/indexes' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer YOUR_MASTER_KEY' \
--data-binary '{
  "uid": "movies",
  "primaryKey": "id"
}'

Document Addition

# Add documents
curl -X POST 'http://localhost:7700/indexes/movies/documents' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer YOUR_MASTER_KEY' \
--data-binary '[
  {
    "id": 1,
    "title": "Carol",
    "poster": "https://image.tmdb.org/t/p/w1280/5KCVsktQcYFzvrxpJ9KsImA3QoI.jpg",
    "overview": "An aspiring photographer develops an intimate relationship with an older woman.",
    "release_date": "2015-11-20"
  },
  {
    "id": 2,
    "title": "Mad Max: Fury Road",
    "poster": "https://image.tmdb.org/t/p/w1280/kqjL17yufvn9OVLyXYpvtyrFfak.jpg",
    "overview": "In a post-apocalyptic wasteland, a woman rebels against a tyrannical ruler.",
    "release_date": "2015-05-15"
  }
]'
# Basic search
curl 'http://localhost:7700/indexes/movies/search?q=mad'

# Search with filters
curl 'http://localhost:7700/indexes/movies/search?q=carol&filter=release_date > 2015-01-01'

# Search with ranking
curl 'http://localhost:7700/indexes/movies/search?q=fury&rankingRules=typo,words,proximity,attribute,sort,exactness'

Configuration

Index Settings

# Configure search settings
curl -X PATCH 'http://localhost:7700/indexes/movies/settings' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer YOUR_MASTER_KEY' \
--data-binary '{
  "searchableAttributes": ["title", "overview"],
  "filterableAttributes": ["release_date"],
  "sortableAttributes": ["title", "release_date"],
  "rankingRules": [
    "typo",
    "words",
    "proximity",
    "attribute",
    "sort",
    "exactness"
  ],
  "stopWords": ["the", "a", "an"],
  "synonyms": {
    "wolverine": ["xmen", "logan"],
    "logan": ["wolverine", "xmen"]
  },
  "typoTolerance": {
    "enabled": true,
    "minWordSizeForTypos": 5,
    "disableOnWords": [],
    "disableOnAttributes": []
  }
}'

Searchable Attributes

# Set searchable attributes
curl -X PATCH 'http://localhost:7700/indexes/movies/settings/searchable-attributes' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer YOUR_MASTER_KEY' \
--data-binary '["title", "overview", "genre"]'

Reverse Proxy (Traefik)

labels:
  - "traefik.enable=true"
  - "traefik.http.routers.meilisearch.rule=Host(`search.yourdomain.com`)"
  - "traefik.http.routers.meilisearch.tls=true"
  - "traefik.http.routers.meilisearch.tls.certresolver=letsencrypt"
  - "traefik.http.services.meilisearch.loadbalancer.server.port=7700"

Backup Strategy

# Create snapshot
curl -X POST 'http://localhost:7700/snapshots' \
-H 'Authorization: Bearer YOUR_MASTER_KEY'

# List snapshots
curl 'http://localhost:7700/snapshots' \
-H 'Authorization: Bearer YOUR_MASTER_KEY'

# Restore from snapshot
curl -X POST 'http://localhost:7700/snapshots/restore' \
-H 'Authorization: Bearer YOUR_MASTER_KEY' \
--data-binary '{ "snapshotPath": "/meili_data/snapshots/snapshot-20231201-123456.ms" }'

Performance Optimization

# For better performance
environment:
  - MEILI_MAX_INDEXING_MEMORY=2G
  - MEILI_MAX_INDEXING_THREADS=4
  - MEILI_HTTP_PAYLOAD_SIZE_LIMIT=100MB
  - MEILI_DUMP_BATCH_SIZE=1000

# Resource limits
deploy:
  resources:
    limits:
      memory: 2G
      cpus: '2.0'
    reservations:
      memory: 1G
      cpus: '1.0'

Client Libraries

JavaScript

import { MeiliSearch } from 'meilisearch'

const client = new MeiliSearch({
  host: 'http://localhost:7700',
  apiKey: 'YOUR_MASTER_KEY'
})

// Search
const results = await client.index('movies').search('mad max')

// Add documents
await client.index('movies').addDocuments([
  { id: 1, title: 'Carol', overview: '...' }
])

Python

import meilisearch

client = meilisearch.Client("http://localhost:7700", "YOUR_MASTER_KEY")

# Search
results = client.index("movies").search("mad max")

# Add documents
client.index("movies").add_documents([
  {"id": 1, "title": "Carol", "overview": "..."}
])

PHP

use MeiliSearch\Client;

$client = new Client('http://localhost:7700', 'YOUR_MASTER_KEY');

// Search
$results = $client->index('movies')->search('mad max');

// Add documents
$client->index('movies')->addDocuments([
  ['id' => 1, 'title' => 'Carol', 'overview' => '...']
]);

Use Cases

# Product search with filters
curl 'http://localhost:7700/indexes/products/search?q=laptop&filter=price < 1000 AND category = "electronics"'
# Full-text document search
curl 'http://localhost:7700/indexes/documents/search?q=machine learning&limit=20'
# User directory search
curl 'http://localhost:7700/indexes/users/search?q=john&filter=department = "engineering"'

Security

  • Change default master key
  • Use HTTPS in production
  • Network access control
  • Regular backups
  • Monitor access logs

Monitoring

# Get stats
curl 'http://localhost:7700/stats' \
-H 'Authorization: Bearer YOUR_MASTER_KEY'

# Get index info
curl 'http://localhost:7700/indexes/movies/stats' \
-H 'Authorization: Bearer YOUR_MASTER_KEY'

# Get version
curl 'http://localhost:7700/version'

Troubleshooting

  • Search not working: Check index configuration
  • Performance issues: Monitor resource usage
  • Authentication errors: Verify master key
  • Data loss: Restore from snapshot

Maintenance

# Check logs
docker-compose logs -f meilisearch

# Restart service
docker-compose restart meilisearch

# Update image
docker-compose pull && docker-compose up -d

# Clean up old snapshots
find ./meilisearch-data/snapshots -name "*.ms" -mtime +7 -delete

Advanced Features

# Configure facets
curl -X PATCH 'http://localhost:7700/indexes/movies/settings/faceting' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer YOUR_MASTER_KEY' \
--data-binary '{
  "maxValuesPerFacet": 10,
  "facets": ["genre", "release_date"]
}'

# Search with facets
curl 'http://localhost:7700/indexes/movies/search?q=action&facets=genre,release_date'

Geosearch

# Add geo coordinates
curl -X POST 'http://localhost:7700/indexes/restaurants/documents' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer YOUR_MASTER_KEY' \
--data-binary '[
  {
    "id": 1,
    "name": "Nandos",
    "_geo": { "lat": 51.5064, "lng": -0.0741 }
  }
]'

# Geo search
curl 'http://localhost:7700/indexes/restaurants/search?q=nandos&filter=_geoRadius(51.5064, -0.0741, 2000)'

Search Analytics

# Get search analytics
curl 'http://localhost:7700/indexes/movies/search?q=test&analytics=true' \
-H 'Authorization: Bearer YOUR_MASTER_KEY'

# Get popular searches
curl 'http://localhost:7700/indexes/movies/searches/popular' \
-H 'Authorization: Bearer YOUR_MASTER_KEY'