# Meilisearch 安装和配置指南

## 概述

本项目使用 Meilisearch 作为全文搜索引擎，为文档内容提供快速准确的搜索功能。

## 安装方式

### 方式 1：使用 Docker（推荐）

项目已经配置了 `docker-compose.yml` 文件，可以快速启动 Meilisearch 服务。

#### 启动服务

```bash
# 启动 Meilisearch 服务
docker-compose up -d meilisearch

# 查看服务状态
docker-compose ps

# 查看服务日志
docker-compose logs -f meilisearch
```

#### 停止服务

```bash
# 停止服务
docker-compose down

# 停止服务并删除数据卷
docker-compose down -v
```

### 方式 2：本地安装（macOS）

使用 Homebrew 安装：

```bash
# 安装 Meilisearch
brew install meilisearch

# 启动服务
meilisearch --master-key="your-master-key-change-this-in-production"
```

### 方式 3：本地安装（Linux）

```bash
# 下载 Meilisearch
curl -L https://install.meilisearch.com | sh

# 启动服务
./meilisearch --master-key="your-master-key-change-this-in-production"
```

### 方式 4：本地安装（Windows）

从 [Meilisearch 官方网站](https://www.meilisearch.com/docs/learn/getting_started/installation) 下载 Windows 版本，然后运行：

```powershell
.\meilisearch.exe --master-key="your-master-key-change-this-in-production"
```

## Laravel Scout 安装

本项目使用 Laravel Scout 作为搜索抽象层。

### 安装依赖包

```bash
# 安装 Laravel Scout
composer require laravel/scout

# 安装 Meilisearch PHP SDK
composer require meilisearch/meilisearch-php http-interop/http-factory-guzzle

# 发布 Scout 配置文件
php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
```

安装完成后，会在 `config/scout.php` 中生成配置文件。

## 配置

### 主密钥（Master Key）

**重要**：在生产环境中，必须更改默认的主密钥！

1. 在 `docker-compose.yml` 中修改 `MEILI_MASTER_KEY` 环境变量
2. 在 `.env` 文件中更新 `MEILISEARCH_KEY` 配置

### 环境变量

在 `.env` 文件中配置以下变量：

```env
SCOUT_DRIVER=meilisearch
MEILISEARCH_HOST=http://127.0.0.1:7700
MEILISEARCH_KEY=your-master-key-change-this-in-production
```

### Scout 索引配置

在 `config/scout.php` 中已配置 documents 索引的设置：

```php
'meilisearch' => [
    'host' => env('MEILISEARCH_HOST', 'http://localhost:7700'),
    'key' => env('MEILISEARCH_KEY'),
    'index-settings' => [
        'documents' => [
            'filterableAttributes' => ['type', 'group_id', 'uploaded_by', 'conversion_status'],
            'sortableAttributes' => ['created_at', 'title', 'updated_at'],
            'searchableAttributes' => ['title', 'description', 'markdown_content'],
            'displayedAttributes' => ['id', 'title', 'description', 'type', 'group_id', 'uploaded_by', 'created_at', 'updated_at'],
        ],
    ],
],
```

**配置说明**：
- `filterableAttributes`: 可用于筛选的字段（类型、分组、上传者、转换状态）
- `sortableAttributes`: 可用于排序的字段（创建时间、标题、更新时间）
- `searchableAttributes`: 可搜索的字段（标题、描述、Markdown 内容）
- `displayedAttributes`: 搜索结果中返回的字段

## 验证安装

访问 Meilisearch 管理界面：

```
http://localhost:7700
```

或使用 curl 测试：

```bash
curl -X GET 'http://localhost:7700/health'
```

应该返回：

```json
{"status":"available"}
```

## 数据持久化

使用 Docker 方式时，Meilisearch 数据存储在 `storage/meilisearch` 目录中。

**注意**：请确保将此目录添加到 `.gitignore` 文件中，避免将索引数据提交到版本控制系统。

## 索引管理

### 查看所有索引

```bash
curl -X GET 'http://localhost:7700/indexes' \
  -H 'Authorization: Bearer your-master-key-change-this-in-production'
```

### 删除索引

```bash
curl -X DELETE 'http://localhost:7700/indexes/documents' \
  -H 'Authorization: Bearer your-master-key-change-this-in-production'
```

### 重建索引

在 Laravel 项目中运行：

```bash
# 清空所有索引
php artisan scout:flush "App\Models\Document"

# 重新导入所有文档
php artisan scout:import "App\Models\Document"
```

## 故障排除

### 服务无法启动

1. 检查端口 7700 是否被占用：
   ```bash
   lsof -i :7700
   ```

2. 查看 Docker 日志：
   ```bash
   docker-compose logs meilisearch
   ```

### 搜索不返回结果

1. 检查文档是否已索引：
   ```bash
   php artisan scout:import "App\Models\Document"
   ```

2. 验证索引配置：
   ```bash
   curl -X GET 'http://localhost:7700/indexes/documents/settings' \
     -H 'Authorization: Bearer your-master-key-change-this-in-production'
   ```

### 权限错误

确保 `storage/meilisearch` 目录有正确的写入权限：

```bash
chmod -R 775 storage/meilisearch
```

## 性能优化

### 生产环境配置

在生产环境中，建议：

1. 使用强密钥作为 `MEILI_MASTER_KEY`
2. 设置 `MEILI_ENV=production`
3. 配置适当的资源限制（CPU、内存）
4. 定期备份 `storage/meilisearch` 目录

### 索引优化

根据实际使用情况调整索引设置：

```php
// config/scout.php
'meilisearch' => [
    'index-settings' => [
        'documents' => [
            'filterableAttributes' => ['type', 'group_id', 'uploaded_by'],
            'sortableAttributes' => ['created_at', 'title'],
            'searchableAttributes' => ['title', 'description', 'markdown_content'],
            'rankingRules' => [
                'words',
                'typo',
                'proximity',
                'attribute',
                'sort',
                'exactness',
            ],
        ],
    ],
],
```

## 更多信息

- [Meilisearch 官方文档](https://www.meilisearch.com/docs)
- [Laravel Scout 文档](https://laravel.com/docs/scout)
- [Meilisearch PHP SDK](https://github.com/meilisearch/meilisearch-php)
