SpringBoot は Elasticsearch8.x (8) を統合します | (新しいバージョンの Java API クライアントの Painless 言語スクリプトによって使用されます)

SpringBoot は Elasticsearch8.x (8) を統合します | (新しいバージョンの Java API クライアントの Painless 言語スクリプトによって使用されます)


各章
へのリンク 第 1 章へのリンク: SpringBoot と Elasticsearch7.x の統合 (1) | (関数実装の作成、削除、変更およびチェック)
第 2 章へのリンク: Elasticsearch7.x を統合するための SpringBoot へのリンク (2) | (複雑なクエリ)
へのリンク第 3 章: SpringBoot と Elasticsearch7.x の統合 (3) | (集約のインデックス集約クエリ)
第 4 章のリンク: SpringBoot と Elasticsearch7.x の統合 (4) | (集約のバケット集約クエリ)
第 5 章のリンク: SpringBoot と Elasticsearch7.x の統合 ( 5) | match、match_phrase の違い)
第 6 章のリンク: SpringBoot に統合された Elasticsearch8.x (6) | (新しいバージョンの Java API クライアントを使用)
第 7 章のリンク: SpringBoot に統合された Elasticsearch8.x (7) | (新しいバージョンの Java API クライアントは完全な例)

序文

Painless Scripting の紹介:
Painless は、Elasticsearch で使用するために設計された、シンプルで安全なスクリプト言語です。ES5.0 以降、これは Elasticsearch のデフォルトのスクリプト言語となり、インライン スクリプトやストアド スクリプトに安全に使用できます。

痛みのない機能:
素晴らしいパフォーマンス: 痛みのないスクリプトは、代替スクリプト (Groovy を含む) よりも数倍高速に実行されます。
強力なセキュリティ: ホワイトリストを使用して機能やフィールドへのアクセスを制限し、セキュリティ リスクの可能性を回避します。
オプションの入力: 変数とパラメーターでは、明示的な型または動的な def 型を使用できます。
使いやすさ: Java の基本構文を拡張し、Groove スタイルのスクリプト言語機能と互換性があります。
特定の最適化: ES は Elasticsearch スクリプト用に正式に設計されています。

使用シナリオ:
カスタム フィールド、カスタム スコアリング、カスタム更新、カスタム集計分析などの複雑なビジネス問題を解決するために使用されます。

短所:
パフォーマンスの問題。公式ドキュメントのパフォーマンスの最適化では、スクリプトの使用がパフォーマンスの低下につながることが明確に指摘されています。
必要がない場合はスクリプトを使用せず、他の方法に置き換えるようにしてください。

1. Elasticsearchのスクリプト構文の概要

lang: スクリプトを記述する言語を指定します。デフォルトは painless です。
source: ソースはスクリプト自体です
params: スクリプトに変数として渡される名前付きパラメータを指定します。

	  "script": {
    
    
    "lang":   "",
    "source""",
    "params": {
    
     ... }
  }

2. Elasticsearchでのデータ準備

記事を準備し、ES データベースに保存します。versionList は、記事のバージョン番号リストを示すリスト配列です。後続の操作はバージョンに対して実行されます。

{
    
    
	"_index": "64c36a324bfade24ee0f18ab",
	"_id": "ACNZm4kBoucrmKIhwyQC",
	"_version": 1,
	"_score": 1,
	"_source": {
    
    
		"id": "c32e0056a6284ee7b2ea6e483ce874e2",
		"docId": "64c36af14bfade24ee0f18ba",
		"parentId": "64c36af14bfade24ee0f18ba",
		"docName": "Csdn博客介绍.pdf",
		"fileExtension": "pdf",
		"content": "CSDN是全球知名中文IT技术交流平台,创建于1999年,包含原创博客、精品问答、职业培训、技术论坛、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区",
		"title": "Csdn博客介绍",
		"sort": 13,
		"versionList": [
			1
		]
	}
}

3. スクリプト実装事例

1.リスト型データをesに一括追加する

ビジネス要件により、既存のバージョンの上に新しいバージョンを作成する必要があります。具体的な実装は次のとおりです。該当するバージョンの記事を見つけて追加します。

    public void addVersion(String indexName, Integer fromVersion, Integer newVersion) {
    
    
        Map<String, JsonData> map = Maps.newHashMap();
        map.put("newVersion", JsonData.of(newVersion));
        try {
    
    
            client.updateByQuery(d -> d
                    .index(indexName)
                    .query(q -> q
                            .term(t -> t
                                    .field("libVersionList")
                                    .value(fromVersion)
                            ))
                    .script(s -> s
                            .inline(src -> src
                                    .lang("painless")
                                    .source("ctx._source.versionList.add(params.newVersion)")
                                    .params(map)
                            )
                    )
            );
        } catch (IOException e) {
    
    
            log.error(e.getMessage());
        }
    }

2. es内のリスト型データを一括削除

ビジネス ニーズのため、特定のバージョンを削除する必要があります。具体的な実装は次のとおりです。対応するバージョンの記事を見つけて、バージョン番号を削除します。注 : ここでは、versionList を容易にし、対応する添字を見つけ、
. Remove() 操作は、位置に対応するデータを削除することです。

    public void deleteVersion(String indexName, Integer version) {
    
    
        Map<String, JsonData> map = Maps.newHashMap();
        map.put("version", JsonData.of(version));
        try {
    
    
            client.updateByQuery(d -> d
                    .index(indexName)
                    .query(q -> q
                            .term(t -> t
                                    .field("versionList")
                                    .value(version)
                            )
                    )
                    .script(s -> s
                            .inline(src -> src
                                    .lang("painless")
                                    .source("for (int i = 0; i < ctx._source.versionList.length; i++){if(params.version == ctx._source.versionList[i]){ctx._source.versionList.remove(i)}}")
                                    .params(map)
                            )
                    )
            );
        } catch (IOException e) {
    
    
            log.error( e.getMessage());
        }
    }

要約する

上記は、elasticsearch Java クライアントでスクリプトを使用してデータ ミラーリングのバッチ操作と新規操作を実行する方法ですが、構文に慣れていれば操作は非常に簡単です。

おすすめ

転載: blog.csdn.net/Oaklkm/article/details/132021693