"""
重建 BM25 索引
因为旧索引是用错误的分词器建立的，需要用正确的 jieba 分词器重建
"""
from src.core import RAGSystem

print("=== 重建 BM25 索引 ===\n")

# 创建 RAG 系统实例
rag = RAGSystem()

# 先加载向量索引以获取节点
print("1. 加载向量索引...")
rag.load_index()

if rag.index:
    print("   ✅ 向量索引加载成功\n")
    
    # 从向量索引获取所有节点
    print("2. 从向量索引获取文档节点...")
    from llama_index.core.storage.docstore import SimpleDocumentStore
    
    docstore = rag.index.docstore
    all_nodes = list(docstore.docs.values())
    print(f"   找到 {len(all_nodes)} 个文档节点\n")
    
    # 删除旧的 BM25 索引
    print("3. 删除旧的 BM25 索引...")
    rag.bm25_store_manager.delete_bm25_index()
    print("   ✅ 旧索引已删除\n")
    
    # 用正确的分词器重建 BM25 索引
    print("4. 用正确的 jieba 分词器重建 BM25 索引...")
    bm25_retriever = rag.bm25_store_manager.setup_bm25(nodes=all_nodes)
    
    if bm25_retriever:
        print("   ✅ BM25 索引重建成功\n")
        
        # 定义测试查询
        test_query = "什么是RAG"
        
        # 验证分词器（如果存在）
        print("5. 验证分词器配置:")
        if hasattr(bm25_retriever, 'tokenizer') and bm25_retriever.tokenizer:
            print(f"   tokenizer 类型: {type(bm25_retriever.tokenizer)}")
            
            # 测试分词
            tokens = bm25_retriever.tokenizer(test_query)
            print(f"   测试查询: {test_query}")
            print(f"   分词结果: {tokens}")
        else:
            print("   ⚠️ tokenizer 属性不存在（可能使用内部分词）")
        
        # 持久化
        print("\n6. 保存 BM25 索引...")
        rag.bm25_store_manager.persist_bm25()
        print("   ✅ 索引已保存\n")
        
        # 测试检索
        print("7. 测试检索:")
        print(f"   查询: {test_query}")
        nodes = bm25_retriever.retrieve(test_query)
        print(f"   检索到 {len(nodes)} 个结果")
        
        if nodes:
            print(f"\n   Top 3 结果:")
            for i, node in enumerate(nodes[:3], 1):
                score = node.score if hasattr(node, 'score') else 'N/A'
                text_preview = node.text[:80] if hasattr(node, 'text') else 'N/A'
                print(f"\n   [{i}] 分数: {score}")
                print(f"       内容: {text_preview}...")
        
        print("\n" + "="*50)
        print("✅ BM25 索引重建完成！")
        print("现在查询应该能够正确匹配中文了。")
    else:
        print("   ❌ BM25 索引重建失败")
else:
    print("   ❌ 向量索引加载失败")
