グラフ探索API

グラフ探索APIを使用すると、Elasticsearchデータストリームまたはインデックス内のドキュメントや用語に関する情報を抽出し、要約できます。

このAPIの動作を理解する最も簡単な方法は、Graph UIを使用して接続を探索することです。最後のリクエストパネルから、_exploreエンドポイントに送信された最新のリクエストを表示できます。詳細については、Graphの始め方を参照してください。

探索APIの使用に関する追加情報については、Graphのトラブルシューティングおよび制限事項のトピックを参照してください。

グラフ探索APIはデフォルトで有効になっています。グラフ探索APIおよびKibanaのGraph UIへのアクセスを無効にするには、xpack.graph.enabled: falseelasticsearch.ymlに追加します。

リクエスト

POST <target>/_graph/explore

説明

_explore APIへの最初のリクエストには、関心のあるドキュメントを特定し、グラフに含めたい頂点と接続を定義するフィールドを指定するシードクエリが含まれています。その後の_exploreリクエストでは、関心のある1つ以上の頂点からスパイダーアウトすることができます。すでに返された頂点を除外することができます。

リクエストボディ

  • クエリ
  • 関心のあるドキュメントを特定するシードクエリ。任意の有効なElasticsearchクエリを使用できます。例えば:

Js

  1. "query": {
  2. "bool": {
  3. "must": {
  4. "match": {
  5. "query.raw": "midi"
  6. }
  7. },
  8. "filter": [
  9. {
  10. "range": {
  11. "query_time": {
  12. "gte": "2015-10-01 00:00:00"
  13. }
  14. }
  15. }
  16. ]
  17. }
  18. }
  • 頂点
  • グラフに頂点として含めたい用語を含む1つ以上のフィールドを指定します。例えば:

Js

  1. "vertices": [
  2. {
  3. "field": "product"
  4. }
  5. ]
  1. - フィールド
  2. - 関心のあるドキュメント内のフィールドを特定します。
  3. - 含める
  4. - スパイダーアウトしたい出発点を形成する関心のある用語を特定します。含める句を指定する場合、シードクエリを指定する必要はありません。含める句は、リストされた用語のいずれかを含むドキュメントを暗黙的にクエリします。単純な文字列の配列を指定するだけでなく、`````term`````および`````boost`````の値を持つオブジェクトを渡して特定の用語の一致を強化することもできます。
  5. - 除外
  6. - `````exclude`````句は、指定された用語が結果に含まれるのを防ぎます。
  7. - サイズ
  8. - 各フィールドに対して返される頂点用語の最大数を指定します。デフォルトは5です。
  9. - min_doc_count
  10. - 有用な接続と見なされるために、用語のペアを含む必要があるドキュメントの数を指定します。この設定は確実性の閾値として機能します。デフォルトは3です。
  11. - shard_min_doc_count
  12. - この高度な設定は、特定のシャード上で用語のペアを含む必要があるドキュメントの数を制御します。デフォルトは2です。
  13. - 接続
  14. - 指定された頂点に関連する用語を抽出したい1つ以上のフィールドを指定します。例えば:
  15. #### Js
  16. ``````js
  17. "connections": {
  18. "vertices": [
  19. {
  20. "field": "query.raw"
  21. }
  22. ]
  23. }
  24. `

接続はconnectionsオブジェクト内にネストされ、データ内の追加の関係を探索できます。ネストの各レベルはホップと見なされ、グラフ内の近接はしばしばホップの深さで説明されます。

  1. - クエリ
  2. - 接続された用語を探索する際にGraph APIを制約するオプションのガイドクエリです。例えば、最近のドキュメントを特定するクエリを指定して、Graph APIに古いデータを無視させることができます。
  3. - 頂点
  4. - 興味のあるフィールドを含みます。例えば:
  5. #### Js
  6. ``````js
  7. "vertices": [
  8. {
  9. "field": "query.raw",
  10. "size": 5,
  11. "min_doc_count": 10,
  12. "shard_min_doc_count": 3
  13. }
  14. ]
  15. `
  • コントロール
  • グラフを構築する方法をGraph APIに指示します。
    controlsのプロパティ
    • use_significance
    • use_significanceフラグは、関連する用語をフィルタリングし、クエリに大きく関連する用語のみを含めます。重要性を計算するために使用されるアルゴリズムについては、significant_terms集約を参照してください。デフォルトはtrueです。
    • sample_size
    • 各ホップは、各シャードで最も一致するドキュメントのサンプルを考慮します。サンプルを使用すると、実行速度が向上し、意味的に関連する用語に焦点を当てた探索が維持されます。非常に小さな値(50未満)は、用語間の重要な接続を特定するための十分な証拠の重みを提供しない可能性があります。非常に大きなサンプルサイズは、結果の質を希薄にし、実行時間を増加させる可能性があります。デフォルトは100ドキュメントです。
    • timeout
    • 探索が停止され、これまでに収集された結果が返されるまでのミリ秒単位の時間の長さ。このタイムアウトは、最善の努力に基づいて尊重されます。例えば、フィールドデータがフィールドにロードされる際に長い一時停止が発生した場合、実行がこのタイムアウトを超える可能性があります。
    • sample_diversity
    • トップ一致するドキュメントのサンプルが単一の結果ソースによって支配されるのを避けるために、サンプルの多様性を要求する必要がある場合があります。これを行うには、単一値フィールドを選択し、そのフィールドの値ごとに最大ドキュメント数を設定します。例えば:

