Elasticsearch SQL 変換 API

Elasticsearch Sql Bian Huan Api



この投稿では、SQL 検索を、JSON に基づく完全なクエリ ドメイン固有言語を含む有効な Elasticsearch 検索 API リクエストに変換する方法を学習します。

これは小さな API ですが、特に SQL データベースから来た開発者にとって非常に有益なツールです。また、SQL クエリを対応する検索クエリにすばやく関連付けることで、学習曲線を短縮することもできます。

次に、Elasticsearch 検索 API とサポートされているクエリ言語のすべての機能を調べることができます。







Elasticsearch は SQL をサポートしていますが、さまざまな制限があることに注意してください。



クエリ構文

以下は、翻訳 API の構文を示しています。



GET _sql/translate

{

request_body

}

次の構文に示すように、post リクエストを翻訳 API に送信することもできます。





POST _sql/translate

{

request_body

}

クラスターの構成によっては、データを照会するインデックスに対する読み取り権限が API に必要になる場合があります。ターゲット リソースをインデックス エイリアスまたはデータ ストリームとして指定することもできます。

request_body では、すべての SQL Search API 要求本文パラメーターを指定できます。詳細については、次のリソースで提供されているドキュメントを参照してください。



https://www.elastic.co/guide/en/elasticsearch/reference/current/sql-search-api.html#sql-search-api-request-body

応答として、クエリはクエリされたデータを含む検索 API に対応する結果を返す必要があります。

この API の使用方法をわかりやすく説明するために、Netflix の映画とテレビ番組に関するすべてのデータを含む「netflix」というインデックスがあると仮定します。

2020 年以降にリリースした Netflix インデックスから上位 5 つの映画を取得したいとします。

同等の SQL クエリは、次のように表現できます。

タイトル、期間、レーティング、タイプを選択 FROM netflix WHERE タイプ = '映画' AND release_year >= 2020年

上記の SQL 検索を Elasticsearch で実行するには、以下に示すように SQL 検索 API に配置します。

カール-XGET 「http://localhost:9200/_sql?format=txt」 -H 「kbn-xsrf: レポート」 -H 「コンテンツ タイプ: アプリケーション/json」 -d '

{

'クエリ': ' \n SELECT title, duration, rating, type FROM 'netflix' WHERE type = '
\ '' 映画 ' \' ' AND release_year >= 2020年 \n '、

'
fetch_size ': 5

}'

前のリクエストでインデックスをクエリし、一致するレコードをフェッチする必要があります。返される出力は、以下に示すテキスト形式です。

ご覧のとおり、Elasticsearch は期待どおりの出力を返します。

出力を JSON として返すには、以下に示すように形式を JSON に設定できます。

カール-XGET 'http://localhost:9200/_sql?format=json' -H 「kbn-xsrf: レポート」 -H 「コンテンツ タイプ: アプリケーション/json」 -d '

{

'クエリ': ' \n SELECT title, duration, rating, type FROM 'netflix' WHERE type = '
\ '' 映画 ' \' ' AND release_year >= 2020年 \n '、

'
fetch_size ': 5

}'

出力:

SQL クエリを検索リクエストに変換する

以前の SQL 検索クエリを Elasticsearch リクエストに変換するには、以下に示すように、それを変換 API に渡すことができます。

カール-XGET 'http://localhost:9200/_sql/translate' -H 「kbn-xsrf: レポート」 -H 「コンテンツ タイプ: アプリケーション/json」 -d '

{

'クエリ': ' \n SELECT title, duration, rating, type FROM 'netflix' WHERE type = '
\ '' 映画 ' \' ' AND release_year >= 2020年 \n '、

'
fetch_size ': 5

}'

次の出力に示すように、API は入力 SQL 入力を解析し、有効な検索要求に変換する必要があります。

{
'サイズ' : 5
「クエリ」 : {
「ブール」 : {
'しなければならない' : [
{
'学期' : {
'タイプ' : {
'価値' : '映画'
}
}
}、
{
'範囲' : {
「リリース年」 : {
「グテ」 : 2020年
'ブースト' : 1
}
}
}
]、
'ブースト' : 1
}
}、
'_ソース' : 間違い、
'田畑' : [
{
'分野' : '題名'
}、
{
'分野' : '間隔'
}、
{
'分野' : 「評価」
}、
{
'分野' : 'タイプ'
}
]、
'選別' : [
{
'_doc' : {
'注文' : 'asc'
}
}
]
}

次に、このリクエスト形式を使用して、以下に示すように Elasticsearch 検索 API に送信できます。

カール -XPOST 'http://localhost:9200/netflix/_search' -H 「kbn-xsrf: レポート」 -H 「コンテンツ タイプ: アプリケーション/json」 -d '
{
'サイズ': 5,
'クエリ': {
'ブール': {
'しなければならない': [
{
'学期': {
'タイプ': {
'値': '映画'
}
}
}、
{
'範囲': {
'リリース年': {
'gte': 2020,
「ブースト」:1
}
}
}
]、
「ブースト」:1
}
}、
'_source': false,
'田畑': [
{
「フィールド」:「タイトル」
}、
{
'フィールド': '期間'
}、
{
「フィールド」:「評価」
}、
{
「フィールド」:「タイプ」
}
]、
'選別': [
{
'_doc': {
'注文': '昇順'
}
}
]
}'

同様に、リクエストは以下に示すような同様のデータを返す必要があります。

結論

この投稿を通じて、SQL クエリを使用して既存の Elasticsearch インデックスからデータをフェッチする方法を発見しました。また、translate SQL API を使用して有効な SQL クエリを Elasticsearch リクエストに変換する方法も学びました。