Java Elasticsearch:如何仅检索所需的嵌套对象
下面是我的Elasticsearch索引的映射结构Java Elasticsearch:如何仅检索所需的嵌套对象,java,elasticsearch,Java,elasticsearch,下面是我的Elasticsearch索引的映射结构 { "users": { "mappings": { "user-type": { "properties": { "lastModifiedBy": { "type": "string" }, "lastModifiedDate": { "type": "date", "f
{
"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筛选器的用法吗?