サイオステクノロジー((DXSL))のブログ - TECH PLAY

TECH PLAY

サイオステクノロジー((DXSL))

サイオステクノロジー((DXSL)) の技術ブログ

全104件

こんにちは。 サイオステクノロジーの田川です。 今回は、インデックスに登録したドキュメントを検索してみたいと思います。 対象者 Elastic Cloud のアカウントを持っている人(トライアルライセンスを含む) Elasticsearch の初心者 できるようになること Elastic Cloud の Console から、ドキュメントに対して簡単な検索を行える。 前提条件 Elastic Cloud (version: 8.15.0) Elastic Cloud 上のインデックスにドキュメントを登録済 (2024年10月11日時点の情報を元に記載しています。) 1. 全件を検索 前回登録した「桃太郎」の内容を Elasticsearch の Search API を使って検索してみます。 Search API の詳細な仕様については、下記の公式ドキュメントを参照してください。 https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html まずは、全ての内容を検索してみます。 初回に作成した “SIOS-BLOG-SAMPLE-1” のデプロイメント内の Console を表示します。 (Console 画面の表示方法については、 Elastissearch へのインデックスの作成 のブログ記事を参照してください。) Console のリクエスト欄に下記を入力して、 ▷ をクリックします。 GET /momotaro_v1/_search 全149ドキュメントがヒットしますが、右側のレスポンス欄には10件のみが表示されます。 これは、レスポンスとして返却される件数(“size”パラメータ)のディフォルトが 10 となっているためです。 { ... "hits": { "total": { "value": 149, "relation": "eq" }, "max_score": 1, "hits": [ ... (全10件分のドキュメント) ... ] } ※注 ディフォルトでは、score の大きい順にソートされますが、 この例では、検索条件やソート条件を全て省略しているので、並び順にさほど意味はありません。 149件全部を表示したい場合は、”size” に 149以上の値を設定する必要があります。 (なお、”size” の最大値は、10000となっています。) “size” の詳細については、下記を参照してください。 https://www.elastic.co/guide/en/elasticsearch/reference/current/paginate-search-results.html 下記のリクエストを Console から発行してみます。 GET /momotaro_v1/_search { "size": 150 } すると、右側のレスポンス欄には、全149件が表示されます。 ※注 通常は、必要以上にレスポンスを取得しないことをお勧めいたします。 上記で、”size” に 150 を指定しているのは、あくまでも、”size” の働きを確認するためです。 2. 検索条件付きの検索 2.1 キーワードを1つだけ指定した検索 今度は、本文に「桃太郎」を含むドキュメントのみ検索してみます。 “match” を使って検索してみます。 “match” クエリの詳細は、下記を参照してください。 https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query.html 下記のリクエストを Console から発行してみます。 GET /momotaro_v1/_search { "query": { "match": { "content": "桃太郎" } } } すると、40件のドキュメントがヒットしました。 レスポンスの例: { "took": 1, ... "hits": { "total": { "value": 40, "relation": "eq" }, "max_score": 6.645262, "hits": [ ... 10件分のヒット内容 ... ] } } score が大きい順(検索条件に、よりマッチした順)での上位10件が表示されます。 “size” に 40 を指定して、”桃太郎”にマッチした全件を見てみます。 GET /momotaro_v1/_search { "query": { "match": { "content": "桃太郎" } }, "size": 40 } すると、下位の方では、”桃太郎”ではなく、”桃”にヒットしていることがわかります。 レスポンスの例: { ... "content": "...さっきの桃を重そうにかかえて来て、" ... } これは、検索用に指定した文字列の “桃太郎” が “桃”, “太”, “郎” に分解されてしまい、 “桃”, “太”, “郎” それぞれによる検索が行われているためです。 今回のサンプルでは、形態素解析を行う analyzer を指定していません。 ディフォルトの analyzer として standard analyzer が適用されますが、 standard analyzer が、そのような仕様(“桃太郎”が”桃”,”太”,”郎”に分解される)になっているためです。 standard analyzer を利用した場合に、”桃太郎”がどのように解析されるのか?を Analyze APIを使って確認してみます。 リクエスト: GET _analyze { "analyzer": "standard", "text": "桃太郎" } レスポンス: { "tokens": [ { "token": "桃", "start_offset": 0, "end_offset": 1, "type": "<IDEOGRAPHIC>", "position": 0 }, { "token": "太", "start_offset": 1, "end_offset": 2, "type": "<IDEOGRAPHIC>", "position": 1 }, { "token": "郎", "start_offset": 2, "end_offset": 3, "type": "<IDEOGRAPHIC>", "position": 2 } ] } このように “桃太郎” が、”桃”, “太”, “郎” に分解されているのがわかります。 Analyze API の詳細な説明については、下記を参照してください。 https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-analyze.html 正直なところ、何の対策もせずに standard analyzer を使って日本語を検索するのは、あまり好ましくありません。 念のため検索文字列に、”桃 太 郎” のように “桃” と “太” と “郎” の間に半角空白を入れて検索した場合にも 40件がヒットすることがわかります。 (*脚注1) 1 どうしても、”桃太郎”に合致するドキュメントのみを取得したい場合には、 下記のように、”match” ではなく “match_phrase” を指定してみてください。 “match_phrase” だと、”桃” と “太” と “郎” の並びが”桃太郎”になっているドキュメントのみがマッチします。 GET /momotaro_v1/_search { "query": { "match_phrase": { "content": "桃太郎" } }, "size": 40 } すると、ヒットする件数が31件となり、”桃太郎”を含むドキュメントのみが取得されます。 2.2 キーワードを2つ指定した検索(OR検索) 次に、「桃太郎」または「きびだんご」を含むドキュメントを検索してみます。 Elasticsearch の場合、”a” または “b” を含むドキュメントを検索したい場合は、 検索対象文字列に “a b” のように半角空白で連結して記載します。 GET /momotaro_v1/_search { "query": { "match": { "content": "桃太郎 きびだんご" } } } 108件に増えました。 これは、今回の環境では “match” による検索を行うと、 “桃”,”太”,”郎”,”き”,”び”,”だ”,”ん”,”ご” に分解されて、どれか 1文字でもマッチしたドキュメントが検索されるためです。 この検索結果の改善は、次回、行っていきたいと思います。 2.3 キーワードを2つ指定した検索(AND検索) では、「桃太郎」と「きびだんご」の両方を含むドキュメントを検索してみます。 Elasticsearch では、”a” を含み、かつ、”b” を含むドキュメントを検索したい場合、 いくつかの書き方があります。 (1) operator に “and” を指定する。 https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query.html#query-dsl-match-query-boolean (2) bool を指定する。 (2.1) bool と filter を指定する。 (2.2) bool と must を指定する。 (2.3) bool と should を指定する。 https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html (2.2) の bool と must を指定する方法の例です。 GET /momotaro_v1/_search { "query": { "bool": { "must": [ { "match_phrase": { "content": "桃太郎" } }, { "match_phrase": { "content": "きびだんご" } } ] } } } 5件になりました。 2.4 キーワードを2つ指定した検索(片方を含み、もう片方を含まない検索) では、「桃太郎」を含むが、「きびだんご」を含まないドキュメントを検索してみます。 “must_not”を使います。 GET /momotaro_v1/_search { "query": { "bool": { "must": [ { "match_phrase": { "content": "桃太郎" } } ], "must_not": [ { "match_phrase": { "content": "きびだんご" } } ] } } } 26件がヒットしました。 “桃太郎”を含むドキュメントが31件、 “桃太郎” と “きびだんご” の両方を含むドキュメントが5件なので、 31 – 5 = 26 と、合っています。 (*脚注2) 2 3. ソート ディフォルトでは、score が大きい順(どれだけ検索条件にマッチしているか?の順)に並び替えされますが、 業務上の要件で、指定した順序で並び替えを行いたい場合もあるかと思います (例: ドキュメントの最終更新日時が新しい順にソートしたい、など)。 そのような場合には、”sort” を指定します。 ここでは、試しに、chunk_no の昇順にソートしてみます。 GET /momotaro_v1/_search { "query": { "match_phrase": { "content": "桃太郎" } }, "sort": [ "chunk_no" ] } これで、chunk_no の昇順に結果を得ることができます。 次の10件(11件目-20件目)を取得するには、”from” に 10 を指定します。 GET /momotaro_v1/_search { "query": { "match_phrase": { "content": "桃太郎" } }, "sort": [ "chunk_no" ], "from": 10 } 上記のリクエストを発行すると、11件目から20件目が表示されます。 ※レスポンスだけを見ると、この結果が11件目から20件目であることはわかりません。 リクエスト時点で何件目から何件目までを取得しようとしているのかをきちんと把握しておく必要があります。 ※”from”を指定することで、ヒットするドキュメントが大量にある場合に、少しずつ結果を取得することが可能となります。 “sort”, “from” の詳細については、それぞれ、下記を参照してください。 https://www.elastic.co/guide/en/elasticsearch/reference/current/sort-search-results.html https://www.elastic.co/guide/en/elasticsearch/reference/current/paginate-search-results.html (*脚注3) 3 4. 取得するフィールドの指定 ディフォルトだと、全てのフィールドを取得します。 仮に、取得する必要がないフィールドがあった場合は、下記のように、 “_source”: false を指定し、かつ、”fields” に取得したいフィールド名を配列で指定します。 (下記の例では、”fields” に1つのフィールドのみ指定していますが、複数フィールドを指定可能です。) 取得するフィールドを限定することで、クエリ実行時に消費するリソースを抑えることができます。 GET /momotaro_v1/_search { "_source": false, "fields": [ "content" ], "query": { "match_phrase" : { "content" : "桃太郎" } } } レスポンスの例: { ... "hits": { ... "hits": [ { "_index": "momotaro_v1", "_id": "********************", "_score": 6.645262, "fields": { "content": [ "「桃太郎さん、桃太郎さん、どちらへおいでになります。」" ] } }, ... ] } } “fileds” の詳細は、下記を参照してください。 https://www.elastic.co/guide/en/elasticsearch/reference/current/search-fields.html 今回、紹介したクエリ以外にもいろんな種類のクエリを利用可能です。 興味がある方は、ぜひ、お試しください。 今回は、検索はできるようになりましたが、日本語の検索でうまくいかない部分がありました。 次回は、日本語用の形態素解析を行った上で、検索を行ってみたいと思います。 (2024-12-19) インデックス名を momotaro → momotaro_v1 に訂正しました。 (*脚注) anlayzerに standard ではなく、日本語用の analyzer を明示することで、 “match”:{“content”:”桃太郎”} でも”桃太郎”にマッチするドキュメントのみを取得することは可能です。 ただし、記事の内容が多くなってしまうので、今回は触れずに、次回のブログ記事で書きたいと思います。 ↩︎ must_not とはやや目的が異なりますが、score を減点する方法もあります。 – 「桃太郎」を含む場合 score を加点する。 – 「きびだんご」を含む場合 score を減点する。 scrore を減点したい場合、”negative” や “negative_boost” を指定します。 そういった細かい調整が、Elasticsearchでは可能です。 https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-boosting-query.html ↩︎ “from” を指定する以外に、”search_after”を指定する方法もあります。 https://www.elastic.co/guide/en/elasticsearch/reference/current/paginate-search-results.html#search-after ↩︎ The post Elasticsearch で検索してみよう first appeared on Elastic Portal .
こんにちは。 サイオステクノロジーの田川です。 今回はインデックスにドキュメントを登録してみたいと思います。 対象者 Elastic Cloud のアカウントを持っている人(トライアルライセンスを含む) Elasticsearch の初心者 できるようになること Elastic Cloud の Console から、インデックスにドキュメントを登録する。 前提条件 Elastic Cloud (version: 8.15.0) Elastic Cloud 上にインデックスを作成済 (2024年09月25日時点の情報を元に記載しています。) 1. 登録するドキュメントの準備 (Elasticsrearch の “ドキュメント” は、リレーショナルデータベースで言うところの “レコード” のようなものとなります。) 1.1 ドキュメントの登録方法 一般的なドキュメントの登録方法は、大きく分けると2つに分かれます。 1. 1件ずつドキュメントを登録する。 2. Bulk API を利用してドキュメントを複数件まとめて登録する。 (これら以外に、クロールしたWebページ情報を登録する方法などもあります。) ここでは、2番目の Bulk API を用いて複数件のドキュメントをまとめて登録していきます。 ※参考 Bulk API の詳細は下記を参照してください。 Bulk API | Elasticsearch Guide [8.15] | Elastic www.elastic.co なお、Bulk API を呼び出す方法として、 Elastic Cloud の Console から実行する方法 Pythonなどのプログラミングコードから呼び出す方法 がありますが、ここでは、Elastic Cloud の Console から実行する方法について記載しています。 1.2 登録するドキュメント このブログ記事内で登録するドキュメントは、「桃太郎」の本文としています。 桃太郎 (楠山 正雄) 一 むかし、むかし、あるところに、おじいさんとおばあさんがありました。まいにち、おじいさんは山へしば刈(か)りに、おばあさんは川へ洗濯(せんたく)に行きました。 ある日、おばあさんが、川のそばで、せっ… www.aozora.gr.jp 上記の青空文庫の URL から、zip ファイルをダウンロード後、ルビを除去したものを利用しています。 ルビを除去した本文を読み込んで、Bulk API用の入力データに変換しています。 (ファイルの加工方法については、Elasticsearch の話から脱線してしまうので、ここでは詳細は割愛しますが、 下記のような簡単な Python スクリプトで変換しています。) text2bulk_input.py ----------------------------------------------------- textfile: str = "./momotaro_no_ruby_utf8.txt" chunk_no: int = 0 with open(textfile, 'r', encoding="utf-8") as file: while True: one_line :str = file.readline() if one_line == '': break chunk_no += 1 # remove last crlf content = one_line.replace("\n", "") print('{"index": {}}') print(f'{{"chunk_no": {chunk_no}, "content": "{content}"}}') (*脚注1) 1 前述の Python スクリプトを実行すると、次のような Bulk API用の入力データが出力されます。 {"index": {}} {"chunk_no": 1, "content": " むかし、むかし、あるところに、おじいさんとおばあさんがありました。まいにち、おじいさんは..."} {"index": {}} {"chunk_no": 2, "content": " ある日、おばあさんが、川のそばで、せっせと洗濯をしていますと、川上から、大きな桃が一つ、"} ... {"index": {}} {"chunk_no": 148, "content": " きじはケン、ケンと鳴きながら、くるくると宙返りをしました。"} {"index": {}} {"chunk_no": 149, "content": " 空は青々と晴れ上がって、お庭には桜の花が咲き乱れていました。"} (*脚注2) 2 2. ドキュメントの登録(1ドキュメントのみ) 前述で生成された Bulk API用の入力データを Elastic Cloud の Console に貼り付けて実行してみます。 (Elastic Cloud の Console への画面遷移については、前回のブログ記事を参照してください。) Elasticsearch へのインデックスの作成 今回は Elasticsearch にインデックスを作成してみたいと思います。 対象者:Elastic Cloud のアカウントを持っている人(トライアルライセンスを含む)・Elasticsearch の初心者。 できるようになること:Elastic Cloud のデプロイメント内にインデックスを作成する。 できるようになること:Elastic Cloud のデプロイメント内にインデックスを作成する。 elastic.sios.jp 2024.09.19 ドキュメントの登録先は、前回作成した momotaro_v1 インデックスです。 いきなり全部を貼り付けることはせずに、まずは、最初の2行(1ドキュメント分)のみ貼り付けて実行してみます。 POST /momotaro_v1/_bulk?refresh=true {"index": {}} {"chunk_no": 1, "content": " むかし、むかし、あるところに、おじいさんとおばあさんがありました。まいにち、おじいさんは..."} (*脚注3) 3 ドキュメントの登録に成功したら、次のような結果がレスポンスに表示されます。 { "errors": false, "took": 26734000762, "items": [ { "index": { "_index": "momotaro_v1", "_id": "*****************", "_version": 1, "result": "created", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 0, "_primary_term": 1, "status": 201 } } ] } 上記の “_id” は、リレーショナルデータベースで言うところの主キーに該当します。 さきほどの POST メソッドにより、Elasticsearch 側で自動採番されます。 3. 登録されたドキュメントの確認 Elastic Cloud の Console から次のようなリクエストを発行してみます。 GET /momotaro_v1/_search すると、次のような結果が返ってきます。 { "took": 0, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 1, "relation": "eq" }, "max_score": 1, "hits": [ { "_index": "momotaro_v1", "_id": ""*****************", "_score": 1, "_source": { "chunk_no": 1, "content": " むかし、むかし、あるところに、おじいさんとおばあさんが...(以降省略)..." } } ] } } ※ _search の response の詳細については、下記を参照してください。 Search API | Elasticsearch Guide [8.15] | Elastic www.elastic.co 1件のドキュメントが登録され、検索できるようになっていることが確認できました。 インデックスの Overview をクリックしてみます。 (画面上は momotaro となっていますが、momotaro_v1 が正しいです。) Document count が 1 になっていることがわかります。 インデックスの Documents をクリックしてみます。 さきほど登録したドキュメントが表示されています。 4. 残りのドキュメントの登録 chunk_no : 2 ~ 149 の本文を Console から Bulk API を使って登録します。 POST /momotaro_v1/_bulk?refresh=true {"index": {}} {"chunk_no": 2, "content": " ある日、おばあさんが、川のそばで、せっせと洗濯をしていますと、川上から、大きな桃が一つ、"} {"index": {}} {"chunk_no": 3, "content": "「ドンブラコッコ、スッコッコ。"} ... {"index": {}} {"chunk_no": 148, "content": " きじはケン、ケンと鳴きながら、くるくると宙返りをしました。"} {"index": {}} {"chunk_no": 149, "content": " 空は青々と晴れ上がって、お庭には桜の花が咲き乱れていました。"} momotaro_v1 インデックスのOverviewを確認すると、 Document count = 149 となっていることがわかります。 今回は149件という比較的少ないデータ量だったので、Console への貼り付けでドキュメントの登録を行いましたが、もっと大量にある場合や、外部のファイルなどからプログラムでテキストを読み込んで登録したい場合などは、Pythonなどのプログラムからドキュメントを登録する方法が向いています。 (Pythonからの呼び出しについては、後日、説明予定です。) 次回は、登録したドキュメントを検索してみたいと思います。 (2024-12-19) インデックス名を momotaro → momotaro_v1 に訂正しました。 (*脚注) Elasticsearchの1つのドキュメントに、どのような単位で登録するか?というのは、検索精度における課題の一つとなります。 検索システムで扱う本番用データであれば、どのように分割するか?は、慎重に検討すべき問題です。 例) ・一定の文字数で区切って登録する。 ・一文ずつ登録する。 ・”。”で区切って登録する。 ・意味的な塊ごとに登録する。 また、前後のドキュメント(いわゆるチャンク)との重複をどの程度にするか?も調整が難しいポイントになります。 今回は、検索できればいい、というシンプルなサンプルデータですので、元のデータで「一文」に区切られている部分を、そのまま「1つのドキュメント」として登録しています。 ↩︎ ここでの Bulk API用の入力データでは、”_id”を指定していません。 Elasticsearch への登録時に自動的に”_id”が割り振られます。 Bulk API を利用してドキュメントを登録したり、あるいは、1件ずつドキュメントを登録する場合に、 “_id” を指定して登録することも可能と言えば可能ですが、推奨いたしません。 “_id” を指定して新規登録する場合、Elasticsearch 側で “_id” が重複していないか?といったチェックが 働くことになり、ドキュメントの登録にかかる時間が長くなります。 どうしても “_id” を指定しなければならない特別な場合を除いては、”_id” は指定しないことをお勧めします。 ↩︎ インデックスのリフレッシュ間隔を短い時間にしている場合は、refresh=true を指定しなくても検索できるようになりますが、前回のブログ記事内で refresh_interval = 3600s としているため、refresh を明示的に行う必要があります。 ↩︎ The post Elasticsearch へのドキュメントの登録 first appeared on Elastic Portal .
こんにちは。 サイオステクノロジーの田川です。 今回は Elasticsearch にインデックスを作成してみたいと思います。 対象者 Elastic Cloud のアカウントを持っている人(トライアルライセンスを含む) Elasticsearch の初心者 できるようになること Elastic Cloud のデプロイメント内にインデックスを作成する。 (インデックスは作成されますが、ドキュメントは、まだ登録しません。) 前提条件 Elastic Cloud (version: 8.15.0) Elastic Cloud 上にデプロイメントを作成済 (2024年09月17日時点の情報を元に記載しています。) 1. Elasticsearch のデータ構造 Elasticsearch のデータ構造をかなり大雑把に書くと、次のような構造となります。 クラスター → インデックス → シャード → ドキュメント → フィールド ※参考 Elasticsearch での用語とリレーショナルデータベースでの用語の対応表は、おおよそ下記のようになります。 Elasticsearch での用語 リレーショナルデータベースでの用語 デプロイメント データベース クラスター (なし) インデックス テーブル シャード (なし) ドキュメント レコード フィールド カラム ※注 Elasticsearhの仕組みとリレーショナルデータベースの仕組みは異なるため、    完全に上の表に一致するわけではありません。あくまでも、「似たようなもの」です。 前回のデプロイメントの作成 で、クラスターまでは設定出来ています。 今回は、インデックス ~ フィールド を作ります。 2. インデックスの作成準備 インデックスを作成する際、シャード数やレプリケーション数を決定しておく必要があります。 レプリケーション数は後から変更することも可能ですが、シャード数はインデックス作成時に決定したものとなります。 (シャード数を変更する方法は皆無ではありませんが、レプリカほど簡単には変更できません。) ついでに、リフレッシュ間隔も設定しておきます。 この記事ではサンプルデータとして、「桃太郎」を使用します。 今回は、更新がほとんどない少量のサンプルデータなので、下表のようにします。 項目 設定値 ディフォルト値 number_of_shards 1 1 number_of_replicas 1 1 refresh_interval 3600s 1s ※端的には、大量のドキュメントがある場合には、shard の数を増やします。  また、耐障害性や高速読み取り性能を向上させたい場合には、replica の数を増やします。 ※参考 下記の Elastic 社の公式ページによると、1シャードあたりのサイズを10~50GB程度になるようシャード数を設定した方がいいようです。詳細は、下記のページを参照してください。 Size your shards | Elasticsearch Guide [8.15] | Elastic www.elastic.co 3. Dev Tools 先ほどの設定値を踏まえ、実際に、インデックスを作成します。 そのために、Dev Tools 画面を開きます。 Elastic Cloud へログイン後、前回作成したデプロイメントの Open をクリックします。 そうすると、「Welcome home」と表示された画面へ遷移します。 「Welcome home」画面の右下にある Dev Tools をクリックします。 クリックすると、次の画面(Dev Tools 画面)が表示されます。 (Dev Tools画面への遷移方法は他にもあります。) 初回は、右側の説明画面が表示されますが、[Dismiss] をクリックすることで、 この部分を閉じることができます。 左側のリクエスト欄に GET, POST, PUT, DELETE の Web リクエストを記述することができます。 Web リクエストを記述した後 ▷ をクリックすると、そのリクエストが実行され、結果が右側のレスポンス欄に表示されます。 試しに、ライセンスを確認してみます。 左側の入力欄に GET _license と入力し、その行にカーソルを置いた状態で、 ▷ をクリックします。 右側のレスポンス欄に、次のような結果が返却されます。(uidは、伏字にしています。) { "license": { "status": "active", "uid": "***********************************", "type": "enterprise", "issue_date": "2023-03-02T00:00:00.000Z", "issue_date_in_millis": 1677715200000, "expiry_date": "2028-02-29T23:59:59.999Z", "expiry_date_in_millis": 1835481599999, "max_nodes": null, "max_resource_units": 100000, "issued_to": "Elastic Cloud", "issuer": "API", "start_date_in_millis": 1677628800000 } } なお、左側のリクエスト欄に書いたリクエストは、消さない限り、これまでに発行したリクエストが残っています。 頻繁に呼びたいリクエストは、ここに書いておけば、 ▷ をクリックするとすぐにリクエストを再発行できます。 4. インデックスの作成 Dev Tools を使って、インデックスの作成リクエストを発行します。 Dev Tools の左側にリクエスト欄に、次のように入力し、 ▷ をクリックします。 (この後、「桃太郎」の内容を登録する予定なので、作成するインデックス名は、”momotaro_v1″ とします。) PUT /momotaro_v1 { "settings": { "index": { "number_of_shards": 1, "number_of_replicas": 1, "refresh_interval": "3600s" } } } 成功すれば右側のレスポンス欄に、次のような結果が表示されます。 { "acknowledged": true, "shards_acknowledged": true, "index": "momotaro_v1" } インデックスが作成されたか、確認してみます。 Dev Tools から下記のリクエストを発行してみます。 GET /momotaro_v1/_settings 成功すると、右側のレスポンス欄に、以下のように出力されます。 { "momotaro_v1": { "settings": { "index": { "routing": { "allocation": { "include": { "_tier_preference": "data_content" } } }, "refresh_interval": "3600s", "number_of_shards": "1", "provided_name": "momotaro_v1", "creation_date": "1726546814052", "number_of_replicas": "1", "uuid": "*****************", "version": { "created": "8512000" } } } } } Elastic Cloud の画面からも確認してみます。 左上の3点メニューをクリックし、プルダウンメニューを表示します。 そこから、Search の Content を選択します。 すると、インデックス一覧画面へ遷移します。 (画面上は momotaro となっていますが、momotaro_v1 が正しいです。) 先ほど作成した momotaro_v1 が表示されています。 ただし、データはまだ登録していないので、Docs count = 0 となっています。 5. フィールドマッピングの設定 インデックスにデータを格納する前に、フィールドマッピングを設定しておきます。 今回は単純なサンプルデータなので、フィールドは下表のようにします。 フィールド名 フィールドタイプ 説明 chunk_no integer チャンク番号 content text 本文 フィールドタイプは、リレーショナルデータベースでのカラムタイプに相当します。 フィールドタイプの詳細な説明については、下記を参照してください。 Field data types | Elasticsearch Guide [8.15] | Elastic www.elastic.co 補足1 文字列型の代表的なフィールドタイプには、text と keyword がありますが、用途が異なります。 今回は、小説内の文章を全文検索したいので、text を利用します。 フィールドタイプ 説明 keyword 各種コードなど、厳密に一致する文字列を検索するのに使用する。 ソートや集計も可能。 text 文章など、あいまい検索に利用する。 補足2 ちょっとだけデータを登録して、軽く確認したい、という程度であれば、 フィールドマッピングを省略してデータを登録しても、Elasticsearch がある程度、自動で設定してくれます。また、Elastic Cloud の管理画面上のGUIを使っても、ある程度、設定可能です。 ただし、細かい設定を行いたい場合は、あらかじめフィールドマッピングを API を使って作成しておいた方がいいと思います。 補足3 Elasticsearch では、フィールドの追加は、比較的容易にできます。 しかし、フィールドの削除は、容易にはできません。 フィールドタイプの変更も、制約があります。 上記を踏まえて、フィールドマッピング用のリクエストを Dev Tools に入力します。 インデックスの一覧画面から Dev Tools の画面を開くには、画面下部の Console をクリックします。 左側のリクエスト欄に次のリクエストを入力し、 ▷ をクリックします。 PUT /momotaro_v1/_mapping { "dynamic": false, "properties": { "chunk_no": { "type": "integer" }, "content": { "type": "text" } } } 成功したら、右側のレスポンス欄に、下記が表示されます。 { "acknowledged": true } 6.フィールドマッピングの確認 実際にフィールドが作成されたか確認してみます。 まずは、Dev Tools から、下記のリクエストを送信してみます。 GET /momotaro_v1/_mapping 成功すると、右側のレスポンス欄に、以下のように出力されます。 { "momotaro_v1": { "mappings": { "dynamic": "false", "properties": { "chunk_no": { "type": "integer" }, "content": { "type": "text" } } } } } Elastic Cloud の画面からも確認してみます。 インデックス一覧画面から “momotaro_v1” をクリックします。 すると、momotaro_v1 インデックスの画面が表示されます。 この画面の “Index mappings” をクリックします。 momotaro_v1 インデックスのマッピング情報が表示されます。 chunk_no が Integer 型で、content が Text 型で作成されていることがわかります。 なお、この画面にある [+ Add field] ボタンから、新たにフィールドを追加することも可能です。 ただし、細かい設定を行いたい場合には、API を使って追加することをお薦めします。 次回は、作成したmomotaro_v1インデックスへのドキュメントを登録します。 (2024-12-19) 作成するインデックス名を momotaro → momotaro_v1 に訂正しました。 The post Elasticsearch へのインデックスの作成 first appeared on Elastic Portal .
サイオステクノロジーの田川と申します。 ここでは、Elastic に関する技術的な内容を記載していきたいと思います。 まずは、Elastic Cloud 上でのデプロイメントの作成方法について説明していきます。 Elastic Cloud 上にデータを格納したい場合、その準備としてデプロイメントを作成しておく必要があります。 対象者 Elastic Cloud のアカウントを持っている人(トライアルライセンスを含む) Elastic Cloud の初心者 本記事で、できるようになること Elastic Cloud 上にデプロイメントが作成されます。 (デプロイメントが作成されますが、ドキュメント格納用のインデックスは、本記事では作成していません。) 前提条件 Elastic Cloud version: 8.15.0 (この記事内では、Enterprise ライセンスでの画面を記載しています。  他のライセンスでは、動作しない箇所があるかもしれません。) (2024年09月10日時点の情報を元に記載しています。) デプロイメントの作成手順 1. ログイン画面 URL = https://cloud.elastic.co/login へアクセスすると、ログイン画面が表示されます。 Email 欄に ログインするユーザーの E-mail アドレスを、 Password 欄に、そのユーザーのパスワードを入力して、 [Log in] をクリックします。 2. ホーム画面 ログインに成功すると、ホーム画面へ遷移します。 URL = https://cloud.elastic.co/home ※こちらの画面では、既にいくつかのデプロイメントが作成済ですが、初期状態では空です。 3. デプロイメント作成画面 さきほどのホーム画面の上部中央にある [Create Deployment] ボタンをクリックします。 すると、デプロイメントの新規作成用画面である、 Create a deployment 画面へ進みます。 Name欄に、デプロイメント名を入力し、右下の [Create deployment] ボタンをクリックすると、デプロイメントが作成されますが、Cloud Provider や Region などを変更すると左下に表示されている料金が変化します。 さらに、Version の下にある > Advanced settings をクリックすると、いろんな設定を変更することが可能です。 これらの設定を変更すると、料金も変化します。 必要に応じて、設定を変えます。 この記事では、後で機械学習まで行う予定ですので、機械学習を行える設定にしておきます。 また、ここで扱っているデータは重要なデータではなく、あくまでもサンプルデータであり、特別、高速なレスポンスも必要としていないため、耐障害性やパフォーマンスについては最低限の値とします。 実際には、本番のサービスで必要とされている機能、耐障害性、パフォーマンス要件に合わせて、設定してください。 (これらの設定値は、デプロイメント作成後に、後述のデプロイメントの編集画面から変更することも可能です。) (この記事では、Deployment name は “SIOS-BLOG-SAMPLE-1” としておきます。 このDeployment nameは、半角英数字とハイフンのようなシンプルな名前にしておくのが賢明だと思われます。) 4. デプロイメント作成中~作成完了画面 さきほどのCreate deployment画面で設定を終了したら、右下の [Create deployment] ボタンをクリックします。 すると、次の画面が表示されます。 5分ほど待つと、次の画面になります。 (“Your deployment is ready!” が表示されます。) この画面に表示されている Username, Password は、アプリ接続時などで必要となるので忘れないようにしてください。 万が一、忘れてしまった場合は、パスワードのリセットを行ってください。 [Download] ボタンをクリックすると、CSV形式で、Username, Password がダウンロードされます。 5. デプロイメントの初期画面 さきほどの画面の右上の [Continue] ボタンをクリックすると、作成したデプロイメントの初期画面に遷移します。 URL = https://***/app/home#/getting_started (*** には、「実際にデプロイされた地域のホスト名のFQDN:ポート番号」がはいります。) 6. 作成されたデプロイメントの確認 先ほど作成したデプロイメントが正しく作成されたかどうかを確認してみます。 一度、ログアウトして、再ログインしてみます。 すると home 画面に、先ほど作成したデプロイメントが表示されていることを確認できます。 この画面の右下の Manage をクリックすると、選択したデプロイメントの管理画面へ遷移します。 7. デプロイメントの管理画面 (デプロイメント名を変更することは滅多にないと思われますが、画面中央の下部にある Deployment name の Edit から Deployment name を変更することも可能です。) デプロイメントの管理画面の左のメニューから Edit をクリックします。 8. デプロイメントの編集画面 デプロイメントの現在の設定値を知ることができます。 設定値を変更して、下にある [Save] ボタンをクリックすると変更することもできます。 [Save] ボタンは、かなり下に表示されるので、下スクロールする必要があります。 また、[Save] をクリックして設定値を変更する場合、変更内容を反映させるために時間がかかるので、注意が必要です。 参考にしたWebページ Elastic Cloud について 〜実際にデプロイメントを作ってみよう〜 - Qiita (情報は投稿時点(2022年3月頃)の話です)Elastic Cloud について 〜実際にデプロイメントを作ってみよう〜Elastic Cloud は一言でいうと、Elastic が提供する… qiita.com The post Elastic Cloud 上でのデプロイメントの作成 first appeared on Elastic Portal .