ES搜索提示unknown field [disable_coord]问题记录
2023-06-13 09:15:43 时间
项目场景:
软件环境:
- ElasticSearch 7.17.3
- org.elasticsearch.client 7.9.0
问题描述
提示:这里描述项目中遇到的问题:
最近运维迁移了一个环境,重新搭建了ElasticSearch、logstash、kibana,原本已经调好的接口都使用BoolQueryBuilder
这些API来查询的,如下所示:
BoolQueryBuilder builder = QueryBuilders.boolQuery();
builder.filter(QueryBuilders.termQuery("is_deleted", 0));
builder.filter(QueryBuilders.termQuery("status", 100));
builder.filter(QueryBuilders.termQuery("type", "a_table"));
在新的环境,调用都出现了 unknown field [disable_coord]
的错误,是ElasticSearch版本问题?不支持[disable_coord]
这个属性?不过版本都是7.X
的
{
"error":{
"root_cause":[
{
"type":"x_content_parse_exception",
"reason":"[1:2235] [bool] unknown field [disable_coord]"
}
],
"type":"x_content_parse_exception",
"reason":"[1:2251] [bool] failed to parse field [should]",
"caused_by":{
"type":"x_content_parse_exception",
"reason":"[1:2235] [bool] unknown field [disable_coord]"
}
},
"status":400
}
原因分析:
提示:这里填写问题的分析:
这个disable_coord
属性,是BoolQueryBuilder自动加上去的
搜了一下这个属性的作用:
disable_coord: 弃用和禁用一个文档中所包含所有查询关键词的得分计算。默认是false
难道是因为ES客户端API的这个属性,对应的ElasticSearch不支持,去官网和网上搜索资料也没找到对应的,所以就先记录一下问题
解决方案:
提示:这里填写该问题的具体解决方案:
因为如果换ElasticSearch版本改动比较大,所以将传入的参数转为JSON,然后JSON字符串remove这个disable_coord属性,有两张表的查询也会在has_child
里加上这个属性,也需要根据情况弄一下,下面代码仅供参考
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.highlighter(new HighlightBuilder().field("t_name"));
sourceBuilder.query(builder);
sourceBuilder.from((pageModel.getPageIndex() - 1) * pageModel.getPageRowNum());
sourceBuilder.size(pageModel.getPageRowNum());
agg.forEach(sourceBuilder::aggregation);
String str = sourceBuilder.toString();
JSONObject jsonObject = (JSONObject) JSONUtil.parseObj(str);
jsonObject.getJSONObject("query").getJSONObject("bool").remove("disable_coord");
JSONArray filterArray = jsonObject.getJSONObject("query").getJSONObject("bool").getJSONArray("filter");
JSONObject has_child1 = filterArray.getJSONObject(filterArray.size() - 1).getJSONObject("has_child");
if (has_child1 != null)
has_child1.getJSONObject("query").getJSONObject("bool").remove("disable_coord");
JSONObject has_child2 = filterArray.getJSONObject(filterArray.size() - 2).getJSONObject("has_child");
if (has_child2 != null)
has_child2.getJSONObject("query").getJSONObject("bool").remove("disable_coord");
初步猜想是因为ES版本和客户端API的不兼容,但是因为改版本影响比较大,也没找到根本原因,所以本博客只好先记录问题,本博客只能参考,有找到具体原因的读者,可以评论回复
相关文章
- RedisJson 横空出世,比 ES 快7 倍,惊爆了
- logstash同步数据到es
- windows 安装es环境,手把手教学
- ES系列二、CentOS7安装ES head6.3.1
- 基于ES的搜索平台在哈啰的应用
- Android OpenGL ES 纹理
- 【ES三周年】- Elasticsearch简介与使用环境安装
- 【ES三周年】万字长文带你实战 Elasticsearch 搜索
- 【ES三周年】线下es环境数据迁移至腾讯云ES实例实践
- 【ES三周年】ES数据索引和查询优化的技术总结
- 【ES三周年】ES查询—海量数据搜索深度分页优化
- Oracle数据实时全量同步至Elasticsearch(oracle全量同步es)
- 使用ES实现Redis实时监控(用es做redis监控)
- 使用ES连接Oracle一种简单的解决方案(es连接oracle)
- 深入比较ES数据库与Oracle数据库(es数据库和oracle)
- 借助ES技术可靠地迁移数据至Oracle(es 数据到oracle)
- 使用ES导入Oracle数据库一招制胜(es 导入 Oracle)
- 库ElasticSearch 无缝同步Oracle数据库技术探索(es同步oracle数据)
- ES与Oracle数据同步技术研究(es oracle 同步)
- 数据库ES和Oracle数据库实现最佳性能的方案(es oracle)
- Redis实现快速数据转存至Elasticsearch(redis 转存 es)