DISTINCT 值 DSL 查询

DISTINCT values DSL query

我已经阅读了很多关于这个主题的文章,因为我看到有人问过它,但我可以做到。

我正在尝试从索引中获取唯一值。

我有这样的东西:

id | app_name       | url
1  | app_1          | https://subdomain.app_1.com
2  | app_1          | https://app_1.com
3  | app_2          | https://app_1.com
4  | app_3          | https://subdomain.app_3.com
5  | app_1          | https://app_3.com

我只想收到不同的 app_name:

app_1
app_2
app_3

我用 aggs 尝试的查询是:

GET app_index/_search
{
  "aggs": {
    "unique_apps": {
      "terms": {
        "field": "app_name",
      }
    }
  }
}

我也试过这里的一种群:

GET app_index/_search
{
  "aggs": {
    "unique_apps": {
      "terms": {
        "field": "app_name.keyword"
      },
      "aggs": {
        "oneRecord": {
          "top_hits": {
            "size": 1
          }
        }
      }
    }
  }
}

但我仍然收到所有应用程序。

我在elastic discuss forum也加了问题:https://discuss.elastic.co/t/distinct-values-dsl-query/302715

非常感谢您的帮助和时间

  • 有没有办法接收唯一值?

我在这种情况下使用了 fingerprint 插件。我已经根据字符串生成了一个唯一 ID。例如,如果我收到相同的 app_name 名称,它将始终生成相同的 _id,因此它不会在 elasticsearch 中重复。我在 logstash.conf 管道中添加了此配置,特别是在 filter 端:

fingerprint {
    source => ["app_name"]
    target => ["unique_id_by_app_name"]
    method => "SHA1"
  }

然后在 output:

    elasticsearch {
      hosts => "localhost:9200"
      index => "logstash_apps"
      document_id => "%{[unique_id_by_app_name]}"
    }

如果我再次收到具有相同甚至不同数据的 app_1,我将拥有相同的 ID,因为散列:

$ -> echo -n "app_1" | sha1sum | awk -F '  -' '{print }'
87dbad46d7c47f3714eb02ff70e18b94e4ee6523

也可以作为第二个问题的答案。

  • 我还检查了是否可以在 Elasticsearch 中创建唯一字段,但我发现这是不可能的

绝对没有。唯一字段将始终为 _id.