例: ジオロケーションに基づいてデータを強化する

geo_match 強化ポリシー は、地理的位置に基づいて受信ドキュメントに強化データを一致させるために、geo_shape クエリ を使用します。

次の例では、座標のセットに基づいて受信ドキュメントに郵便番号を追加する geo_match 強化ポリシーを作成します。その後、geo_match 強化ポリシーをインジェストパイプラインのプロセッサに追加します。

少なくとも1つの geo_shape フィールドを含むソースインデックスを作成するには、インデックス作成API を使用します。

Python

  1. resp = client.indices.create(
  2. index="postal_codes",
  3. mappings={
  4. "properties": {
  5. "location": {
  6. "type": "geo_shape"
  7. },
  8. "postal_code": {
  9. "type": "keyword"
  10. }
  11. }
  12. },
  13. )
  14. print(resp)

Ruby

  1. response = client.indices.create(
  2. index: 'postal_codes',
  3. body: {
  4. mappings: {
  5. properties: {
  6. location: {
  7. type: 'geo_shape'
  8. },
  9. postal_code: {
  10. type: 'keyword'
  11. }
  12. }
  13. }
  14. }
  15. )
  16. puts response

Js

  1. const response = await client.indices.create({
  2. index: "postal_codes",
  3. mappings: {
  4. properties: {
  5. location: {
  6. type: "geo_shape",
  7. },
  8. postal_code: {
  9. type: "keyword",
  10. },
  11. },
  12. },
  13. });
  14. console.log(response);

コンソール

  1. PUT /postal_codes
  2. {
  3. "mappings": {
  4. "properties": {
  5. "location": {
  6. "type": "geo_shape"
  7. },
  8. "postal_code": {
  9. "type": "keyword"
  10. }
  11. }
  12. }
  13. }

インデックスAPI を使用して、このソースインデックスに強化データをインデックスします。

Python

  1. resp = client.index(
  2. index="postal_codes",
  3. id="1",
  4. refresh="wait_for",
  5. document={
  6. "location": {
  7. "type": "envelope",
  8. "coordinates": [
  9. [
  10. 13,
  11. 53
  12. ],
  13. [
  14. 14,
  15. 52
  16. ]
  17. ]
  18. },
  19. "postal_code": "96598"
  20. },
  21. )
  22. print(resp)

Ruby

  1. response = client.index(
  2. index: 'postal_codes',
  3. id: 1,
  4. refresh: 'wait_for',
  5. body: {
  6. location: {
  7. type: 'envelope',
  8. coordinates: [
  9. [
  10. 13,
  11. 53
  12. ],
  13. [
  14. 14,
  15. 52
  16. ]
  17. ]
  18. },
  19. postal_code: '96598'
  20. }
  21. )
  22. puts response

Js

  1. const response = await client.index({
  2. index: "postal_codes",
  3. id: 1,
  4. refresh: "wait_for",
  5. document: {
  6. location: {
  7. type: "envelope",
  8. coordinates: [
  9. [13, 53],
  10. [14, 52],
  11. ],
  12. },
  13. postal_code: "96598",
  14. },
  15. });
  16. console.log(response);

コンソール

  1. PUT /postal_codes/_doc/1?refresh=wait_for
  2. {
  3. "location": {
  4. "type": "envelope",
  5. "coordinates": [ [ 13.0, 53.0 ], [ 14.0, 52.0 ] ]
  6. },
  7. "postal_code": "96598"
  8. }

geo_match ポリシータイプ を使用して強化ポリシーを作成するには、強化ポリシー作成API を使用します。このポリシーには次のものが含まれている必要があります:

  • 1つ以上のソースインデックス
  • 受信ドキュメントと一致させるために使用されるソースインデックスからの match_fieldgeo_shape フィールド
  • 受信ドキュメントに追加したいソースインデックスからの強化フィールド

Python

  1. resp = client.enrich.put_policy(
  2. name="postal_policy",
  3. geo_match={
  4. "indices": "postal_codes",
  5. "match_field": "location",
  6. "enrich_fields": [
  7. "location",
  8. "postal_code"
  9. ]
  10. },
  11. )
  12. print(resp)

Ruby

  1. response = client.enrich.put_policy(
  2. name: 'postal_policy',
  3. body: {
  4. geo_match: {
  5. indices: 'postal_codes',
  6. match_field: 'location',
  7. enrich_fields: [
  8. 'location',
  9. 'postal_code'
  10. ]
  11. }
  12. }
  13. )
  14. puts response

Js

  1. const response = await client.enrich.putPolicy({
  2. name: "postal_policy",
  3. geo_match: {
  4. indices: "postal_codes",
  5. match_field: "location",
  6. enrich_fields: ["location", "postal_code"],
  7. },
  8. });
  9. console.log(response);

