mirror of
https://github.com/Dvorinka/Containr.git
synced 2026-06-03 20:12:58 +00:00
368 lines
8.5 KiB
Markdown
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'
|
|
```
|