我正在尝试在搜索中获取仅在弹性搜索中的唯一值组。我无法弄清楚为什么这不起作用。
我已经阅读了很多StackOverflow问题,并在一天中的大部分时间阅读了文档。似乎没有什么对我有用,下面我提供了我最后尝试做的事情。
是否有人想要反复返回相同的结果?也许对于不同版本的文档?
在这个示例中,我想要列出所有mfr_id
和他们的mfr_desc
。我在一个类型上运行它来搜索文档字段值。似乎Agg Terms是实现这一目标的方式,有人看到我做错了吗?
1:API调用
GET /inventory/item/_search
{
"size": 0,
"_source": ["mfr_id", "mfr_desc"],
"aggs": {
"unique_vals": {
"terms": {
"field": "mfr_id.keyword"
/** I have to use .keyword, seems like my mappings isn't working */
}
}
}
}
2:映射文件
执行批量导入后运行的映射非常简单。如果您想要一个独特的查询,我会读到不分析密钥:
{
"index": "inventory",
"body": {
"settings": {
"number_of_shards": 1
},
"mappings": {
"_default_": {
"properties": {
"mfr_id": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
}
3:我的结果
当大约有100时,聚合有大约10条记录。如果可能的话,我真的希望能够获得_source
字段而不仅仅是密钥。
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 49341,
"max_score": 0,
"hits": []
},
"aggregations": {
"unique_vals": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 6815,
"buckets": [
{
"key": "14",
"doc_count": 24292
},
{
"key": "33",
"doc_count": 5508
},
...
答案 0 :(得分:1)
我会使用过滤器,它具有比聚合更好的性能。
在聚合中,您获得所有文档,而不是应用聚合。如果您使用过滤器,则只能获得与过滤器匹配的文档,并且还可以缓存过滤器。
{
"query": {
"constant_score": {
"filter": {
"exists": {
"field": "mfr_id"
}
}
}
}
}
答案 1 :(得分:1)
我真的希望能够获得超过的_source字段 如果可能的话,只需一把钥匙。
我认为,你只有一个选择,我遇到了同样的问题。试试这个: -
{
"aggregations": {
"byId": {
"terms": {
"field": "mfr_id"
},
"aggs": {
"byDesc": {
"terms": {
"field": "mfr_desc"
}
}
}
}
}
}
现在,在迭代Elastic search JAVA API时,您将获得id和desc。
Terms aTerms = aAggregations.get("byId");
aTerms.getBuckets().stream().forEach(aBucketById-> {
Terms aTermsDesc = aBucketById.getAggregations().get("byDesc");
aTermsDesc.getBuckets().stream().forEach(aBucketByDesc -> {
//store id and desc
});
});