Elasticsearch query_string结合地理距离过滤报错求助
解决Elasticsearch query_string结合geo_distance过滤的语法错误
嘿,这个错误是因为你的Elasticsearch查询DSL结构不对!你直接把query_string和geo_distance平级放在了根节点的query下面,但ES的查询语法要求这类组合查询必须嵌套在bool查询里才行。
错误提示里的expected field name but got [START_OBJECT]就是在告诉你:ES解析到根query下的filter这个对象时,它本来期望的是一个字段名(比如bool、match这类查询类型),结果收到了一个对象,所以报错了。
给你修正后的代码,核心是用bool查询把query_string(作为需要评分的查询)和geo_distance(作为过滤条件)整合起来:
doc = { "query": { "bool": { "must": [ { "query_string": { "query": term, "fields": ['name', 'business_name', 'email', 'city', 'state', 'zip_code', 'business_keywords', 'phone_number', 'address', 'country'] } } ], "filter": [ { "geo_distance": { "distance": radius, "distance_unit": "km", "distance_type": "arc", "location": { "lat": latitude, "lon": longitude } } } ] } } } search_response = client.search(index="b", body=doc)
简单说下修正的关键点:
- 用
bool查询作为根查询类型,它能灵活组合多种查询和过滤条件 must数组里放query_string:确保只有匹配关键词的文档会被返回,并且这个查询会参与相关性评分filter数组里放geo_distance:只负责过滤出指定距离内的文档,不影响评分,而且ES会缓存过滤结果,后续查询性能更好
这样调整后,你的查询就能正常执行啦!
内容的提问来源于stack exchange,提问作者srk
相关产品推荐
相关产品推荐

