0
問題域具有許多令牌顯示在其上的信息亭。令牌僅由一個發佈者發佈,並且可以存在於多個信息亭中。信息亭邏輯根據該信息亭中存在的令牌接受/拒絕用戶。ElasticSearch中唯一嵌套文檔的計數
我們的彈性映射是這樣的:
"mappings": {
"Kiosk": {
"dynamic": "strict",
"properties": {
"kioskId": {
"type": "keyword"
},
"token": {
"type": "nested",
"include_in_parent": true,
"properties": {
"tokenId": {
"type": "keyword"
},
"issuer": {
"type": "keyword"
}
}
}
}
}
}
下面是兩個典型的文件:
Kiosk1
"kioskId": "123",
"token": {
"tokenId": "fp1",
"issuer": "i1"
Kiosk2
"kioskId": "321",
"token": [
{
"tokenId": "fp1",
"issuer": "i1"
},
{
"tokenId": "fp2",
"issuer": "i2"
}
]
現在,問的是找到由發行人分時段的系統中所有的獨特標記的數量。找到它們一直沒有運氣。我們嘗試此查詢:
POST _search
{
"aggs": {
"state": {
"nested": {
"path": "token"
},
"aggs": {
"TOKENS_BY_ISSUER": {
"terms": {
"field": "token.issuer"
}
}
}
}
}
}
這顯然給出了這樣的結果:
"aggregations": {
"state": {
"doc_count": 3,
"TOKENS_BY_ISSUER": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "i1",
"doc_count": 2
},
{
"key": "i2",
"doc_count": 1
}
]
}
}
}
有沒有辦法知道,只有兩個代幣系統中的每個由I1和I2發出?像這樣的東西...
"buckets": [
{
"key": "i1",
"doc_count": 1
},
{
"key": "i2",
"doc_count": 1
}
]
如果不是,映射哪裏出錯了?我覺得這不是一個不尋常的映射。請注意,爲簡潔起見,我截斷了此處發佈的映射,我們在令牌下還有嵌套級別。這些額外的嵌套級別攜帶特定於令牌及其父級信息亭的字段。
謝謝。這有幫助,但正如你指出的那樣,它是近似的,對於我們需要確切結果的場景是不可用的。 – Sau
它在許多用例中的準確性和超快速度。 但是當系統中的唯一token.tokenId超過幾十萬時,不會推薦。 –