我已經閱讀了很多關于這個主題的內容,因為我已經看到之前有人問過它,但我可以做到這一點。
我正在嘗試從索引中獲取唯一值。
我有這樣的事情:
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 中創建唯一欄位,但我認為這是不可能的。
我還在彈性討論論壇中添加了這個問題:https ://discuss.elastic.co/t/distinct-values-dsl-query/302715
非常感謝您的幫助和時間
uj5u.com熱心網友回復:
- 有沒有辦法接收獨特的價值?
在這種情況下,我使用了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 $1}'
87dbad46d7c47f3714eb02ff70e18b94e4ee6523
它也可以作為第二個問題的答案。
- 我還檢查了是否有可能在 Elasticsearch 中創建唯一欄位,但我認為這是不可能的
絕對沒有。唯一的欄位將始終是_id。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/463950.html
標籤:弹性搜索
