2017-03-16 79 views
0

我有如下的情景: 假设我有一个关系表:弹性搜索查询像SQL

Key1 Key2 Key3 Value 

A  x  v1  0 
A  x  v1  10 
B  x  v1  5 
A  y  v2  7 
A  y  v2  2 

这里我有(密钥1,密钥2,密钥3)的逻辑关键复合材料。现在我需要具有最大价值的记录。所以我期望下面的结果对应不同的逻辑键:

Key1 Key2 Key3 Value 

A  x  v1  10 
B  x  v1  5 
A  y  v2  7 

现在我想为它编写一个弹性搜索查询。有人可以给我一些想法吗?

+2

多级'terms'聚集会做的伎俩。更高效的方法是在索引时将该复合键添加为文档中的新字段,以便单个“词条”聚合可以获得所需的结果。 – Val

+0

实际上,我不想添加任何新字段,并且希望获得完整的记录,正如您在上面的预期结果中看到的那样。 – pbajpai21

回答

0

然后你可以用多层次terms聚集这样走:

{ 
    "size": 0, 
    "aggs": { 
    "key1": { 
     "terms": { 
     "field": "key1" 
     }, 
     "aggs": { 
     "key2": { 
      "terms": { 
      "field": "key2" 
      }, 
      "aggs": { 
      "key3": { 
       "terms": { 
       "field": "key3" 
       }, 
       "aggs": { 
       "doc": { 
        "top_hits": { 
        "sort": {"value": "desc"} 
        } 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+0

感谢您的回复,实际上我需要获取完整的文档,但是对于aggr,我们可以获得文档计数或数学函数值,如max,min或avg。 – pbajpai21

+0

我已经更新了我的答案,以获得具有给定密钥的最高值的文档。 – Val

+0

谢谢,查询正在工作,但由于我只对一个文档有最大值感兴趣,所以我们可以避免排序并通过某种方式获得最大值?这将是对查询的优化。 – pbajpai21