2017-04-17 110 views
2

我正在嘗試在搜索的彈性搜索中獲得組的唯一值。我無法弄清楚爲什麼這不行爲。彈性搜索唯一字段值

我已經經歷了許多StackOverflow問題,並閱讀了大部分時間的文檔。沒有什麼似乎爲我工作,下面我提供了我最後的嘗試。

是否有任何理由有人想要一次返回相同的結果?也許是文檔的不同版本?


在這個例子中,我想所有mfr_id的的上市,他們的mfr_desc爲好。我正在通過一個類型運行這個來搜索文檔字段值。看來Agg條款是完成這個任務的方式,有沒有人看到我做錯了什麼?


1:API調用

GET /inventory/item/_search 
{ 
    "size": 0, 
    "_source": ["mfr_id", "mfr_desc"], 
    "aggs": { 
    "unique_vals": { 
     "terms": { 
     "field": "mfr_id.keyword" 
     /** I have to use .keyword, seems like my mappings isn't working */ 
     } 
    } 
    } 
} 

2:映射文件

我做了批量導入後運行的映射是非常簡單的。我讀,如果你想有一個唯一的查詢不密鑰分析:

{ 
    "index": "inventory", 
    "body": { 
    "settings": { 
     "number_of_shards": 1 
    }, 
    "mappings": { 
     "_default_": { 
     "properties": { 
      "mfr_id": { 
      "type": "string", 
      "index": "not_analyzed" 
      } 
     } 
     } 
    } 
    } 
} 

3:我的結果 聚集了〜10個記錄時,大約有100我真的很希望能夠得到_source如果可能的話,這些領域不僅僅是一個關鍵。

{ 
    "took": 3, 
    "timed_out": false, 
    "_shards": { 
    "total": 1, 
    "successful": 1, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 49341, 
    "max_score": 0, 
    "hits": [] 
    }, 
    "aggregations": { 
    "unique_vals": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 6815, 
     "buckets": [ 
     { 
      "key": "14", 
      "doc_count": 24292 
     }, 
     { 
      "key": "33", 
      "doc_count": 5508 
     }, 
     ... 

回答

1

我真的很希望能夠獲得超過 只是一個關鍵的_source領域,如果這是可能的。

我想,你只有一個選擇,我面臨同樣的問題。試試這個: -

{ 
    "aggregations": { 
     "byId": { 
      "terms": { 
       "field": "mfr_id" 
      }, 
      "aggs": { 
       "byDesc": { 
        "terms": { 
         "field": "mfr_desc" 
        } 
       } 
      } 
     } 
    } 
} 

現在,您將在遍歷彈性搜索JAVA API的同時獲得id和desc。

Terms aTerms = aAggregations.get("byId"); 
aTerms.getBuckets().stream().forEach(aBucketById-> { 
      Terms aTermsDesc = aBucketById.getAggregations().get("byDesc"); 
      aTermsDesc.getBuckets().stream().forEach(aBucketByDesc -> { 
//store id and desc 
    }); 
}); 
+1

哇,謝謝!我不會試過這個。我感到驚訝的是,文件並不清晰。它沒有提供這樣的例子;或者如果確實存在,我找不到它。這很聰明,我想知道爲什麼像這樣簡單這樣的功能是如此微不足道。另外,你的個人資料中有非常好的技能。 – JREAM

+0

感謝您的讚美:) –

1

我會使用一個過濾器,它比聚合具有更好的性能。

在聚合中,您將獲得所有文檔,並且只會應用聚合。如果使用過濾器,則只會獲得與過濾器匹配的文檔,並且還可以緩存過濾器。

{ 
    "query": { 
     "constant_score": { 
      "filter": { 
       "exists": { 
        "field": "mfr_id" 
       } 
      } 
     } 
    } 
}