elasticsearch - 弹性搜索没有为 [geo_bounding_box] 注册查询
问题描述
我正在尝试从弹性搜索中获取记录,但出现如下错误
ElasticsearchStatusException[Elasticsearch exception [type=exception, reason=SearchPhaseExecutionException[Failed to execute phase [query_fetch], all shards failed;
shardFailures {[-kDbP0fmTUa5B8v1gpgoZQ][dataintelindex_ra][0]: SearchParseException[[dataintelindex_ra]
[0]: from[-1],size[-1]: Parse Failure [Failed to parse source [{"query":{"geo_bounding_box":{"loc":
{"top_left":[-74.1,40.73],"bottom_right":
[-73.99,40.717]},"validation_method":"STRICT","type":"MEMORY","ignore_unmapped":false,"boost":1.0}}}]]];
nested: QueryParsingException[[dataintelindex_ra] No query registered for [geo_bounding_box]]; }]]]
我的Java代码如下
SearchRequest searchRequest = new SearchRequest("dataintelindex_ra").types("station_info");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.geoBoundingBoxQuery("loc").setCorners(40.73,-74.1,40.717,-73.99));
searchRequest.source(searchSourceBuilder);
SearchResponse response = elasticSearchClient.search(searchRequest, RequestOptions.DEFAULT);
for (SearchHit searchHit : response.getHits().getHits()) {
System.out.println("~~~~~~~~SearchHit[] searchHits~~~~~~~~~~~~~~ "+searchHit.getSourceAsString());
}
如果我在尝试索引时遗漏了什么,请告诉我,我是 Elastic 搜索的新手。
另外,如果我想在我的查询中再包含一个条件,如下所示
searchSourceBuilder.query(QueryBuilders.termsQuery("zoneType", ["test","oms"]));
以下是上述查询的结果,它工作正常
~~~~~~~~SearchHit[] searchHits~~~~~~~~~~~~~~ {"tag_datatype":"sensor","loc":[{"lat":"0","lon":"0"}],"level":1,"kml_path":"","created":"Mon Aug 10 16:02:51 IST 2020","latitude":"0","station_id":"5f312253b4c93c1d20bbbb39","longtitude":"0","tag_owner":"","description":"","zoneType":"oms","tag_network_name":"chak_network","display_name":"506020200236117-O1","supply_zone":"506020200236117-O1","outflow":null,"tag_sector":"dmameter","name":"506020200236117-O1","tag_category":"sensorstation","inflow":null,"_id":"5f312253b4c93c1d20bbbb39","tag_location":"NA","lastmod":"Mon Aug 10 16:02:51 IST 2020","status":"ACTIVE"}
~~~~~~~~SearchHit[] searchHits~~~~~~~~~~~~~~ {"tag_datatype":"sensor","loc":[{"lat":"0","lon":"0"}],"level":1,"kml_path":"","created":"Tue Aug 11 11:36:51 IST 2020","latitude":"0","station_id":"5f32357b3ccb8f51e003587e","longtitude":"0","tag_owner":"","description":"","zoneType":"village","display_name":"testvillage1","supply_zone":"testvillage1","outflow":null,"tag_sector":"dmameter","name":"testvillage1","tag_category":"sensorstation","inflow":null,"_id":"5f32357b3ccb8f51e003587e","tag_location":"NA","lastmod":"Tue Aug 11 11:36:51 IST 2020","status":"ACTIVE"}
我如何结合上述地理边界框查询?我需要将其添加为过滤器吗?
更新:依赖
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>6.4.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>6.4.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>6.4.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.4.0</version>
</dependency>
{
"status" : 200,
"name" : "test1",
"version" : {
"number" : "1.2.2",
"build_hash" : "243243432feaga",
"build_timestamp" : "2014-07-09T12:02:32Z",
"build_snapshot" : false,
"lucene_version" : "4.8"
},
"tagline" : "You Know, for Search"
}
在此先感谢拉克什
解决方案
问题是您正在使用 6.4.0 客户端运行 ES 服务器 v1.2.2(非常旧的版本)。
所以6.4.0客户端有geoBoundingBoxQuery()
方法,1.2.2客户端提供geoBoundingBoxFilter()
方法,两者不兼容。ES 2.x 中有一个很大的查询/过滤器重构。
根据经验,您应该始终运行相同版本的 ES 和客户端库。在您的情况下,您的服务器和客户端之间有几个版本的增量。
您绝对应该考虑将您的 ES 集群升级到至少 6.4.0 或将您的客户端降级到 1.x。
推荐阅读
- c# - Oracle ManagedDataAccess GetDecimal 指定的强制转换无效
- java - (已解决)序列化(编写)一个充满对象的 Arraylist 不断抛出“NotSerializableException”
- javascript - 如何访问其他同级文件夹的 package.json 或组织 MERN 堆栈的文件夹
- reactjs - 在第二次渲染中没有调用 React select loadOptions
- amazon-web-services - 无法在 aws api gw 中部分部署?
- python - 如何为 AWS lambda 正确准备部署包
- go - 对多个预期查询使用相同的预期行仅返回带有 sqlmock 的第一个查询的结果
- ios - Swizzling UIImage.init(named:) 在获取实例方法时返回 nil
- heroku - Heroku 上的 1 个应用程序和 1 个工作人员需要多少个测功机?
- python - 如何从 OpenCV 的特征脸模型中获得“特征向量之间的距离”或“两张脸之间的相似度值”?蟒蛇语言