#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# fix_minus_title.py — 排除词改为只排标题 + 纯负词兜底
import ast, os, re, shutil
D = '/root/gov_crawler/'
f = 'search_app.py'
p = D + f
src = open(p, encoding='utf-8').read()
OLD = """        like_conds.append('(r.title NOT LIKE ? AND r.site_name NOT LIKE ? AND r.summary NOT LIKE ?)')
        like_params.extend(['%' + t + '%', '%' + t + '%', '%' + t + '%'])"""
NEW = """        # QC20260930 用户口径：-词 只排除「标题」含该词的结果（不再排 site_name/summary）
        like_conds.append('(r.title NOT LIKE ?)')
        like_params.extend(['%' + t + '%'])"""
n = src.count(OLD)
print('目标片段出现次数: %d' % n)
if n >= 1:
    src2 = src.replace(OLD, NEW)
    try:
        ast.parse(src2)
    except SyntaxError as e:
        print('语法错，未落盘:', e)
        raise SystemExit(1)
    b = D + 'Archive/' + f + '.bak_20260930_minus'
    if not os.path.exists(b):
        shutil.copy2(p, b)
    open(p, 'w', encoding='utf-8').write(src2)
    print('✅ 已改（备份 %s）' % os.path.basename(b))
else:
    print('⚠️ 未匹配到目标片段（可能格式不同），未改动')
# 看纯负词时 inc 为空走哪条路
print('\n=== 纯负词分支排查：inc 为空时的判断 ===')
for i, ln in enumerate(src.split('\n'), 1):
    if re.search(r'if (not inc|inc == \[\]|not inc_terms|len\(inc\) == 0)', ln) or ('inc' in ln and 'if' in ln and i > 5200 and i < 5600):
        print('  L%-5d %s' % (i, ln.strip()[:110]))
