如何解决Django-Elasticsearch-DSL 嵌套范围查询
我正在尝试使用 django-elasticsearch-dsl 实现以下 Elasticsearch 查询,但遇到了一些困难
{
"query":{
"nested":{
"path":"ip_addresses","query":{
"bool":{
"filter":[
{
"range":{
"ip_addresses.ip":{
"gte":"192.168.1.0","lte":"192.168.1.255"
}
}
}
]
}
}
}
}
}
def search_ip_range(self,start: str,end: str):
range_query = Q('range',gte=start,lte=end)
search = Search()
search = search.query('nested',path='ip_addresses',query=range_query)
try:
response = search.execute()
pprint("Found {} results".format(response.hits.total.value))
for hit in response:
pprint(hit.detail_url)
except Exception as e:
pprint('Search error: {}'.format(e))
RequestError(400,'parsing_exception','[range] query does not support [gte]')
解决方法
正如 elasticsearch-dsl-py
的作者所说,you'll need to use nested filters。一种选择是:
...
range_query = Q('range',ip_addresses__ip={'gte': start,'lte': end})
search = Search()
search = search.query('nested',path='ip_addresses',query=Q('bool',filter=[range_query]))
pprint(search.to_dict())
...
您可以省略 Q(bool,filter=
部分,但 range
不会被包裹在其中:
search = search.query('nested',query=range_query)
请记住,如果您确实将其包装在 filter
上下文中,则 no scores will be calculated。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。