WindowsOSにおけるElasticsearch検索エンジンとKibana可視化ツールの構築手順

検索エンジンサーバーの導入と初期設定

最新のElasticsearchディストリビューションには実行に必要なJVMが同梱されているため、別途Java環境を構築する必要はありません。公式ダウンロードページからZIPアーカイブを取得し、任意のディレクトリに展開します。

展開後、binディレクトリへ移動し、elasticsearch.batを実行することでノードが起動します。運用の利便性を考慮し、展開パスをシステム環境変数に登録し、PATHに追加することを推奨します。

サービスへの接続確認

バージョン7.x以降の環境では、デフォルトでTLS暗号化が有効化され、自動生成された認証情報が要求されます。起動ログに出力される初期ユーザー名とパスワードを使用し、以下のエンドポイントへアクセスします。

https://localhost:9200/

正常に接続されると、クラスター情報とバージョン詳細を含むJSONレスポンスが返却されます。セキュリティ設定を緩和した開発環境では、HTTPプロトコルでのアクセスも可能ですが、本番環境では認証と暗号化の維持が必須です。

Windowsサービスとしての登録と管理

コマンドプロンプトを管理者権限で開き、以下のスクリプトを用いてWindowsサービスとして登録します。これにより、ログウィンドウの常駐を避け、バックグラウンドでの安定稼働が可能になります。

elasticsearch-service.bat install

登録後は、サービス管理コマンドでノードの起動・停止・GUIマネージャーの呼び出しが実行可能です。

  • 起動:elasticsearch-service.bat start
  • 停止:elasticsearch-service.bat stop
  • 設定画面:elasticsearch-service.bat manager
  • 削除:elasticsearch-service.bat remove

形態素解析プラグインの適用

日本語や中国語の検索精度を向上させるため、サードパーティ製アナライザーを導入します。バージョン互換性が厳格に要求されるため、エンジン本体のメジャー・マイナーバージョンと完全に一致するプラグインアーカイブを公式リポジトリまたは国内ミラーから取得してください。

CLIによる自動インストール

展開したZIPファイルを指定し、バンドルされているプラグイン管理ユーティリティを実行します。

elasticsearch-plugin.bat install file:///E:/plugins/elasticsearch-analysis-ik-v8.12.zip

セキュリティ警告プロンプトが表示された後に許可を与えると、依存ライブラリがplugins/analysis-ik配下に配置されます。

手動展開と設定

ネットワーク制約によりCLI実行が困難な場合は、アーカイブを直接解凍し、plugins/analysis-ikディレクトリを新規作成してその内部へjarファイル群を配置します。さらに、同ディレクトリ内にconfigフォルダを作成し、辞書設定ファイルを格納します。

<?xml version="1.0" encoding="UTF-8"?>
<properties>
  <comment>Analyzer Extension Config</comment>
  <entry key="ext_dict">custom_terms.dic</entry>
  <entry key="ext_stopwords">stopwords.dic</entry>
</properties>

解析動作の検証

開発ツールまたはAPIクライアントから解析エンドポイントへリクエストを送信し、トークン化の結果を確認します。

GET _analyze
{
  "analyzer": "ik_max_word",
  "text": "分散検索システムの構築と運用"
}

ik_max_wordは細かな単位での分割を試み、ik_smartは最長一致による粗い分割を実行します。

バッチデータの一括投入

外部ツールを用いて大量のドキュメントをインデックスへ登録する場合は、curlまたは類似のHTTPクライアントが利用できます。バイナリデータフラグを使用し、改行区切りのJSONファイルを送信します。

curl -H "Content-Type: application/json" ^
  -XPOST "http://localhost:9200/warehouse_items/_doc/_bulk?refresh" ^
  --data-binary "@./dataset_export.json"

可視化ダッシュボードの構築

データの可視化と対話的なクエリ実行を目的とした管理UIを別途展開します。検索エンジンと完全にバージョンを揃えたパッケージを取得し、bin/kibana.batからプロセスを起動します。

ブラウザからhttp://localhost:5601へアクセスし、Dev Toolsコンソールを開くことでRESTfulな操作が可能になります。インターフェースの言語設定を変更するには、config/kibana.yml内のロケール指定を書き換えます。

i18n.locale: "zh-CN"

設定反映後、サービスを再起動すればUI表記が変更されます。クラスターのヘルスチェックはGET /_cat/health?vで実行でき、statusがgreenであれば全シャードが正常に動作しています。

インデックスとドキュメントのCRUD操作

