Amazon OpenSearch Serverless(プレビュー) からPythonスクリプトでデータ取得をしてみました

AWS re:Invent 2022にて発表された、Amazon OpenSearch Serverless プレビュー版を利用しPythonスクリプトでのデータ投入、OpenSearch UIでの検索を試してみました。
続々と増える「Serverless」をサービス名に入れたよりスケーラビリティが高く、マネージド領域の広いサービス、今年中頃のAuroraServerless v2も好感触でしたので、期待を込めて触ってみました。

目次

はじめに

下記2本立てでお送りします

今回のプレビュー版利用にあたり参考にした/利用したものは下記となります。

内部アーキテクチャ図含む全容の参考

Pythonからのデータ投入/参照プログラム参考

OpenSearch Pythonクライアントサンプルコード

https://opensearch.org/docs/latest/clients/python/

利用準備

前回記事 を参考にOpenSearch Serverlessを構築、Indexを作成しておきます。

検索・クエリするプログラム実行

認証情報はDefaultの物を利用しますので、ご注意下さい。

requirements.txt
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に難儀しそうでしたので、そのままの結果です(汗)

$ 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が待ち遠しいサービスの一つとなりました!

投稿者プロフィール

takashi
開発会社での ASP型WEBサービス企画 / 開発 / サーバ運用 を経て
2010年よりスカイアーチネットワークスに在籍しております

機械化/効率化/システム構築を軸に人に喜んで頂ける物作りが大好きです。
個人ブログではRaspberryPiを利用したシステムやロボット作成も
実施しております。

スカイアーチネットワークスで一緒に働きましょう!

ABOUTこの記事をかいた人

開発会社での ASP型WEBサービス企画 / 開発 / サーバ運用 を経て 2010年よりスカイアーチネットワークスに在籍しております 機械化/効率化/システム構築を軸に人に喜んで頂ける物作りが大好きです。 個人ブログではRaspberryPiを利用したシステムやロボット作成も 実施しております。 スカイアーチネットワークスで一緒に働きましょう!