簡體   English   中英

ElasticSearch Java 客戶端查詢“雙重”嵌套對象

[英]ElasticSearch Java Client querying “Double” nested objects

我有這樣的彈性嵌套數據。 對於屬性, best_practice得到單嵌套查詢,屬性work_field得到雙嵌套查詢。

我想將雙嵌套結構的查詢(關於work_field )轉換為 Java 代碼

"_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 ),但不適用於雙重查詢。 如何將其轉換為雙嵌套?

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);
}

請在下面找到工作代碼片段(使用 Rest 高級客戶端):

祝你好運,

維姆

    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();
    .....

請在下面找到查詢示例(與我的第一個答案中的邏輯相同,但完全集中在您的索引上)。 我在 best_practice.code 和 work_field.choice_field.key 上進行搜索。 查詢完美運行。 使用此示例並將其應用到您的 Java 代碼中。 應該可以正常工作。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM