fix: 混合布尔丢失 OR — boolean_operator="mixed" 引擎分支修复
boolean_operator 有三种值:and/or/mixed。引擎只处理了 "or", "mixed" 落到了 else(AND),导致 A OR B AND C 中 OR 完全丢失。 修复两处: - field_combine: 用 or_ 当 string(mixed) 场景,因为各组内是 OR 关系 - term_conditions 合并: mixed 与 or 同逻辑,OR 合并所有正条件
This commit is contained in:
@@ -613,7 +613,7 @@ class AdvancedSearchEngine:
|
|||||||
term_conditions: list = []
|
term_conditions: list = []
|
||||||
|
|
||||||
# 1. 字段级搜索 [TI] [AB] [TIAB] [AU] [TA] [LA] [VI] [IP] [PG] [LID]
|
# 1. 字段级搜索 [TI] [AB] [TIAB] [AU] [TA] [LA] [VI] [IP] [PG] [LID]
|
||||||
field_combine = or_ if pp.boolean_operator == "or" else and_
|
field_combine = or_ if pp.boolean_operator in ("or", "mixed") else and_
|
||||||
field_map = {
|
field_map = {
|
||||||
"title": pp.title_terms,
|
"title": pp.title_terms,
|
||||||
"abstract": pp.abstract_terms,
|
"abstract": pp.abstract_terms,
|
||||||
@@ -949,10 +949,10 @@ class AdvancedSearchEngine:
|
|||||||
|
|
||||||
# 将 term_conditions 加入 conditions
|
# 将 term_conditions 加入 conditions
|
||||||
if term_conditions:
|
if term_conditions:
|
||||||
if pp.boolean_operator == "or":
|
if pp.boolean_operator in ("or", "mixed"):
|
||||||
from sqlalchemy.sql.elements import UnaryExpression
|
from sqlalchemy.sql.elements import UnaryExpression
|
||||||
from sqlalchemy.sql import operators as _sa_ops
|
from sqlalchemy.sql import operators as _sa_ops
|
||||||
# OR 模式下 NOT 项应独立 AND(PubMed: A OR B NOT C = (A OR B) AND NOT C)
|
# OR/mixed 模式下 NOT 项应独立 AND(PubMed: A OR B NOT C = (A OR B) AND NOT C)
|
||||||
pos_conds = [c for c in term_conditions
|
pos_conds = [c for c in term_conditions
|
||||||
if not (isinstance(c, UnaryExpression) and c.modifier == _sa_ops.inv)]
|
if not (isinstance(c, UnaryExpression) and c.modifier == _sa_ops.inv)]
|
||||||
neg_conds = [c for c in term_conditions
|
neg_conds = [c for c in term_conditions
|
||||||
|
|||||||
Reference in New Issue
Block a user