æ¦è¦
Opensearchã®æ¦è¦
Amazon OpenSearch Service ã¯ã AWS ã¯ã©ã¦ãã§ã® OpenSearch ã¯ã©ã¹ã¿ã¼ã®ãããã¤ãéç¨ãã¹ã±ã¼ãªã³ã°ã容æã«ããããã¼ã¸ããµã¼ãã¹ã§ãã
Opensearchã¯ããªã¼ãã³ã½ã¼ã¹ã®æ¤ç´¢ããã³åæã¨ã³ã¸ã³ã§ãã
ããã¥ã¡ã³ã
Opensearchã®ã¤ã³ããã¯ã¹ã«æ ¼ç´ããããã¼ã¿ã¯ãããã¥ã¡ã³ãã¨ãã¦è¡¨ç¾ããã¾ããããã¥ã¡ã³ãã¯ãJSONå½¢å¼ã§è¡¨ç¾ããããã£ã¼ã«ãã¨å¤ã®ãã¢ã§æ§æããã¦ãã¾ããä¾ãã°ã以ä¸ã®ãããªããã¥ã¡ã³ãã¯ãtitle
ã¨content
ã¨ãã2ã¤ã®ãã£ã¼ã«ããæã¡ãããããã®å¤ãæå®ããã¦ãã¾ãã
{ "title": "Opensearchã®æ¦è¦", "content": "Opensearchã¯ãElasticsearchãããã©ã¼ã¯ããããªã¼ãã³ã½ã¼ã¹ã®æ¤ç´¢ããã³åæã¨ã³ã¸ã³ã§ãã" }
Opensearch ã¤ã³ããã¯ã¹
Opensearchã¤ã³ããã¯ã¹ã¯ããã¼ã¿ãå¹ççã«æ ¼ç´ããæ¤ç´¢ãåæãè¡ãããã®åºæ¬åä½ã§ãããã¼ã¿ãã¼ã¹ã«ããããã¼ãã«ã«ç¸å½ãããã®ã§ãã¤ã³ããã¯ã¹ã«ã¯ãããã¥ã¡ã³ããæ ¼ç´ããã¾ãã
Opensearch API
Opensearch APIãå©ç¨ãããã¨ã§ãOpensearchã¯ã©ã¹ã¿ã®ç®¡çãå«ãæ§ã ãªæä½ãããã°ã©ã ããç´æ¥å®è¡ãããã¨ãã§ãã¾ãããã®APIã¯RESTfulãªã¤ã³ã¿ã¼ãã§ã¼ã¹ãæä¾ãã¦ãããHTTPãªã¯ã¨ã¹ããéãã¦ãã¼ã¿ã®æ¢ç´¢ãã¤ã³ããã¯ã¹ä½æã«å ãã¦ãã¯ã©ã¹ã¿ã®ç®¡çãè¨å®ã®èª¿æ´ãªã©ãå¹ åºãæä½ãå¯è½ã§ããããã«ãããOpensearchã®æ©è½ãå¹ççãã¤æè»ã«æ´»ç¨ãããã¨ãã§ãã¾ãã
ã¤ã³ããã¯ã¹ã«å¯¾ããæä½ã¯ãããã¥ã¡ã³ãAPIãå©ç¨ãã¾ããããã¯ãåä¸ããã¥ã¡ã³ãæä½ã¨è¤æ°ããã¥ã¡ã³ãæä½ã®2ã¤ã®ä¸»è¦ãªAPIã«åããã¦ãã¾ããããããã以ä¸ã«èª¬æãã¾ãã
åä¸ããã¥ã¡ã³ãæä½
- Index: ä¸ã¤ã®ããã¥ã¡ã³ããã¤ã³ããã¯ã¹ã«è¿½å ã§ãã¾ãã
- Get: ããã¥ã¡ã³ãã®æ å ±ã¨ãã¼ã¿ãåå¾ã§ãã¾ãã
- Update: ããã¥ã¡ã³ãã®ãã£ã¼ã«ããæ´æ°ãã¾ãã
- Delete: ããã¥ã¡ã³ããåé¤ãã¾ãã
è¤æ°ããã¥ã¡ã³ãæä½
- Bulk: 1åã®ãªã¯ã¨ã¹ãã§è¤æ°ã®ææ¸ã追å ãæ´æ°ãåé¤ãã¾ãã
- Multi Get: 1åã®ãªã¯ã¨ã¹ãã§è¤æ°ã®GETãªãã¬ã¼ã·ã§ã³ãå®è¡ãã¾ãã
- Delete by query: ã¯ã¨ãªã«ä¸è´ãããã¹ã¦ã®ããã¥ã¡ã³ããåé¤ãã¾ãã
- Update by query: ã¯ã¨ãªã«ä¸è´ãããã¹ã¦ã®ææ¸ãæ´æ°ãã¾ãã
- Reindex: 1ã¤ã®ã¤ã³ããã¯ã¹ããå¥ã®ã¤ã³ããã¯ã¹ã«ãã¼ã¿ãã³ãã¼ãã¾ãã
Bulk API
æ¬è¨äºã§ã¯ãå®æ¡ä»¶ã«ã¦ä½¿ç¨ããæ©ä¼ã®å¤ãã§ãããBulk APIã«ã¤ãã¦è§£èª¬ãã¾ãã
Bulk APIã¯ã1åã®ãªã¯ã¨ã¹ãã§è¤æ°ã®ææ¸ã追å ãæ´æ°ãåé¤ãããã¨ãã§ãã¾ããé常ã1件ãã¤ãã¼ã¿ãç»é²ããã®ã«æ¯ã¹ãBulk APIã使ç¨ãããã¨ã§è¤æ°ã®ããã¥ã¡ã³ããä¸åº¦ã«å¦çã§ãããããããã©ã¼ãã³ã¹ãå¤§å¹ ã«åä¸ãã¾ããããã¯ç¹ã«ãè¤æ°ã®ãã¼ã¿ãæ±ãå ´åã«æ¨å¥¨ãããæ¹æ³ã§ãã
ãã¹ã¨HTTPã¡ã½ãã
ãã¹ã¯ã/_bulk
ã¨ãªãã¾ããHTTPã¡ã½ããã¯ãPOSTã§ããPUTã使ç¨å¯è½ã§ãããPOSTãä¸è¬çã§ããããã¯ãPUTãé常ãåä¸ã®ãªã½ã¼ã¹ã®è¿½å ãç½®ãæãã«ä½¿ãããã®ã«å¯¾ãã¦ãä¸æ¬ãªã¯ã¨ã¹ãã§ã¯ãã®ãããªæä½ãé©ããªãããã§ãã
https://OpenSearchãã¡ã¤ã³/_bulk
ãªã¯ã¨ã¹ãããã£
Bulk APIãå©ç¨ãã¦Opensearchã«ãã¼ã¿ãä¸æ¬ã§ç»é²ããéããªã¯ã¨ã¹ãããã£ã«ã¯è¤æ°ã®æä½ï¼ä¾ãã°ãã¤ã³ããã¯ã¹ã®ä½æãæ´æ°ãåé¤ãªã©ï¼ãå®ç¾©ããå¿ è¦ãããã¾ãã ãããã®è¡ã¯ãã¢ã§è¨è¿°ããããªã¯ã¨ã¹ãããã£å ¨ä½ã¯æ¹è¡ã§åºåãããè¤æ°ã®ãã¢ã§æ§æããã¾ãã
以ä¸ã¯ãCurlã使ç¨ãã¦Opensearchã®Bulk APIãå©ç¨ãããã¼ã¿ãã¤ã³ããã¯ã¹ã«ç»é²ããéã®ä¾ã§ãã
# Curlã³ãã³ã curl -X POST "https://OpenSearchãã¡ã¤ã³/_bulk" -H 'Content-Type: application/x-ndjson' -d ' { "index": { "_index": "tmp-index", "_id": "1" } } { "field1": "value1", "field2": "value2" } { "index": { "_index": "tmp-index", "_id": "2" } } { "field1": "value3", "field2": "value4" } '
ãã®ä¾ã§ã¯ãtmp-indexã¨ããååã®ã¤ã³ããã¯ã¹ã«2ã¤ã®ããã¥ã¡ã³ããç»é²ãã¦ãã¾ããId1ã«ã¯field1ã¨field2ãvalue1ã¨value2ã¨ãã¦ç»é²ãããId2ã«ã¯field1ã¨field2ãvalue3ã¨value4ã¨ãã¦ç»é²ããã¾ãã
Pythonã使ã£ãBulk APIã®å®è£
äºåæºå
ããã§ã¯ãOpensearchã«å¯¾ãã¦Pythonã使ã£ã¦Bulk APIãå®è£ ããããã®æºåã«ã¤ãã¦èª¬æãã¾ããä»åã®ä¾ã§ã¯ãOpensearchãæ¢ã«æ§ç¯ããã¦ãããã¨ãåæã¨ãã¾ãã®ã§ãOpensearchã®ã¤ã³ã¹ã¿ã³ã¹æ§ç¯ã«ã¤ãã¦ã¯èª¬æãçç¥ãã¾ãããããOpensearchã®æ§ç¯æ¹æ³ã«ã¤ãã¦è©³ããç¥ãããæ¹ã¯ã以ä¸ã®AWSå ¬å¼ããã¥ã¡ã³ããåèã«ãã¦ãã ããã
å®è£
ä»åã®å®è£
ã§ã¯ãPythonã使ç¨ãã¦Opensearchã®Bulk APIã«å¯¾ãããªã¯ã¨ã¹ããè¡ãããã¼ã¿ãä¸æ¬ã§ã¤ã³ããã¯ã¹ã«ç»é²ãã¾ãããã®ãµã³ãã«ã³ã¼ãã§ã¯ãrequests
ã©ã¤ãã©ãªã使ç¨ãã¦HTTPãªã¯ã¨ã¹ããè¡ããBasicèªè¨¼ãå©ç¨ãã¦Opensearchã«ã¢ã¯ã»ã¹ãã¾ãã
以ä¸ã¯å®éã®ãµã³ãã«ã³ã¼ãã§ãï¼
import os import requests from requests.auth import HTTPBasicAuth # Opensearchã®ã¨ã³ããã¤ã³ãã¨èªè¨¼æ å ±ãç°å¢å¤æ°ããåå¾ OPEN_SEARCH_ENDPOINT = os.environ.get("OPEN_SEARCH_ENDPOINT") OPEN_SEARCH_USERNAME = os.environ.get("OPEN_SEARCH_USERNAME") OPEN_SEARCH_PASSWORD = os.environ.get("OPEN_SEARCH_PASSWORD") # Bulk APIã®URLãæ§ç¯ URL = f"https://{OPEN_SEARCH_ENDPOINT}/_bulk" # ãªã¯ã¨ã¹ãããã£ãå®ç¾© request_body = """ { "index": { "_index": "tmp-index", "_id": "1" } } { "field1": "value1", "field2": "value2" } { "index": { "_index": "tmp-index", "_id": "2" } } { "field1": "value3", "field2": "value4" } """ # POSTãªã¯ã¨ã¹ããéä¿¡ response = requests.post( url=URL, headers={"Content-Type": "application/x-ndjson"}, data=request_body, timeout=10, auth=HTTPBasicAuth(OPEN_SEARCH_USERNAME, OPEN_SEARCH_PASSWORD), ) # ã¬ã¹ãã³ã¹ãåºå print(response.status_code) print(response.text)
ãã®ãµã³ãã«ã³ã¼ããå®è¡ãããã¨ã§ãOpensearchã®tmp-index
ã¤ã³ããã¯ã¹ã«2ã¤ã®ããã¥ã¡ã³ããä¸æ¬ã§ç»é²ããã¾ããåããã¥ã¡ã³ãã«ã¯field1
ã¨field2
ãããããç°ãªãå¤ã§è¨å®ããã¾ãã
å®è£ ã®æ¦è¦ã¨éè¦ãªãã¤ã³ãã説æãã¾ãã
ä»æ§ã©ã¤ãã©ãª:
requests
: Pythonã®æ¨æºçãªHTTPã©ã¤ãã©ãªã§ãAPIãªã¯ã¨ã¹ããéä¿¡ããããã«ä½¿ç¨ãã¾ããrequests.auth.HTTPBasicAuth
: Basicèªè¨¼ãè¡ãããã«ä½¿ç¨ãã¾ãã
Basicèªè¨¼:
- Opensearchã«ã¢ã¯ã»ã¹ããéãBasicèªè¨¼ãå©ç¨ãã¾ããããã¯ãã¦ã¼ã¶ã¼åã¨ãã¹ã¯ã¼ããç¨ãã¦èªè¨¼ãè¡ãæ¹æ³ã§ãã
- ç°å¢å¤æ°ããOpensearchã®ã¨ã³ããã¤ã³ããã¦ã¼ã¶ã¼åããã¹ã¯ã¼ããåå¾ããèªè¨¼æ å ±ã¨ãã¦å©ç¨ãã¾ãã
ãªã¯ã¨ã¹ãéä¿¡:
requests.post
ã¡ã½ããã使ç¨ãã¦ãOpensearchã«å¯¾ãã¦POSTãªã¯ã¨ã¹ããéä¿¡ãã¾ãããã®éãèªè¨¼æ å ±ãauth
ãã©ã¡ã¼ã¿ã«è¨å®ãããªã¯ã¨ã¹ãã®ãããã¼ã«ã¯é©åãªã³ã³ãã³ãã¿ã¤ããæå®ãã¾ãã
ã¾ã¨ã
æ¬è¨äºã§ã¯ãOpensearchã®Bulk APIã«ã¤ãã¦è§£èª¬ãã¾ãããBulk APIã¯ã大éã®ãã¼ã¿ãä¸æ¬ã§å¦çããéã«æ¨å¥¨ããã¦ããæ¹æ³ã§ããæ¯éæ´»ç¨ãã¦ã¿ã¦ãã ããã