AWS re:Invent 2022にて発表された、Amazon OpenSearch Serverless プレビュー版を利用しPythonスクリプトでのデータ投入、OpenSearch UIでの検索を試してみました。
続々と増える「Serverless」をサービス名に入れたよりスケーラビリティが高く、マネージド領域の広いサービス、今年中頃のAuroraServerless v2も好感触でしたので、期待を込めて触ってみました。
目次
はじめに
下記2本立てでお送りします
- Amazon OpenSearch Serverless(プレビュー) にPythonスクリプトからデータ投入をしてみました
- Amazon OpenSearch Serverless(プレビュー) からPythonスクリプトでデータ取得をしてみました (本記事)
今回のプレビュー版利用にあたり参考にした/利用したものは下記となります。
内部アーキテクチャ図含む全容の参考
- Getting started with Amazon OpenSearch Serverless (Workshop)
https://catalog.us-east-1.prod.workshops.aws/workshops/f8d2c175-634d-4c5d-94cb-d83bbc656c6a/en-US
Pythonからのデータ投入/参照プログラム参考
- Amazon OpenSearch Serverless による手軽なログ分析
https://aws.amazon.com/jp/blogs/news/log-analytics-the-easy-way-with-amazon-opensearch-serverless/
OpenSearch Pythonクライアントサンプルコード
https://opensearch.org/docs/latest/clients/python/
利用準備
前回記事 を参考にOpenSearch Serverlessを構築、Indexを作成しておきます。
検索・クエリするプログラム実行
認証情報はDefaultの物を利用しますので、ご注意下さい。
requirements.txt
1 2 3 |
opensearch-py requests_aws4auth boto3 |
get.py
from opensearchpy import OpenSearch, RequestsHttpConnection from requests_aws4auth import AWS4Auth import boto3 import json host = '[作成したコレクションに応じた識別子].ap-northeast-1.aoss.amazonaws.com' # OpenSearch Serverless collection endpoint region = 'ap-northeast-1' # e.g. us-west-2 service = 'aoss' credentials = boto3.Session().get_credentials() awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token) # Create an OpenSearch client client = OpenSearch( hosts = [{'host': host, 'port': 443}], http_auth = awsauth, use_ssl = True, verify_certs = True, connection_class = RequestsHttpConnection ) # Specify index name index_name = 'zip-jp-index' # Search for the Documents query = { "size": 2, "_source": { "includes": [ "zip7digits", "PrefName", "CityName", "TownName" ] }, "query": { "query_string": { "default_field": "CityName", "query": "川崎市幸区" } } } response = client.search( body = query, index = index_name ) print(response)
実行結果
サンプルコードみたまんまですが、CityName が 「川崎市幸区」 のデータを 2件 取得しています。
Pretty-Printに難儀しそうでしたので、そのままの結果です(汗)
1 2 3 4 5 6 7 |
$ python3.10 get.py {'took': 171, 'timed_out': False, '_shards': {'total': 32, 'successful': 32, 'skipped': 0, 'failed': 0}, 'hits': {'total': {'value': 3183, 'relation': 'eq'}, 'max_score': 10.586664, 'hits': [ {'_index': '428015190804::w18wju22mfs7a6z4czrb::SEARCH::zip-jp-index:0', '_id': 'LJn7BIUB67qpbBvGcUp7', '_score': 10.586664, '_source': {'zip7digits': '2120053', 'TownName': '下平間', 'CityName': '川崎市幸区', 'PrefName': '神奈川県'}}, {'_index': '428015190804::w18wju22mfs7a6z4czrb::SEARCH::zip-jp-index:0', '_id': 'BKv7BIUBuZbJeQ2ldv8H', '_score': 10.006503, '_source': {'zip7digits': '2120027', 'TownName': '新塚越', 'CityName': '川崎市幸区', 'PrefName': '神奈川県'}} ]}} ... |
取得したい物、内容の事前確認については前回の記事でも利用したDev Toolsを利用して予め結果を確認しながら実装するのが良さそうです。
まとめ
ここまで取得できれば、APIGateway + LambdaでREST API化等も簡単に実現できそうです。
より良い全文検索ライフを送るため、GAが待ち遠しいサービスの一つとなりました!