如何将Elasticsearch 1.x查询语句升级至5.x版本?
解决Elasticsearch 5.x中旧版查询语法的报错问题
这个报错的核心原因是Elasticsearch从2.x开始就逐步废弃了1.x中的顶级filter语法,到5.x已经完全移除了这个写法,同时旧的and过滤器也被更灵活的bool查询替代了。下面是适配5.x的修改方案,以及具体的改动说明:
适配5.x的查询语句
{ "query": { "bool": { "filter": [ {"exists": {"field": "body"}}, {"term": {"accept": "true"}}, {"exists": {"field": "thumbnail"}}, {"terms": {"content": ["577f6ca06dd5340a97e89923"]}}, {"range": {"date": {"lt": "2018-01-05T04:07:48.901933", "gte": "1963-04-04T04:07:48.901933"}}}, {"terms": {"agency": ["577ff7176dd5340a97e899b7"]}}, {"terms": {"subject": ["578c6c7f6dd5345f3db18e7b"]}}, {"terms": {"geographic": ["577f78fe6dd5340a97e89948"]}} ] } }, "_source": ["_id", "link", "title"], "from": 0, "sort": {"date": {"order": "desc"}}, "size": 30 }
关键改动说明
- 移除顶级
filter,改用bool.filter:5.x要求所有过滤条件都放在query.bool.filter下,这是Elasticsearch统一查询DSL后的标准写法,同时bool.filter内的条件默认就是逻辑与(等价于原来的and过滤器),不需要额外嵌套and。 - 去掉嵌套的
query包装:原来的{"query": {"term": ...}}这种写法在5.x的filter上下文里不需要,直接把内部的term/terms条件放到filter数组里即可。 - 替换
fields为_source:虽然5.x还兼容fields,但官方推荐使用_source来指定返回的字段,这是更标准的写法。
这样修改后,查询就能在5.x版本正常运行了,同时还能利用Elasticsearch对filter上下文的缓存优化,提升查询性能。
内容的提问来源于stack exchange,提问作者ehsan shirzadi
相关产品推荐
相关产品推荐