Js

  1. "sample_diversity": {
  2. "field": "category.raw",
  3. "max_docs_per_value": 500
  4. }

基本的な探索

最初の検索は通常、強く関連する用語を特定するクエリから始まります。

Python

  1. resp = client.graph.explore(
  2. index="clicklogs",
  3. query={
  4. "match": {
  5. "query.raw": "midi"
  6. }
  7. },
  8. vertices=[
  9. {
  10. "field": "product"
  11. }
  12. ],
  13. connections={
  14. "vertices": [
  15. {
  16. "field": "query.raw"
  17. }
  18. ]
  19. },
  20. )
  21. print(resp)

Js

  1. const response = await client.graph.explore({
  2. index: "clicklogs",
  3. query: {
  4. match: {
  5. "query.raw": "midi",
  6. },
  7. },
  8. vertices: [
  9. {
  10. field: "product",
  11. },
  12. ],
  13. connections: {
  14. vertices: [
  15. {
  16. field: "query.raw",
  17. },
  18. ],
  19. },
  20. });
  21. console.log(response);

コンソール

  1. POST clicklogs/_graph/explore
  2. {
  3. "query": {
  4. "match": {
  5. "query.raw": "midi"
  6. }
  7. },
  8. "vertices": [
  9. {
  10. "field": "product"
  11. }
  12. ],
  13. "connections": {
  14. "vertices": [
  15. {
  16. "field": "query.raw"
  17. }
  18. ]
  19. }
  20. }
クエリで探索をシードします。この例では、”midi”という用語を検索した人々のクリックログを検索しています。
グラフに含める頂点を特定します。この例では、”midi”の検索に大きく関連する製品コードを探しています。
接続を見つけます。この例では、”midi”の検索に関連する製品をクリックした人々を導いた他の検索用語を探しています。

探索APIからの応答は次のようになります:

Js

  1. {
  2. "took": 0,
  3. "timed_out": false,
  4. "failures": [],
  5. "vertices": [
  6. {
  7. "field": "query.raw",
  8. "term": "midi cable",
  9. "weight": 0.08745858139552132,
  10. "depth": 1
  11. },
  12. {
  13. "field": "product",
  14. "term": "8567446",
  15. "weight": 0.13247784285434397,
  16. "depth": 0
  17. },
  18. {
  19. "field": "product",
  20. "term": "1112375",
  21. "weight": 0.018600718471158982,
  22. "depth": 0
  23. },
  24. {
  25. "field": "query.raw",
  26. "term": "midi keyboard",
  27. "weight": 0.04802242866755111,
  28. "depth": 1
  29. }
  30. ],
  31. "connections": [
  32. {
  33. "source": 0,
  34. "target": 1,
  35. "weight": 0.04802242866755111,
  36. "doc_count": 13
  37. },
  38. {
  39. "source": 2,
  40. "target": 3,
  41. "weight": 0.08120623870976627,
  42. "doc_count": 23
  43. }
  44. ]
  45. }
