我已经为一个问题挣扎了一段时间,所以我想我应该通过stackoverflow来解决这个问题。
“我的文档类型”有一个标题、一个语言字段(用于筛选)和一个分组id字段(我省略了所有其他字段以保持重点)
搜索文档时,我希望找到包含标题中文本的所有文档。对于每个唯一的分组id,我只需要一个文档。
我一直在关注tophits聚合,从我所看到的情况来看,它应该能够解决我的问题。
对我的索引运行此查询时:
{
"query": {
"match": {
"title": "dingo"
}
},
"aggs": {
"top-tags": {
"terms": {
"field": "groupId",
"size": 1000000
},
"aggs": {
"top_tag_hits": {
"top_hits": {
"_source": {
"include": [
"*"
]
},
"size": 1
}
}
}
}
}
}
我得到了以下回应(所有结果都使用相同的语言):
{
"took": 9,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 3,
"max_score": 0,
"hits": []
},
"aggregations": {
"top-tags": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [{
"key": "3044BC9E7C29450AAB2E4B6C9B35AAE2",
"doc_count": 2,
"top_tag_hits": {
"hits": {
"total": 2,
"max_score": 1.4983996,
"hits": [{
"_index": "elasticsearch",
"_type": "productdocument",
"_id": "FB15279FB18E4B34AD66ACAF69B96E9E",
"_score": 1.4983996,
"_source": {
"groupId": "3044BC9E7C29450AAB2E4B6C9B35AAE2",
"title": "wombat, dingo and zetapunga actionfigures",
}
}]
}
}
},
{
"key": "F11799ABD0C14B98ADF2554C84FF0DA0",
"doc_count": 1,
"top_tag_hits": {
"hits": {
"total": 1,
"max_score": 1.30684,
"hits": [{
"_index": "elasticsearch",
"_type": "productdocument",
"_id": "42562A25E4434A0091DE0C79A3E7F3F4",
"_score": 1.30684,
"_source": {
"groupId": "F11799ABD0C14B98ADF2554C84FF0DA0",
"title": "awesome dingo raptor"
}
}]
}
}
}]
}
}
}
这正是我所期望的(一个bucket中有两个命中,但该bucket只检索到一个文档)。然而,当我在NEST中尝试此操作时,似乎无法检索所有文档。
我的查询如下所示:
result = _elasticClient.Search<T>(s => s
.From(skip)
.Filter(fd => fd.Term(f => f.Language, language))
.Size(pageSize)
.SearchType(SearchType.Count)
.Query(
q => q.Wildcard(f => f.Title, query, 2.0)
|| q.Wildcard(f => f.Description, query)
)
.Aggregations(agd =>
agd.Terms("groupId", tagd => tagd
.Field("groupId")
.Size(100000) //We sadly need all products
)
.TopHits("top_tag_hits", thagd => thagd
.Size(1)
.Source(ssd => ssd.Include("*")))
));
var topHits = result.Aggs.TopHits("top_tag_hits");
var documents = topHits.Documents<ProductDocument>(); //contains only one document (I would expect it to contain two, one for each bucket)
检查调试器中的聚合会发现有一个带有2个桶的“groupId”聚合(并将我在“原始”查询中看到的内容与索引相匹配。只是没有任何明显的方法来检索文档)
所以我的问题是。我如何为每个桶检索顶部命中?还是我这样做完全错误?有没有其他方法来实现我正在尝试做的事情?
编辑
在我得到帮助之后,我能够检索我的结果如下:
result = _elasticClient.Search<T>(s => s
.From(skip)
.Filter(fd => fd.Term(f => f.Language, language))
.Size(pageSize)
.SearchType(SearchType.Count)
.Query(
q => q.Wildcard(f => f.Title, query, 2.0)
|| q.Wildcard(f => f.Description, query)
)
.Aggregations(agd =>
agd.Terms("groupId", tagd => tagd
.Field("groupId")
.Size(0)
.Aggregations(tagdaggs =>
tagdaggs.TopHits("top_tag_hits", thagd => thagd
.Size(1)))
)
)
);
var groupIdAggregation = result.Aggs.Terms("groupId");
var topHits =
groupIdAggregation.Items.Select(key => key.TopHits("top_tag_hits"))
.SelectMany(topHitMetric => topHitMetric.Documents<ProductDocument>()).ToList();
您的NEST查询尝试并行运行术语聚合和TopHits,而您的原始查询首先运行术语,然后为每个存储桶调用TopHits。
您只需将TopHits agg移动到嵌套查询中的术语中,即可使其正常工作。
这应该可以修复它:
.Aggregations(agd =>
agd.Terms("groupId", tagd => tagd
.Field("groupId")
.Size(0)
.Aggregations(tagdaggs =>
tagdaggs.TopHits("top_tag_hits", thagd => thagd
.Size(1)))
)
)
顺便说一下,您不必使用包含("*")
来包含所有字段。只需删除此选项,同时指定。size(0)
应该会为您返回所有可能的术语。
我在Elasticsearch中获得了大量数据。我的douments有一个名为“records”的嵌套字段,它包含一个包含多个字段的对象列表。 我希望能够从记录列表中查询特定的对象,因此我在查询中使用了inner_hits字段,但是这没有帮助,因为聚合使用大小0,所以没有返回结果。 我没有成功地使一个聚集只对inner_hits有效,因为无论查询是什么,聚集都返回记录中所有对象的结果。 这是我正在
如何获得空数组和美国的结果和
Elasticsearch版本:2.3.3 基本上,标题说明了一切。如果二个嵌套聚合下使用reverse_nested,尽管文档似乎通过限定范围(请参阅结果中的最后一个字段),但其后面的聚合不会以某种方式工作。 这里我准备了一个例子——一个文档是一个学生的注册日期和考试历史。 映射: 试验文件: 聚合查询(无实际意义): 结果是: ...您可以在其中看到聚合“newest_exam_date”不起
我有一个弹性搜索索引集合,如下所示, 现在我需要通过将与其值匹配来搜索文档。(是一些字段,其值存储在中)例如。对于字段,如果它是,则应与上述文档匹配。 我尝试将其映射为嵌套对象,但我无法编写查询来搜索与其相应值匹配的2个或更多的键id。
我是ES新手,正在努力解决嵌套聚合问题。这是我的虚拟数据对象([这是我的数据对象][1][1]:https://i.stack.imgur.com/X7oaM.png). 我只是想把“现代”领域的成本降到最低。 我已经阅读了以下关于我试图解决的问题的帖子。他们都没有帮助我解决问题 -弹性搜索6嵌套查询聚合-https://www.elastic.co/guide/en/elasticsearch/
这是我的示例文档,我在kibana的帮助下为类似文档编制索引。 现在在文件中,“体验”下的关键“品牌”是主集团“公司”的子集团。正如您在文档中看到的,“品牌”可能有类似于“其他”的条目,但由“公司”键分隔。类似的结构可以在文档内部和文档之间出现。我打算根据“品牌”和“公司”来汇总文档。我尝试的查询是- 我得到的错误为- 这是我的文档的映射- 我知道我的经验字段没有嵌套,可能是这个错误的原因。我对e