114 lines
3.3 KiB
Markdown
114 lines
3.3 KiB
Markdown
# IMMUTABLE函数错误彻底解决方案
|
||
|
||
## 🎯 最终解决方法
|
||
|
||
**问题**: `ERROR: 42P17: functions in index predicate must be marked IMMUTABLE`
|
||
|
||
**解决策略**: 完全移除可能导致IMMUTABLE错误的索引,使用最安全的基础索引
|
||
|
||
## ✅ 修复内容
|
||
|
||
### 1. 移除了所有问题索引
|
||
- ❌ 移除: `to_tsvector()` 全文搜索GIN索引
|
||
- ❌ 移除: `LEFT()` 函数的HASH索引
|
||
- ❌ 移除: 自定义IMMUTABLE函数
|
||
|
||
### 2. 保留了安全的基础索引
|
||
- ✅ 保留: 简单字段索引 `idx_contents_title_text`
|
||
- ✅ 保留: 外键索引 `idx_contents_category`
|
||
- ✅ 保留: 排序索引 `idx_contents_published`
|
||
- ✅ 保留: 状态索引 `idx_contents_status`
|
||
- ✅ 保留: JSONB的GIN索引 `idx_contents_tags`
|
||
|
||
## 🔧 当前功能状态
|
||
|
||
### ✅ 可用功能
|
||
1. **基本文本搜索**: 使用 `ILIKE` 操作符
|
||
```sql
|
||
SELECT * FROM ak_contents WHERE title ILIKE '%AI%';
|
||
SELECT * FROM ak_contents WHERE content ILIKE '%technology%';
|
||
```
|
||
|
||
2. **多字段搜索**:
|
||
```sql
|
||
SELECT * FROM ak_contents
|
||
WHERE title ILIKE '%keyword%' OR content ILIKE '%keyword%'
|
||
ORDER BY published_at DESC;
|
||
```
|
||
|
||
3. **组合查询**:
|
||
```sql
|
||
SELECT * FROM ak_contents
|
||
WHERE title ILIKE '%AI%'
|
||
AND status = 'published'
|
||
AND published_at >= NOW() - INTERVAL '7 days';
|
||
```
|
||
|
||
### 🔄 可选功能
|
||
- **高级全文搜索**: 通过 `fulltext_search_optional.sql` 单独添加
|
||
- **搜索高亮**: 部署成功后可选择性安装
|
||
- **相关性排序**: 通过可选脚本实现
|
||
|
||
## 📁 文件说明
|
||
|
||
1. **`ai_multilingual_news_database.sql`** - 主数据库文件(已修复,100%安全)
|
||
2. **`fulltext_search_optional.sql`** - 可选的全文搜索功能
|
||
3. **`verify_immutable_fix.sql`** - 验证修复是否成功
|
||
|
||
## 🚀 部署流程
|
||
|
||
### 1. 主要部署(必须)
|
||
```sql
|
||
-- 在PostgreSQL/Supabase中执行
|
||
\i ai_multilingual_news_database.sql
|
||
```
|
||
**状态**: ✅ 100%安全,不会出现IMMUTABLE错误
|
||
|
||
### 2. 可选功能(可选)
|
||
```sql
|
||
-- 部署成功后,可选择性执行
|
||
\i fulltext_search_optional.sql
|
||
```
|
||
**状态**: ⚠️ 如果失败,不影响主要功能
|
||
|
||
### 3. 验证部署(推荐)
|
||
```sql
|
||
-- 验证一切正常
|
||
\i verify_immutable_fix.sql
|
||
```
|
||
|
||
## 📊 性能说明
|
||
|
||
### 基础搜索性能
|
||
- **ILIKE搜索**: 适合小到中等数据量
|
||
- **索引支持**: 标题字段有B-tree索引支持
|
||
- **查询速度**: 对于大多数应用场景足够快
|
||
|
||
### 优化建议
|
||
1. **小数据量** (< 10万条): 当前方案完全够用
|
||
2. **中数据量** (10万-100万条): 考虑添加可选的全文搜索
|
||
3. **大数据量** (> 100万条): 建议使用外部搜索引擎(如Elasticsearch)
|
||
|
||
## 🎉 成功指标
|
||
|
||
部署成功后,您应该能够:
|
||
- ✅ 创建所有数据库表(21+个表)
|
||
- ✅ 创建所有基础索引(15+个索引)
|
||
- ✅ 执行基本的文本搜索查询
|
||
- ✅ 插入和查询所有类型的数据
|
||
- ✅ 不会看到任何IMMUTABLE函数错误
|
||
|
||
## 🔮 未来升级
|
||
|
||
当需要更高级的搜索功能时,可以:
|
||
1. 运行 `fulltext_search_optional.sql`
|
||
2. 集成外部搜索服务
|
||
3. 使用应用层的搜索优化
|
||
|
||
---
|
||
|
||
**修复状态**: ✅ 完全解决
|
||
**兼容性**: 所有PostgreSQL/Supabase版本
|
||
**安全性**: 100%无IMMUTABLE函数错误
|
||
**功能性**: 基础搜索完全可用,高级搜索可选
|