発見されたすべての頂点の配列。頂点はインデックスされた用語であり、フィールドと用語の値が提供されます。weight属性は、重要性スコアを指定します。depth属性は、用語が最初に遭遇したホップレベルを指定します。

| | 配列内の頂点間の接続。sourceおよびtargetプロパティは頂点配列にインデックスされ、探索の一部としてどの頂点用語が他の用語に導いたかを示します。doc_count値は、サンプルセット内のこの用語のペアを含むドキュメントの数を示します(これはデータストリームまたはインデックス内のすべてのドキュメントのグローバルカウントではありません)。

オプショナルコントロール

デフォルトの設定は、ノイズの多いデータを除去し、データから”全体像”を取得するように構成されています。この例では、グラフの構築方法に影響を与える追加のパラメータを指定する方法を示します。

すべてのドキュメントが関心のある場合の詳細な法医学的評価のための設定を調整するためのヒントについては、トラブルシューティングガイドを参照してください。

Python

  1. resp = client.graph.explore(
  2. index="clicklogs",
  3. query={
  4. "match": {
  5. "query.raw": "midi"
  6. }
  7. },
  8. controls={
  9. "use_significance": False,
  10. "sample_size": 2000,
  11. "timeout": 2000,
  12. "sample_diversity": {
  13. "field": "category.raw",
  14. "max_docs_per_value": 500
  15. }
  16. },
  17. vertices=[
  18. {
  19. "field": "product",
  20. "size": 5,
  21. "min_doc_count": 10,
  22. "shard_min_doc_count": 3
  23. }
  24. ],
  25. connections={
  26. "query": {
  27. "bool": {
  28. "filter": [
  29. {
  30. "range": {
  31. "query_time": {
  32. "gte": "2015-10-01 00:00:00"
  33. }
  34. }
  35. }
  36. ]
  37. }
  38. },
  39. "vertices": [
  40. {
  41. "field": "query.raw",
  42. "size": 5,
  43. "min_doc_count": 10,
  44. "shard_min_doc_count": 3
  45. }
  46. ]
  47. },
  48. )
  49. print(resp)

Js

  1. const response = await client.graph.explore({
  2. index: "clicklogs",
  3. query: {
  4. match: {
  5. "query.raw": "midi",
  6. },
  7. },
  8. controls: {
  9. use_significance: false,
  10. sample_size: 2000,
  11. timeout: 2000,
  12. sample_diversity: {
  13. field: "category.raw",
  14. max_docs_per_value: 500,
  15. },
  16. },
  17. vertices: [
  18. {
  19. field: "product",
  20. size: 5,
  21. min_doc_count: 10,
  22. shard_min_doc_count: 3,
  23. },
  24. ],
  25. connections: {
  26. query: {
  27. bool: {
  28. filter: [
  29. {
  30. range: {
  31. query_time: {
  32. gte: "2015-10-01 00:00:00",
  33. },
  34. },
  35. },
  36. ],
  37. },
  38. },
  39. vertices: [
  40. {
  41. field: "query.raw",
  42. size: 5,
  43. min_doc_count: 10,
  44. shard_min_doc_count: 3,
  45. },
  46. ],
  47. },
  48. });
  49. console.log(response);