Elasticsearchのインデックスはリレーショナルデータベースにおけるデータベースまたはテーブルに相当します。HTTPメソッドを用いた操作体系は以下の通りです。

インデックスの作成とドキュメント登録

PUT /warehouse_db?pretty

特定のIDを指定してドキュメントを格納する場合はPUTを使用します。

PUT /warehouse_db/products/1001?pretty
{
  "sku_code": "LED-900",
  "product_name": "スマート電球",
  "price": 2980.0
}

複数のドキュメントを一度に登録するには、_bulkエンドポイントを使用します。各行はJSONオブジェクトとして記述し、メタデータ行とデータ行を交互に配置します。

POST /_bulk
{"create":{"_index":"warehouse_db","_id":"2001"}}
{"sku_code":"CBL-HDMI","product_name":"4K対応ケーブル","price":1500,"stock":200}
{"create":{"_index":"warehouse_db","_id":"2002"}}
{"sku_code":"ADP-USB","product_name":"変換アダプタ","price":850,"stock":500}

データの参照と更新

インデックスの一覧はGET /_cat/indices?v、単一ドキュメントの取得はGET /warehouse_db/products/1001?prettyで実行します。

既存ドキュメントの部分的な修正には、POSTメソッドと_updateエンドポイントを組み合わせます。これにより、バージョン競合を最小限に抑えた更新が可能になります。

POST /warehouse_db/_update/1001?pretty
{
  "doc": {
    "price": 3200.0,
    "updated_at": "2023-11-05"
  }
}

レコードの削除

インデックス自体の削除やドキュメント単位での削除は、それぞれ以下のエンドポイントへDELETEリクエストを送信します。

DELETE /warehouse_db?pretty
DELETE /warehouse_db/products/2001?pretty

検索クエリの実行と高度なフィルタリング

全文検索とマッチング制御

matchクエリは入力値をアナライズし、転置インデックスに対して照合を行います。デフォルトではOR条件ですが、operator: "and"を指定することで全てのトークンが一致するドキュメントのみを抽出できます。

GET /warehouse_db/_search
{
  "query": {
    "match": {
      "product_name": {
        "query": "スマート 電球",
        "operator": "and",
        "minimum_should_match": "80%"
      }
    }
  }
}

複数のフィールドにまたがって検索を行う場合はmulti_matchを使用します。また、キーワードや数値の完全一致にはtermおよびtermsクエリが適しています。

ソート・ページネーション・フィールド制御

結果の順序付けやページ分割はsort、from、sizeパラメータで制御します。通信帯域を節約するため、不要なフィールドを除外または含めるフィールドを明示的に指定することが可能です。

GET /warehouse_db/_search
{
  "query": { "match_all": {} },
  "from": 10,
  "size": 5,
  "sort": [{ "price": "asc" }],
  "_source": ["sku_code", "product_name"]
}

複合条件と範囲指定

boolクエリを使用することで、must(必須)、should(オプショナル)、must_not(除外)の論理演算を組み合わせた複雑な検索条件を構築できます。

GET /warehouse_db/_search
{
  "query": {
    "bool": {
      "must": { "match": { "product_name": "ケーブル" } },
      "filter": { "range": { "price": { "gte": 1000, "lte": 5000 } } }
    }
  }
}

スコアリングに影響を与えずにドキュメントを絞り込む場合は、filterコンテキストを活用します。フィルタのみのクエリであれば、constant_scoreでラップすることで計算コストを低減できます。

GET /warehouse_db/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "term": { "stock.keyword": "available" }
      }
    }
  }
}

ファジー検索と集計処理

入力ミスや表記揺れに対応するため、fuzzyパラメータを使用して編集距離を許容する検索が可能です。

GET /warehouse_db/_search
{
  "query": {
    "fuzzy": {
      "product_name": {
        "value": "スマード電球",
        "fuzziness": "AUTO"
      }
    }
  }
}

データの分布やカテゴリ別の件数を算出するには、集約(Aggregation)機能を利用します。hitsの結果は不要なためsize: 0に設定し、バケット単位でのグループ化を行います。

GET /warehouse_db/_search
{
  "size": 0,
  "aggs": {
    "price_ranges": {
      "range": {
        "field": "price",
        "ranges": [
          { "to": 2000 },
          { "from": 2000, "to": 5000 },
          { "from": 5000 }
        ]
      }
    }
  }
}

タグ: Elasticsearch Kibana full-text-search ik-analyzer RESTful-API

9月30日 05:57 投稿