2017-04-17 10 views
2

のグループを検索するには、Elastic Searchのユニークな値のみを取得しようとしています。なぜこれが動作しないのか分かりません。弾性検索固有のフィールド値

私は多くのStackOverflowに関する質問を終え、ほとんどの日にドキュメントを読んでいます。私は私のために働くようには思えない、私は最後にやったことを私は提供した。

誰かが同じ結果を繰り返し返すことを望む理由はありますか?多分、ドキュメントの異なるバージョンのために?私はすべてのmfr_id年代のリストをしたいと思います。この例では


、及びその mfr_descにも。私はこれをドキュメントフィールドの値のみを検索するための型で実行しています。それはAgg Termsがこれを達成する方法であると思われます、誰かが私が間違っている何かを見ますか?


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:約100で、私は本当に_sourceを取得できるようにしたいと思いがあるとき私の結果は アグリゲーション〜10件のレコードを持っています可能であれば、単なるキー以上のフィールド。

{ 
    "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フィールドを取得できるようにしたいと思います。

私はあなたには1つのオプションしかないと思いますが、私は同じ問題に直面しています。これを試してください: -

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

ここで、Elastic search 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" 
       } 
      } 
     } 
    } 
}