如何在Solr中使用AND运算符链式执行邻近搜索?
Solr多邻近查询的AND组合语法修正
你之前的写法错误在于把Python的逻辑运算符AND直接和f-string拼接,这不符合Python语法,也没有将AND作为Solr查询语法的一部分包含在查询字符串里。正确的做法是把所有查询子句和AND关键字整合为一个完整的字符串,作为q参数的值。
单条件原代码回顾
resp = requests.get('http://localhost:8984/solr/my_index/select', params={ 'q': f'"{q_solr}"~1', # 单邻近查询(距离1) 'wt': 'json', 'rows': 5, 'start': 0, 'fl': 'id,org*,score', })
多条件修正写法
直接拼接版
如果查询词数量固定,可以直接用f-string一次性组合所有子句:
resp = requests.get('http://localhost:8984/solr/my_index/select', params={ 'q': f'"{q_solr}"~1 AND "{X_solr}"~1 AND "{Y_solr}"~1', # 多邻近查询用AND组合 'wt': 'json', 'rows': 5, 'start': 0, 'fl': 'id,org*,score', })
灵活扩展版
如果查询词数量不固定(比如从列表动态获取),可以用join方法生成查询字符串,更易维护:
# 定义所有需要查询的目标词 search_terms = [q_solr, X_solr, Y_solr] # 生成每个词对应的邻近查询子句,再用AND连接 query_str = ' AND '.join([f'"{term}"~1' for term in search_terms]) resp = requests.get('http://localhost:8984/solr/my_index/select', params={ 'q': query_str, 'wt': 'json', 'rows': 5, 'start': 0, 'fl': 'id,org*,score', })
关键说明
- Solr的查询语法中,
AND是查询逻辑关键字,必须作为查询字符串的一部分传递,不能当成Python代码的逻辑运算符使用。 - 每个邻近查询子句保持
"搜索词"~1的格式,多个子句用AND(注意前后空格)分隔,确保Solr能正确解析逻辑关系。
内容的提问来源于stack exchange,提问作者AJW
相关产品推荐
相关产品推荐

