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

368 lines
8.5 KiB
Markdown

# MeiliSearch Search Engine Template
## Overview
MeiliSearch is a fast, typo-tolerant search engine for your applications and websites.
## Quick Start
```bash
# Create docker-compose.yml with the content below
docker-compose up -d
```
## Docker Compose
```yaml
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**:
```bash
openssl rand -base64 32
```
2. **Deploy**:
```bash
docker-compose up -d
```
3. **Verify Installation**:
```bash
curl http://localhost:7700/health
```
4. **Access**: Open http://localhost:7700 for basic info
## API Usage
### Index Creation
```bash
# 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
```bash
# 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
```bash
# 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
```bash
# 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
```bash
# 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)
```yaml
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
```bash
# 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
```yaml
# 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
```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
```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
```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
```bash
# Product search with filters
curl 'http://localhost:7700/indexes/products/search?q=laptop&filter=price < 1000 AND category = "electronics"'
```
### Document Search
```bash
# Full-text document search
curl 'http://localhost:7700/indexes/documents/search?q=machine learning&limit=20'
```
### User Search
```bash
# 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
```bash
# 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
```bash
# 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
```bash
# 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
```bash
# 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
```bash
# 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'
```