java - 为elasticsearch客户端构建XContentBuilder json查询

标签 java elasticsearch groovy

基本上,我想使用 XContentBuilder 获取此查询:

{"query":{
    "bool": {
        "must": [
            { "match": { "fields.title": "Star"}},
            { "match": { "fields.title": "Wars"}}
        ]
}}}

这是我的代码:

XContentBuilder query = XContentFactory.jsonBuilder()
def array = ["Star", "Wars"]
def field = "field.title"
query.startObject()
query.startObject("bool")
query.startArray("must")
array.each { value ->
    query.startObject("match")
    query.startObject()
    query.field(field, value)
    query.endObject()
    query.endObject()
}
query.endArray()
query.endObject()
query.endObject()
QueryBuilder finalQuery = QueryBuilders.wrapperQuery(query.string())

但是我收到了这个错误:

Caused by: com.fasterxml.jackson.core.JsonGenerationException: Can not write a field name, expecting a value
        at com.fasterxml.jackson.core.JsonGenerator._reportError(JsonGenerator.java:1897)
        at com.fasterxml.jackson.core.json.UTF8JsonGenerator.writeFieldName(UTF8JsonGenerator.java:185)
        at org.elasticsearch.common.xcontent.json.JsonXContentGenerator.writeFieldName(JsonXContentGenerator.java:183)
        at org.elasticsearch.common.xcontent.XContentBuilder.field(XContentBuilder.java:246)
        at org.elasticsearch.common.xcontent.XContentBuilder.startObject(XContentBuilder.java:222)
        at gde.plugin.search.elasticsearch.ElasticSearchWrapper$_clientQuery_closure16$$ERM0UO5B.doCall(ElasticSearchWrapper.groovy:737)
        at gde.plugin.search.elasticsearch.ElasticSearchWrapper$$ERM0UO51.clientQuery(ElasticSearchWrapper.groovy:736)
        at gde.plugin.search.SearchService.test(SearchService.groovy:158)
        at gde.plugin.search.SearchController.test(SearchController.groovy:43)
        ... 36 common frames omitted

奇怪的是,当我删除 query.startObject("match") 及其关联行 query.endObject() 时,我不再有错误,但这不是我想要的查询...

{"query":{
    "bool": {
        "must": [
            { "fields.title": "Star"},
            { "fields.title": "Wars"}
        ]
}}}

最佳答案

看起来您需要额外的 startObjectendObject 调用。您需要它才能在每个 match 对象周围添加大括号。代码应如下所示:

XContentBuilder query = XContentFactory.jsonBuilder()
def array = ["Star", "Wars"]
def field = "field.title"
query.startObject()
query.startObject("bool")
query.startArray("must")
array.each { value ->
    query.startObject()
    query.startObject("match")
    query.startObject()
    query.field(field, value)
    query.endObject()
    query.endObject()
    query.endObject()
}
query.endArray()
query.endObject()
query.endObject()
QueryBuilder finalQuery = QueryBuilders.wrapperQuery(query.string())

关于java - 为elasticsearch客户端构建XContentBuilder json查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55395476/

相关文章:

java - 如何在 JLabels 中应用换行符?

json - 使用连接参数的Elasticsearch存储桶聚合

c# - 找不到Elasticsearch NEST建议者解析器

dictionary - groovy 中的 bool 方法总是返回 true

java - 在自定义数组适配器中单击 imageview 上的开始 Activity

java - Android Studio 错误 OnCreate

gradle - 依赖依赖的常规项目的gradle构建失败

Groovy:点击与使用

java - 扫描仪干扰另一个扫描仪

elasticsearch - 如何增加数据节点进行 Elasticsearch