报错AttributeError: 'Search'对象无execute_suggest属性,求解决
AttributeError: 'Search' object has no attribute 'execute_suggest' 排查与解决
我之前也碰到过一模一样的问题!这是因为elasticsearch-dsl的API在新版本中做了迭代更新,execute_suggest()这个专门用于获取建议结果的方法已经被官方废弃并移除了,所以你的Search对象才会报没有这个属性的错误。
问题根源
在早期的elasticsearch-dsl版本(比如5.x及之前)中,Search对象提供了execute_suggest()方法来单独处理建议查询;但后续版本(6.x+)里,官方把所有搜索相关的执行逻辑都整合到了通用的execute()方法中,不再保留单独的execute_suggest()。
解决办法
只需要两步修改你的代码即可适配新版本API:
- 将
s.execute_suggest()替换为s.execute(),获取完整的搜索响应对象 - 从响应对象的
suggest属性中提取建议结果
修改后的完整代码如下:
class SearchSuggest(View): def get(self, request): key_words = request.GET.get('s', '') re_datas = [] if key_words: s = ArticleType.search() s = s.suggest('my_suggest', key_words, completion={ "field": "suggest", "fuzziness": 1, "size": 5 }) # 替换execute_suggest为execute,获取响应对象 response = s.execute() # 从响应中提取suggest结果 suggestions = response.suggest for match in suggestions.my_suggest[0].options: source = match._source re_datas.append(source["title"]) return HttpResponse(json.dumps(re_datas), content_type="application/json")
额外说明
如果你因为某些原因无法修改代码,也可以考虑降级elasticsearch-dsl到支持execute_suggest()的旧版本(比如5.4.0),但这种方式不推荐——旧版本会逐渐停止安全更新和功能维护,长期来看还是适配新版本API更稳妥。
内容的提问来源于stack exchange,提问作者yixuan
相关产品推荐
相关产品推荐

