在一个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中。
我的第一个问题是:
- 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 Data Elasticsearch -参考文档
- Query DSL
- Search your data
我阅读了Spring和ElasticSearch的官方文档,
读取库代码并使用逐行调试
也试着google一下这个问题。
不幸的是,我没有找到任何答案。
我希望有人知道一个现有的项目/库,可以解决我的问题,
或者一些线索来轻松开发我自己的解决方案。
1条答案
按热度按时间t9eec4r01#
解决方案使用
jakarta.json.stream.JsonParser
和co.elastic.clients.elasticsearch.core.SearchRequest
作为中介1.解析原始JSON字符串请求:
1.初始化Spring Data 查询:
NativeQueryBuilder nativeQueryBuilder = NativeQuery.builder();
1.使用
SearchRequest
对象构建NativeQueryBuilder
对象