簡體   English   中英

Elasticsearch:如何僅檢索所需的嵌套對象

[英]Elasticsearch : How to retrieve only the desired nested objects

我的Elasticsearch索引具有以下映射結構。

{
  "users": {
    "mappings": {
      "user-type": {
        "properties": {
          "lastModifiedBy": {
            "type": "string"
          },
          "lastModifiedDate": {
            "type": "date",
            "format": "dateOptionalTime"
          },
          "details": {
            "type": "nested",
            "properties": {
              "lastModifiedBy": {
                "type": "string"
              },
              "lastModifiedDate": {
                "type": "date",
                "format": "dateOptionalTime"
              },
              "views": {
                "type": "nested",
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "name": {
                    "type": "string"
                  },
                  "properties": {
                    "properties": {
                      "name": {
                        "type": "string"
                      },
                      "type": {
                        "type": "string"
                      },
                      "value": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

基本上我只想基於索引ID和視圖ID(details.views.id)檢索詳細信息內的視圖對象。

我已經嘗試使用下面的Java代碼。但似乎無法正常工作。

SearchRequestBuilder srq =  this.client.prepareSearch(this.indexName)
    .setTypes(this.type)
    .setQuery(QueryBuilders.termQuery("_id", sid))
    .setPostFilter(FilterBuilders.nestedFilter("details.views", 
         FilterBuilders.termFilter("details.views.id", id)));

以下是此Java代碼的查詢結構。

{
  "query": {
    "term": {
      "_id": "123"
    }
  },
  "post_filter": {
    "nested": {
      "filter": {
        "term": {
          "details.views.id": "def"
        }
      },
      "path": "details.views"
    }
  }
}

由於detailsnestedview是嵌套在details ,因此,您基本上還需要兩個nested過濾器(每個級別一個)+ _id字段的約束最好由ids查詢完成 查詢DSL如下所示:

{
  "query": {
    "ids": {
      "values": [
        "123"
      ]
    }
  },
  "post_filter": {
    "nested": {
      "filter": {
        "nested": {
          "path": "details.view",
          "filter": {
            "term": {
              "details.views.id": "def"
            }
          }
        }
      },
      "path": "details"
    }
  }
}

將其轉換為Java代碼會產生:

// 2nd-level nested filter
FilterBuilder detailsView = FilterBuilders.nestedFilter("details.views", 
    FilterBuilders.termFilter("details.views.id", id));

// 1st-level nested filter
FilterBuilder details = FilterBuilders.nestedFilter("details", detailsView);

// ids constraint
IdsQueryBuilder ids = QueryBuilders.idsQuery(this.type).addIds("123");

SearchRequestBuilder srq =  this.client.prepareSearch(this.indexName)
   .setTypes(this.type)
   .setQuery(ids)
   .setPostFilter(details);

PS:我@Paul說了第二句話,即始終先處理查詢DSL,並且當您知道已對所需的確切查詢進行了歸零后,便可以將其轉換為Java形式。

暫無
暫無

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

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