如何做ElasticSearch Select Distinct

DyM*_*DyM 14 elasticsearch

我只想用elasticsearch做以下请求.

在SQL中:

Select distinct(id) from my_table where userid = '20' or activity = '9';
Run Code Online (Sandbox Code Playgroud)

我只有 :

{
   "query" : {
        "bool" : {
               "should" : [ 
                  { "term" : { "userid" : "20" } }, 
                  { "term" : { "activity" : "9" } }
               ]
         }
    }
}
Run Code Online (Sandbox Code Playgroud)

提前致谢 :)

Val*_*Val 23

你几乎就在那里,你只需要在查询中添加一个terms聚合

{
   "query" : {
        "bool" : {
               "should" : [ 
                  { "term" : { "userid" : "20" } }, 
                  { "term" : { "activity" : "9" } }
               ]
         }
    },
    "aggs":{
        "unique_ids": {
            "terms": {
                "field": "id"
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Val这样做我遇到“默认情况下在文本字段上禁用Fielddata。在[some_id]上设置fielddata=true,以便通过反转倒排索引将fielddata加载到内存中。请注意,但这可能会使用大量内存。” 有什么想法如何通过修改队列来避免它吗?另外,也许可以定义一个角色,而不是抛出唯一的元素,甚至可能采用一个元素的某些字段和另一个元素的某些字段? (3认同)

Cod*_*ker 7

由于上面的答案非常完美,如果您只想DISTNICT在某个字段上执行而不进行任何搜索等,那么只需使用aggs

这个SQL

SELECT DISTINCT FULL_NAME from users;
Run Code Online (Sandbox Code Playgroud)

相当于

POST users/_search
{
"aggs":{
        "unique_names": {
            "terms": {
                "field": "FULL_NAME.keyword"
            }
        }
    },
     "_source": false
  
}
Run Code Online (Sandbox Code Playgroud)

我知道这个答案与问题并不直接匹配,但我相信它会对 ES 堆栈的新手有所帮助。