#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""qc_fts_reconcile.py —— 逐站比对 gov_raw vs gov_search（找"数据在但搜不到"）"""
import json, sqlite3
D = "/root/gov_crawler/"
recs = json.load(open(D + "qc_out/qc_wholesite_delete_20260925.json", encoding="utf-8"))
db = sqlite3.connect("file:/root/search.db?mode=ro", uri=True, timeout=60)
db.execute("PRAGMA busy_timeout=60000")
tot_raw = tot_missing = 0
bad = []
for r in recs:
    site = r.get("站点") or ""
    if not site or site == "?": continue
    n = db.execute("SELECT COUNT(*) FROM gov_raw WHERE site_name=?", (site,)).fetchone()[0]
    if not n: continue
    miss = db.execute("SELECT COUNT(*) FROM gov_raw g WHERE g.site_name=? AND NOT EXISTS "
                      "(SELECT 1 FROM gov_search s WHERE s.rowid=g.id)", (site,)).fetchone()[0]
    tot_raw += n; tot_missing += miss
    if miss: bad.append((site, r["script"], n, miss, "%.0f%%" % (100.0 * miss / n)))
print("比对 %d 站（批2 涉及的整站 DELETE 脚本）" % len([r for r in recs if r.get('站点') and r['站点'] != '?']))
print("  原始表总行数: %d" % tot_raw)
print("  其中 FTS 里查不到: %d" % tot_missing)
print("  受影响的站: %d 个" % len(bad))
bad.sort(key=lambda x: -x[3])
for site, sc_, n, miss, pct in bad[:25]:
    print("    %-26s %-28s raw=%-5d 缺=%d (%s)" % (site[:26], sc_[:28], n, miss, pct))
json.dump(bad, open(D + "qc_out/qc_fts_missing.json", "w", encoding="utf-8"), ensure_ascii=False, indent=1)
print("\n已写 qc_out/qc_fts_missing.json")
db.close()
