サンプラー集約

トップスコアのドキュメントのサンプルに対して、サブ集約の処理を制限するために使用されるフィルタリング集約です。

使用例:

  • 低品質のマッチの非常に長いテールではなく、高い関連性のマッチに分析の焦点を絞る
  • サンプルのみを使用して有用な結果を生成できる集約の実行コストを削減する例: significant_terms

例:

人気のある用語javascriptまたは希少な用語kibanaに対するStackOverflowデータのクエリは、多くのドキュメントにマッチします - そのほとんどはKibanaという単語を欠いています。私たちのクエリの最も興味深い部分にマッチする可能性が高いトップスコアのドキュメントにsignificant_terms集約を焦点を合わせるために、サンプルを使用します。

Python

  1. resp = client.search(
  2. index="stackoverflow",
  3. size="0",
  4. query={
  5. "query_string": {
  6. "query": "tags:kibana OR tags:javascript"
  7. }
  8. },
  9. aggs={
  10. "sample": {
  11. "sampler": {
  12. "shard_size": 200
  13. },
  14. "aggs": {
  15. "keywords": {
  16. "significant_terms": {
  17. "field": "tags",
  18. "exclude": [
  19. "kibana",
  20. "javascript"
  21. ]
  22. }
  23. }
  24. }
  25. }
  26. },
  27. )
  28. print(resp)

Ruby

  1. response = client.search(
  2. index: 'stackoverflow',
  3. size: 0,
  4. body: {
  5. query: {
  6. query_string: {
  7. query: 'tags:kibana OR tags:javascript'
  8. }
  9. },
  10. aggregations: {
  11. sample: {
  12. sampler: {
  13. shard_size: 200
  14. },
  15. aggregations: {
  16. keywords: {
  17. significant_terms: {
  18. field: 'tags',
  19. exclude: [
  20. 'kibana',
  21. 'javascript'
  22. ]
  23. }
  24. }
  25. }
  26. }
  27. }
  28. }
  29. )
  30. puts response

Js

  1. const response = await client.search({
  2. index: "stackoverflow",
  3. size: 0,
  4. query: {
  5. query_string: {
  6. query: "tags:kibana OR tags:javascript",
  7. },
  8. },
  9. aggs: {
  10. sample: {
  11. sampler: {
  12. shard_size: 200,
  13. },
  14. aggs: {
  15. keywords: {
  16. significant_terms: {
  17. field: "tags",
  18. exclude: ["kibana", "javascript"],
  19. },
  20. },
  21. },
  22. },
  23. },
  24. });
  25. console.log(response);

コンソール

  1. POST /stackoverflow/_search?size=0
  2. {
  3. "query": {
  4. "query_string": {
  5. "query": "tags:kibana OR tags:javascript"
  6. }
  7. },
  8. "aggs": {
  9. "sample": {
  10. "sampler": {
  11. "shard_size": 200
  12. },
  13. "aggs": {
  14. "keywords": {
  15. "significant_terms": {
  16. "field": "tags",
  17. "exclude": [ "kibana", "javascript" ]
  18. }
  19. }
  20. }
  21. }
  22. }
  23. }

レスポンス:

コンソール-結果

  1. {
  2. ...
  3. "aggregations": {
  4. "sample": {
  5. "doc_count": 200,
  6. "keywords": {
  7. "doc_count": 200,
  8. "bg_count": 650,
  9. "buckets": [
  10. {
  11. "key": "elasticsearch",
  12. "doc_count": 150,
  13. "score": 1.078125,
  14. "bg_count": 200
  15. },
  16. {
  17. "key": "logstash",
  18. "doc_count": 50,
  19. "score": 0.5625,
  20. "bg_count": 50
  21. }
  22. ]
  23. }
  24. }
  25. }
  26. }
合計で200のドキュメントがサンプリングされました。ネストされたsignificant_terms集約を実行するコストは、
したがって制限され、無制限ではありませんでした。
  1. #### Python
  2. ``````python
  3. resp = client.search(
  4. index="stackoverflow",
  5. size="0",
  6. query={
  7. "query_string": {
  8. "query": "tags:kibana OR tags:javascript"
  9. }
  10. },
  11. aggs={
  12. "low_quality_keywords": {
  13. "significant_terms": {
  14. "field": "tags",
  15. "size": 3,
  16. "exclude": [
  17. "kibana",
  18. "javascript"
  19. ]
  20. }
  21. }
  22. },
  23. )
  24. print(resp)
  25. `

Ruby

  1. response = client.search(
  2. index: 'stackoverflow',
  3. size: 0,
  4. body: {
  5. query: {
  6. query_string: {
  7. query: 'tags:kibana OR tags:javascript'
  8. }
  9. },
  10. aggregations: {
  11. low_quality_keywords: {
  12. significant_terms: {
  13. field: 'tags',
  14. size: 3,
  15. exclude: [
  16. 'kibana',
  17. 'javascript'
  18. ]
  19. }
  20. }
  21. }
  22. }
  23. )
  24. puts response

Js

  1. const response = await client.search({
  2. index: "stackoverflow",
  3. size: 0,
  4. query: {
  5. query_string: {
  6. query: "tags:kibana OR tags:javascript",
  7. },
  8. },
  9. aggs: {
  10. low_quality_keywords: {
  11. significant_terms: {
  12. field: "tags",
  13. size: 3,
  14. exclude: ["kibana", "javascript"],
  15. },
  16. },
  17. },
  18. });
  19. console.log(response);

コンソール

  1. POST /stackoverflow/_search?size=0
  2. {
  3. "query": {
  4. "query_string": {
  5. "query": "tags:kibana OR tags:javascript"
  6. }
  7. },
  8. "aggs": {
  9. "low_quality_keywords": {
  10. "significant_terms": {
  11. "field": "tags",
  12. "size": 3,
  13. "exclude": [ "kibana", "javascript" ]
  14. }
  15. }
  16. }
  17. }

レスポンス:

コンソール-結果

  1. {
  2. ...
  3. "aggregations": {
  4. "low_quality_keywords": {
  5. "doc_count": 600,
  6. "bg_count": 650,
  7. "buckets": [
  8. {
  9. "key": "angular",
  10. "doc_count": 200,
  11. "score": 0.02777,
  12. "bg_count": 200
  13. },
  14. {
  15. "key": "jquery",
  16. "doc_count": 200,
  17. "score": 0.02777,
  18. "bg_count": 200
  19. },
  20. {
  21. "key": "logstash",
  22. "doc_count": 50,
  23. "score": 0.0069,
  24. "bg_count": 50
  25. }
  26. ]
  27. }
  28. }
  29. }

shard_size

shard_sizeパラメータは、各シャードで処理されるサンプルに収集されるトップスコアのドキュメントの数を制限します。デフォルト値は100です。

制限事項

breadth_first集約の下にネストできません

品質ベースのフィルタであるサンプラー集約は、各ドキュメントに対して生成された関連スコアにアクセスする必要があります。したがって、collect_modeがデフォルトのdepth_firstモードからbreadth_firstに切り替えられたterms集約の下にネストすることはできません。これによりスコアが破棄されます。この状況ではエラーが発生します。