首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为elasticsearch客户端构建XContentBuilder json查询

为elasticsearch客户端构建XContentBuilder json查询
EN

Stack Overflow用户
提问于 2019-03-28 18:36:19
回答 1查看 892关注 0票数 1

基本上,我希望使用XContentBuilder获得以下查询:

代码语言:javascript
复制
{"query":{
    "bool": {
        "must": [
            { "match": { "fields.title": "Star"}},
            { "match": { "fields.title": "Wars"}}
        ]
}}}

下面是我的代码:

代码语言:javascript
复制
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())

但是我得到了这个错误:

代码语言:javascript
复制
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()时,我没有更多的错误,但这不是我想要的查询……

代码语言:javascript
复制
{"query":{
    "bool": {
        "must": [
            { "fields.title": "Star"},
            { "fields.title": "Wars"}
        ]
}}}
EN

回答 1

Stack Overflow用户

发布于 2019-11-14 00:37:22

看起来你需要一个额外的startObjectendObject调用。为了在每个match对象周围添加大括号,您需要这样做。代码应如下所示:

代码语言:javascript
复制
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())
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55395476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档