Spring Data ElasticSearch:解析完整JSON测试DSL查询

gpfsuwkq  于 2023-05-05  发布在  Spring
关注(0)|答案(1)|浏览(329)

在一个java项目中,我的输入是一个用完整JSON文本编写的ElasticSearch DSL查询。
java项目的目标是使用Spring Data ElasticSearch执行此查询。
问题是我没有找到一种简单的方法来解析输入JSON DSL查询到Spring Query对象(接口org.springframework.data.elasticsearch.core.query.Query
例如,让我们有这个输入查询:

{
    "query": {
        "bool": {
            "must": [
                {
                    "query_string": {
                        "default_field": "firstName",
                        "query": "toto"
                    }
                }
            ]
        }
    },
    "aggs": {
        "first_name": {
            "terms": {
                "field": "user.firstName"
            }
        }
    }
}

如果我在shell中使用curl命令执行这个查询,下面是一个示例响应:

[...]
{
  "_index": "demoindex02",
  "_id": "SBAlS4cBet7182k9ugY1",
  "_score": 0.01626052,
  "_source": {
    "_class": "com.elasticsearch.document.ElasticSearchDocument",
    "firstName": "toto"
  }
},
[...]

根据Spring Data ElasticSearch文档,
我可以使用org.springframework.data.elasticsearch.core.query.StringQuery对象轻松地解析“query”条目的内容。
我只需要提取“query”条目中的JSON对象字符串
然后把它交给builder函数。
例如:StringQueryBuilder queryBuilder = StringQuery.builder("\"bool\":[...]\"query\":\"toto\"}}]}");
在Spring Data Elasticsearch中,@Query annotation做了完全相同的事情。
但是,我不能为“aggs”条目做同样的事情。
我没有找到任何与StringQuery构建器工作方式相同的对象构建器:
解析输入的JSON字符串DSL查询,并给予一个co.elastic.clients.elasticsearch._types.aggregations.Aggregate对象。
@Aggregation(或类似的)注解似乎不存在于Spring Data ElasticSearch中。
我的第一个问题是:

  1. Spring Data Elastic是否提供了这样的聚合解析器?
    如果是,相关对象是什么?
    1.是否存在现有的开源解析器?(在一个开放的GitHug/GitLab/...项目)
    如果是这样,我在哪里可以找到这个项目?(我试着google了一下,但没有找到任何东西)
    最终没有这样的解析器,
    我试着看看如何做一个我自己的。
    co.elastic.clients.elasticsearch._types.aggregations.Aggregate对象描述了Kind枚举中的“agg”条目:
public enum Kind implements JsonEnum {
    AdjacencyMatrix("adjacency_matrix"),
    AutoDateHistogram("auto_date_histogram"),
    Avg("avg"),
[...]

有关AutoDateHistogram("auto_date_histogram")的详细信息,请参阅co.elastic.clients.elasticsearch._types.aggregations.AutoDateHistogramAggregation对象。
我可以看到这个条目使用关键字,如:存储桶、字段、格式...
所以在co.elastic.clients.elasticsearch._types.aggregations包中,我可以找到所有信息来解析“agg”DSL条目。但是它们是许多复杂的对象,并且不想浪费大量时间来解析每个关键字/条目,手动为每个关键字/条目编写特定的对象解析器。我最后一个问题是:你有什么线索或技巧可以轻松地编写这样一个解析器吗?
为了获得信息,我使用了这些文档:

我阅读了Spring和ElasticSearch的官方文档,
读取库代码并使用逐行调试
也试着google一下这个问题。
不幸的是,我没有找到任何答案。
我希望有人知道一个现有的项目/库,可以解决我的问题,
或者一些线索来轻松开发我自己的解决方案。

t9eec4r0

t9eec4r01#

解决方案使用jakarta.json.stream.JsonParserco.elastic.clients.elasticsearch.core.SearchRequest作为中介
1.解析原始JSON字符串请求:

JsonParser jsonParser = Json.createParser(new StringReader("{\"query\":{...},\"aggs\":{...},...}"));
SearchRequest request = SearchRequest._DESERIALIZER.deserialize(jsonParser, jsonpMapper);

1.初始化Spring Data 查询:NativeQueryBuilder nativeQueryBuilder = NativeQuery.builder();
1.使用SearchRequest对象构建NativeQueryBuilder对象

nativeQueryBuilder.withQuery(request.query());
for (Entry<String, Aggregation> aggregationEntry : request.aggregations().entrySet()) {
    nativeQueryBuilder.withAggregation(aggregationEntry.getKey(),
                            aggregationEntry.getValue());
//...
}

相关问题