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
}
}
}
}
}
}
但我仍然收到所有应用程序。
- 有没有办法接收唯一值?
- 也许有可能检查
logstash
数据库中是否存在某些值并避免再次发送?或者可以使用 fingerprint
插件并根据字段的值生成唯一的 _id
?如果我在该字段中收到相同的信息,它可能会生成相同的 ID,因此不会再次保存。
- 我还检查了是否可以在 Elasticsearch 中创建唯一字段,但我发现这是不可能的。
我在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
.
我已经阅读了很多关于这个主题的文章,因为我看到有人问过它,但我可以做到。
我正在尝试从索引中获取唯一值。
我有这样的东西:
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
}
}
}
}
}
}
但我仍然收到所有应用程序。
- 有没有办法接收唯一值?
- 也许有可能检查
logstash
数据库中是否存在某些值并避免再次发送?或者可以使用fingerprint
插件并根据字段的值生成唯一的_id
?如果我在该字段中收到相同的信息,它可能会生成相同的 ID,因此不会再次保存。
- 我还检查了是否可以在 Elasticsearch 中创建唯一字段,但我发现这是不可能的。
我在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
.