首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查询“双”嵌套对象的ElasticSearch客户端

查询“双”嵌套对象的ElasticSearch客户端
EN

Stack Overflow用户
提问于 2021-02-06 23:32:41
回答 2查看 99关注 0票数 0

我有像这样的弹性嵌套数据。对于属性,best_practice得到单嵌套查询,属性work_field得到双重嵌套查询。

我想将双层嵌套结构(关于work_field)的查询转换为Java代码

代码语言:javascript
运行
复制
"_source": {
    "best_practice": [
        {
            "code": "A002",
            "best_practice_summary": "a",
            "best_practice_type": "AAA"
        },
        {
            "code": "A001",
            "best_practice_summary": "s",
            "best_practice_type": "BBB"
        }
    ],
    "work_field": {
        "choice_field": [
            {
                "isSelected": true,
                "idx": 1,
                "value": "CCC",
                "key": "B002"
            },
            {
                "isSelected": true,
                "idx": 77,
                "value": "DDD",
                "key": "B078"
            }
        ]
    }
}

这段java代码适用于单嵌套查询(best_practice.code),但不适用于双重查询。如何将其转换为双嵌套?

代码语言:javascript
运行
复制
public NestedQueryBuilder nestedBoolQuery(final Map<String, String> propertyValues, final String nestedPath) {

    BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
    Iterator<String> iterator = propertyValues.keySet().iterator();
    propertyValues.put("work_field.choice_field.key", "B002");

    while (iterator.hasNext()) {
        String propertyName = iterator.next();
        String propertValue = propertyValues.get(propertyName);
        MatchQueryBuilder matchQuery = QueryBuilders.matchQuery(propertyName, propertValue);
        boolQueryBuilder.must(matchQuery);
    }

    return QueryBuilders.nestedQuery(nestedPath, boolQueryBuilder);
}
EN

回答 2

Stack Overflow用户

发布于 2021-02-07 02:21:31

请在下面找到工作代码片段(使用Rest高级客户端):

祝好运,

Wim

代码语言:javascript
运行
复制
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

    BoolQueryBuilder boolQuery = new BoolQueryBuilder();
    boolQuery.filter(QueryBuilders.termQuery("useCase", useCase));
    boolQuery.filter(QueryBuilders.termQuery("customerId", customerId));

    sourceBuilder.query(boolQuery).size(SIZE_OF_ES_QUERY_RESULT);
    sourceBuilder.timeout(new TimeValue(retrieveEventsTimeOutValueInMs, TimeUnit.MILLISECONDS));

    SearchRequest searchRequest = new SearchRequest().source(sourceBuilder);

    searchResponse = restClient.search(searchRequest, RequestOptions.DEFAULT);

    SearchHits hits = searchResponse.getHits();
    .....
票数 0
EN

Stack Overflow用户

发布于 2021-02-08 00:14:45

请找到下面的查询示例(逻辑与我的第一个答案相同,但完全集中在您的索引上)。我在best_practice.code和work_field.choice_field.key上搜索。查询可以完美地工作。使用此示例并将其应用于您的Java代码。应该不会有任何问题。

代码语言:javascript
运行
复制
curl -X GET -H "Content-Type:application/json" localhost:9200/stackoverflow_20210207/best_practices/_count -d'
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "best_practice.code.keyword": "A002"
          }
        }, 
        {
          "match": {
            "work_field.choice_field.key.keyword": "B078"
          }
        }
      ]
    }
  }
}
' | json_pp
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66078587

复制
相关文章

相似问题

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