検索エンジンサーバーの導入と初期設定
最新の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 }
]
}
}
}
}