You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Eldar Python包验证含空格词组的布尔查询(保留match_word=True)

解决方案:在Eldar中启用match_word=True时实现词组精确匹配

你的问题出在Eldar默认对引号内词组的处理逻辑:当开启match_word=True时,它会将词组拆分为独立的全词匹配项(仅做AND逻辑校验,不保证词序和连续性),而非将其作为连续的整体词组匹配。要解决这个问题,可以通过正则表达式查询在Eldar框架内实现连续词组的全词匹配,同时保留match_word=True的语义。

方法一:用正则表达式构造查询

直接在Eldar的查询字符串中使用regex:前缀,定义匹配连续词组的正则表达式,确保每个词都符合全词匹配规则:

from eldar import Query

# 构造正则:匹配连续的"fiscale"和"economie",每个词都是独立完整的词
eldar = Query(
    'regex:(\\bfiscale\\s+economie\\b)',
    ignore_case=True,
    ignore_accent=True,
    match_word=True
)

print(eldar("fiscale economie"))  # 输出: True
print(eldar("la fiscale economie est importante"))  # 输出: True
print(eldar("fiscale politique economie"))  # 输出: False(词不连续)

方法二:自定义词组匹配逻辑

如果需要结合更复杂的布尔搜索规则,可以自定义辅助函数,先校验词组连续性,再用Eldar做全词匹配:

from eldar import Query
import re

def match_phrase_with_word_check(query_str, text, **kwargs):
    # 提取查询中的引号包裹词组
    phrase_match = re.search(r'"([^"]+)"', query_str)
    if phrase_match:
        phrase = phrase_match.group(1)
        # 先检查词组是否连续出现在文本中
        if re.search(re.escape(phrase), text, re.IGNORECASE):
            # 再用Eldar校验每个词的全词匹配
            word_query = Query(
                ' AND '.join([f'"{word}"' for word in phrase.split()]),
                match_word=True,
                **kwargs
            )
            return word_query(text)
    # 非词组查询使用Eldar默认逻辑
    default_query = Query(query_str, match_word=True, **kwargs)
    return default_query(text)

# 使用示例
result = match_phrase_with_word_check(
    '"fiscale economie"',
    "fiscale economie",
    ignore_case=True,
    ignore_accent=True
)
print(result)  # 输出: True

关键说明

  • 正则中的\b是单词边界,确保fiscale和economie作为独立词匹配(契合match_word=True的要求),\s+匹配任意空白字符,保证词的连续性。
  • 结合ignore_accent=True时,正则匹配会自动适配带重音的词汇变体,无需额外处理。

内容的提问来源于stack exchange,提问作者Hajo Brandt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 23:55:26