コンソール

  1. POST clicklogs/_graph/explore
  2. {
  3. "query": {
  4. "match": {
  5. "query.raw": "midi"
  6. }
  7. },
  8. "controls": {
  9. "use_significance": false,
  10. "sample_size": 2000,
  11. "timeout": 2000,
  12. "sample_diversity": {
  13. "field": "category.raw",
  14. "max_docs_per_value": 500
  15. }
  16. },
  17. "vertices": [
  18. {
  19. "field": "product",
  20. "size": 5,
  21. "min_doc_count": 10,
  22. "shard_min_doc_count": 3
  23. }
  24. ],
  25. "connections": {
  26. "query": {
  27. "bool": {
  28. "filter": [
  29. {
  30. "range": {
  31. "query_time": {
  32. "gte": "2015-10-01 00:00:00"
  33. }
  34. }
  35. }
  36. ]
  37. }
  38. },
  39. "vertices": [
  40. {
  41. "field": "query.raw",
  42. "size": 5,
  43. "min_doc_count": 10,
  44. "shard_min_doc_count": 3
  45. }
  46. ]
  47. }
  48. }
use_significanceを無効にして、クエリに大きく関連する用語だけでなく、すべての関連用語を含めます。
各シャードでより大きなドキュメントセットを考慮するためにサンプルサイズを増やします。
結果を返す前にグラフリクエストがどれくらいの時間実行されるかを制限します。
特定の単一値フィールド(カテゴリフィールドなど)で値ごとのドキュメント数に制限を設定して、サンプルの多様性を確保します。
各フィールドに対して返される頂点用語の最大数を制御します。
用語のペアを含む必要があるドキュメントの数を指定して、有用な接続と見なされるための確実性の閾値を設定します。
接続がグローバルに考慮される前に、シャード上で用語のペアを含む必要があるドキュメントの数を指定します。
接続された用語を探索する際に考慮されるドキュメントを制限します。

スパイダー操作

最初の検索の後、通常は関心のある頂点を選択し、追加の接続があるかどうかを確認したいと思います。グラフ用語では、この操作は”スパイダー”と呼ばれます。一連のリクエストを送信することで、関連情報のグラフを徐々に構築できます。

スパイダーアウトするには、2つのことを指定する必要があります:

  • 追加の接続を見つけたい頂点のセット
  • 結果から除外したい既に知っている頂点のセット。

この情報は、includeおよびexclude句を使用して指定します。例えば、次のリクエストは製品1854873から始まり、その製品に関連する追加の検索用語を見つけるためにスパイダーアウトします。用語”midi”、”midiキーボード”、および”シンセ”は結果から除外されます。

Python

  1. resp = client.graph.explore(
  2. index="clicklogs",
  3. vertices=[
  4. {
  5. "field": "product",
  6. "include": [
  7. "1854873"
  8. ]
  9. }
  10. ],
  11. connections={
  12. "vertices": [
  13. {
  14. "field": "query.raw",
  15. "exclude": [
  16. "midi keyboard",
  17. "midi",
  18. "synth"
  19. ]
  20. }
  21. ]
  22. },
  23. )
  24. print(resp)

Js

  1. const response = await client.graph.explore({
  2. index: "clicklogs",
  3. vertices: [
  4. {
  5. field: "product",
  6. include: ["1854873"],
  7. },
  8. ],
  9. connections: {
  10. vertices: [
  11. {
  12. field: "query.raw",
  13. exclude: ["midi keyboard", "midi", "synth"],
  14. },
  15. ],
  16. },
  17. });
  18. console.log(response);

コンソール

  1. POST clicklogs/_graph/explore
  2. {
  3. "vertices": [
  4. {
  5. "field": "product",
  6. "include": [ "1854873" ]
  7. }
  8. ],
  9. "connections": {
  10. "vertices": [
  11. {
  12. "field": "query.raw",
  13. "exclude": [
  14. "midi keyboard",
  15. "midi",
  16. "synth"
  17. ]
  18. }
  19. ]
  20. }
  21. }
開始する頂点はinclude句の用語の配列として指定されます。
exclude句は、すでに知っている用語が結果に含まれるのを防ぎます。