首页 > 解决方案 > 弹性搜索没有为 [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"
}

在此先感谢拉克什

标签: elasticsearch

解决方案


问题是您正在使用 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。


推荐阅读