elasticsearch,Java,elasticsearch" /> elasticsearch,Java,elasticsearch" />

Java Elasticsearch:如何仅检索所需的嵌套对象

Java Elasticsearch:如何仅检索所需的嵌套对象,java,elasticsearch,Java,elasticsearch,下面是我的Elasticsearch索引的映射结构 { "users": { "mappings": { "user-type": { "properties": { "lastModifiedBy": { "type": "string" }, "lastModifiedDate": { "type": "date", "f

下面是我的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)检索details中的view对象

我试过下面的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"
    }
  }
}

由于
details
嵌套在
details
中,
view
嵌套在
details
中,因此您基本上也需要两个
嵌套的
过滤器(每个级别一个)+
\u id
字段上的约束最好使用。查询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表单。

你能提供一个你认为应该通过查询返回的示例文档吗,但是不是吗?在过去的一年里,我已经用Java编写了大量的ES查询,下面是我的建议:不要从用Java编写ES查询开始。我首先使用SoapUI(它是免费的)将查询发布到ES REST端点。一旦我的查询开始工作,我就把它转换成Java。您可以使用Poster通过浏览器发送查询,但需要保存所有示例查询;Poster只保存一个查询。@SloanAhrens它基本上不返回任何内容。我只希望看到与id匹配的单个视图对象。id为123的文档外观如何?您能解释一下post\u筛选器的用法吗?