コンソール

  1. PUT /_enrich/policy/postal_policy
  2. {
  3. "geo_match": {
  4. "indices": "postal_codes",
  5. "match_field": "location",
  6. "enrich_fields": [ "location", "postal_code" ]
  7. }
  8. }

強化ポリシー実行API を使用して、ポリシーのための強化インデックスを作成します。

コンソール

  1. POST /_enrich/policy/postal_policy/_execute?wait_for_completion=false

パイプラインの作成または更新API を使用してインジェストパイプラインを作成します。パイプラインには、次のものを含む強化プロセッサを追加します:

  • あなたの強化ポリシー。
  • 強化インデックスからのドキュメントのジオシェイプと一致させるために使用される受信ドキュメントの field
  • 受信ドキュメントに追加された強化データを格納するために使用される target_field。このフィールドには、あなたの強化ポリシーで指定された match_fieldenrich_fields が含まれます。
  • プロセッサが受信ドキュメントのジオシェイプを強化インデックスのドキュメントのジオシェイプと一致させる方法を示す shape_relation。有効なオプションと詳細については、空間関係を参照してください。

Python

  1. resp = client.ingest.put_pipeline(
  2. id="postal_lookup",
  3. processors=[
  4. {
  5. "enrich": {
  6. "description": "Add 'geo_data' based on 'geo_location'",
  7. "policy_name": "postal_policy",
  8. "field": "geo_location",
  9. "target_field": "geo_data",
  10. "shape_relation": "INTERSECTS"
  11. }
  12. }
  13. ],
  14. )
  15. print(resp)

Js

  1. const response = await client.ingest.putPipeline({
  2. id: "postal_lookup",
  3. processors: [
  4. {
  5. enrich: {
  6. description: "Add 'geo_data' based on 'geo_location'",
  7. policy_name: "postal_policy",
  8. field: "geo_location",
  9. target_field: "geo_data",
  10. shape_relation: "INTERSECTS",
  11. },
  12. },
  13. ],
  14. });
  15. console.log(response);

コンソール

  1. PUT /_ingest/pipeline/postal_lookup
  2. {
  3. "processors": [
  4. {
  5. "enrich": {
  6. "description": "Add 'geo_data' based on 'geo_location'",
  7. "policy_name": "postal_policy",
  8. "field": "geo_location",
  9. "target_field": "geo_data",
  10. "shape_relation": "INTERSECTS"
  11. }
  12. }
  13. ]
  14. }

インジェストパイプラインを使用してドキュメントをインデックスします。受信ドキュメントには、あなたの強化プロセッサで指定された field が含まれている必要があります。

Python

  1. resp = client.index(
  2. index="users",
  3. id="0",
  4. pipeline="postal_lookup",
  5. document={
  6. "first_name": "Mardy",
  7. "last_name": "Brown",
  8. "geo_location": "POINT (13.5 52.5)"
  9. },
  10. )
  11. print(resp)

Js

  1. const response = await client.index({
  2. index: "users",
  3. id: 0,
  4. pipeline: "postal_lookup",
  5. document: {
  6. first_name: "Mardy",
  7. last_name: "Brown",
  8. geo_location: "POINT (13.5 52.5)",
  9. },
  10. });
  11. console.log(response);

コンソール

  1. PUT /users/_doc/0?pipeline=postal_lookup
  2. {
  3. "first_name": "Mardy",
  4. "last_name": "Brown",
  5. "geo_location": "POINT (13.5 52.5)"
  6. }

強化プロセッサが適切なフィールドデータを一致させて追加したことを確認するには、取得API を使用してインデックスされたドキュメントを表示します。

Python

  1. resp = client.get(
  2. index="users",
  3. id="0",
  4. )
  5. print(resp)

Ruby

  1. response = client.get(
  2. index: 'users',
  3. id: 0
  4. )
  5. puts response

Js

  1. const response = await client.get({
  2. index: "users",
  3. id: 0,
  4. });
  5. console.log(response);

コンソール

  1. GET /users/_doc/0

APIは次の応答を返します:

コンソール-結果

  1. {
  2. "found": true,
  3. "_index": "users",
  4. "_id": "0",
  5. "_version": 1,
  6. "_seq_no": 55,
  7. "_primary_term": 1,
  8. "_source": {
  9. "geo_data": {
  10. "location": {
  11. "type": "envelope",
  12. "coordinates": [[13.0, 53.0], [14.0, 52.0]]
  13. },
  14. "postal_code": "96598"
  15. },
  16. "first_name": "Mardy",
  17. "last_name": "Brown",
  18. "geo_location": "POINT (13.5 52.5)"
  19. }
  20. }