mirror of
https://github.com/Dvorinka/Containr.git
synced 2026-06-03 20:12:58 +00:00
8.5 KiB
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 authenticationMEILI_ENV: Environment (development/production)MEILI_DB_ENGINE: Database engine (rocksdb)MEILI_DB_PATH: Database storage pathMEILI_HTTP_ADDR: HTTP bind addressMEILI_SCHEDULE_SNAPSHOTS_ENABLED: Enable automatic snapshotsMEILI_SCHEDULE_SNAPSHOTS_INTERVAL: Snapshot interval in seconds
Setup Guide
-
Generate Master Key:
openssl rand -base64 32 -
Deploy:
docker-compose up -d -
Verify Installation:
curl http://localhost:7700/health -
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"
}
]'
Search
# 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
E-commerce Search
# Product search with filters
curl 'http://localhost:7700/indexes/products/search?q=laptop&filter=price < 1000 AND category = "electronics"'
Document Search
# Full-text document search
curl 'http://localhost:7700/indexes/documents/search?q=machine learning&limit=20'
User Search
# 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
Faceted Search
# 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'