如何使用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
相关产品推荐
相关产品推荐

