Построить json-запрос XContentBuilder для клиента elasticsearch

#java #elasticsearch #groovy

#java #elasticsearch #отличный

Вопрос:

В принципе, я хочу получить этот запрос с помощью 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"}
        ]
}}}
  

Ответ №1:

Похоже, вам нужен дополнительный вызов startObject и endObject . Это нужно для того, чтобы добавить фигурные скобки вокруг каждого 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())