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が待ち遠しいサービスの一つとなりました!
投稿者プロフィール
-
Japan AWS Ambassadors 2023, 2024
開発会社での ASP型WEBサービス企画 / 開発 / サーバ運用 を経て
2010年よりスカイアーチネットワークスに在籍しております
機械化/効率化/システム構築を軸に人に喜んで頂ける物作りが大好きです。








