https://www.cnblogs.com/liululee/p/11075432.html
1.はじめに
Elasticsearchにすべてのノウハウを使用したことのある人は、ビルドの検索クエリに残りベースのAPIは、退屈でエラーが発生しやすいかもしれません。
このチュートリアルでは、我々は冗談、のHTTP JavaクライアントElasticsearchのための1つを検討します。Elasticsearchしかし冗談APIは、インタフェースを使用するようにスムーズかつ容易に提供し、独自のネイティブJavaクライアントを提供します。
私たちが行う必要がある最初の事は、私たちのPOMファイルに冗談ライブラリをインポートすることです:
<dependency>
<groupId>io.searchbox</groupId> <artifactId>jest</artifactId> <version>6.3.1</version> </dependency>
冗談バージョンはElasticsearchメジャーバージョン番号に従うことです。
これは、クライアントとサーバー間の互換性を確保します。
冗談依存含むことによって、適切な[elasticsearchライブラリ]は、(https://search.maven.org/search?q=g:org.elasticsearch A:elasticsearch)依存性を渡すために含まれます。
この節では、共通のタスク冗談クライアントElasticsearchを実行する方法を検討します。
冗談クライアントを使用するには、我々だけで使用 JestClientFactoryが 作成 JestClientの オブジェクトを。これらのオブジェクトを作成するためのコストが非常に高く、スレッドセーフであるので、我々はアプリケーション全体で共有することができるシングルトンのインスタンスを作成します。
public JestClient jestClient() { JestClientFactory factory = new JestClientFactory(); factory.setHttpClientConfig( new HttpClientConfig.Builder("http://localhost:9200") .multiThreaded(true) .defaultMaxTotalConnectionPerRoute(2) .maxTotalConnection(10) .build()); return factory.getObject(); }
これは、ローカルで実行Elasticsearchへのクライアントの接続先を冗談クライアントを作成します。この接続例はシンプルですが、冗談も完全にプロキシ、SSL、認証、でも、ノードの発見をサポートしていますが。
JestClientの クラスは、少数のパブリックメソッドジェネリッククラスです。私たちが実行される使用する主な方法は、それがアクションインターフェイスのインスタンスを取ります。冗談クライアントが持つElasticsearchの相互作用を作成するための、いくつかの異なるオペレーティング・ビルダークラスを提供します。
すべてのコールの結果の一例は、冗談のJestResultされています。私たちは、呼び出すことができます issucceeded
成功した方法かどうかを確認します。失敗した操作のために、我々は呼び出すことができGetErrorMessage
、より詳細な情報を入手する方法を:
JestResult jestResult = jestClient.execute(new Delete.Builder("1").index("employees").build()); if (jestResult.isSucceeded()) { System.out.println("Success!"); } else { System.out.println("Error: " + jestResult.getErrorMessage()); }
インデックスが存在するかどうかをチェックし、我々が使用するIndicatesExists
次のように:
JestResult result = jestClient.execute(new IndicesExists.Builder("employees").build())
インデックスを作成し、我々は使用CreateIndex
次のことを:
jestClient.execute(new CreateIndex.Builder("employees").build());
これは、設定が持っているデフォルトのインデックスを作成します。インデックスを作成するときに我々は、特定の設定を上書きすることができます:
Map<String, Object> settings = new HashMap<>(); settings.put("number_of_shards", 11); settings.put("number_of_replicas", 2); jestClient.execute(new CreateIndex.Builder("employees").settings(settings).build());
使用するModifyAliases
エイリアスを作成または変更する操作をも非常に簡単です:
jestClient.execute(new ModifyAliases.Builder( new AddAliasMapping.Builder("employees", "e").build()).build()); jestClient.execute(new ModifyAliases.Builder( new RemoveAliasMapping.Builder("employees", "e").build()).build());
簡単に新しい文書を作成するように、索引または索引操作を使用して冗談クライアント。ちょうどJSONデータでElasticsearch文書は、JSON冗談クライアントインデックスへの転送データにはいくつかの方法があります。
この例では、のは、架空の従業員の文書を使用してみましょう:
{
"name": "Michael Pratt", "title": "Java Developer", "skills": ["java", "spring", "elasticsearch"], "yearsOfService": 2 }
第一の方法は、JSON文書はJava文字列を表し使用することです。我々は、手動でJSON文字列を作成することができますが、我々は正しい形式、中括弧とエスケープ引用符に注意を払う必要がありますが。このように、簡単な方法は、文字列に変換し、JSONの私たちの構造を構築するために、ライブラリJSON(例えば、ジャクソン)を使用することです:
ObjectMapper mapper = new ObjectMapper(); JsonNode employeeJsonNode = mapper.createObjectNode() .put("name", "Michael Pratt") .put("title", "Java Developer") .put("yearsOfService", 2) .set("skills", mapper.createArrayNode() .add("java") .add("spring") .add("elasticsearch")); jestClient.execute(new Index.Builder(employeeJsonNode.toString()).index("employees").build());
我々はまた、Javaを使用することができます 地図を JSONデータを表現するために、インデックスアクションにそれを渡します。
Map<String, Object> employeeHashMap = new LinkedHashMap<>(); employeeHashMap.put("name", "Michael Pratt"); employeeHashMap.put("title", "Java Developer"); employeeHashMap.put("yearsOfService", 2); employeeHashMap.put("skills", Arrays.asList("java", "spring", "elasticsearch")); jestClient.execute(new Index.Builder(employeeHashMap).index("employees").build());
最後に、冗談クライアントは、インデックスを作成するドキュメントの任意のPOJO表現を受け入れることができます。私たちは、Employeeクラスがあるとします。
public class Employee { String name; String title; List<String> skills; int yearsOfService; }
私たちは、インデックスビルダーに直接渡され、このクラスのインスタンスを置くことができます。
Employee employee = new Employee(); employee.setName("Michael Pratt"); employee.setTitle("Java Developer"); employee.setYearsOfService(2); employee.setSkills(Arrays.asList("java", "spring", "elasticsearch")); jestClient.execute(new Index.Builder(employee).index("employees").build());
冗談クライアントを使用して主に2つの方法がありElasticsearchからのアクセス文書です。私たちは、ドキュメントIDを知っていればまず第一に、我々はそれへの直接アクセスを取得するように設定できます。
jestClient.execute(new Get.Builder("employees", "17").build());
返されたドキュメントにアクセスするために、我々は次のいずれかを呼び出す必要がありますgetSource
方法を。私たちは、元のためのJSONの結果を得ることができ、またはDTOをデシリアライズします。
Employee getResult = jestClient.execute(new Get.Builder("employees", "1").build()) .getSourceAsObject(Employee.class);
ドキュメントへのその他のアクセス方法は、このように冗談で検索操作によって達成され、検索クエリを使用することです。
冗談クライアントは、すべてのElasticsearchクエリDSLをサポートしています。インデックス付けの操作と同じように、クエリはJSON文書として表され、検索を実行するには、いくつかの方法があります。
まず、我々は、検索クエリのJSON文字列表現を渡すことができます。念のため、私たちは、文字列が適切にエスケープされていることを確認し、有効なJSONである必要があります。
String search = "{" +
" \"query\": {" + " \"bool\": {" + " \"must\": [" + " { \"match\": { \"name\": \"Michael Pratt\" }}" + " ]" + " }" + " }" + "}"; jestClient.execute(new Search.Builder(search).build());
上記インデックスの操作と同じように、私たちは、クエリ文字列を構築するためにジャクソンJSONライブラリのように使用することができます。また、我々はまた、ElasticsearchネイティブクエリAPIを使用することができます。これの欠点は、我々のアプリケーションは、Elasticsearchライブラリの整合性に依存しなければならないということです。
GETSOURCE我々は試合に文書検索操作にアクセスするためのメソッドを使用することができます。しかし、冗談にもマッチする文書をラップし、メタデータの結果についての情報を提供しヒットするクラスを提供しています。ルーティングおよびその結果、いくつかの例を解釈し、スコア:使用のヒットクラスは、私たちは、それぞれの追加のメタデータの結果にアクセスすることができます。
List<SearchResult.Hit<Employee, Void>> searchResults = jestClient.execute(new Search.Builder(search).build()) .getHits(Employee.class); searchResults.forEach(hit -> { System.out.println(String.format("Document %s has score %s", hit.id, hit.score)); });
冗談の更新は、ドキュメントを更新するために、簡単な操作を提供します。
employee.setYearOfService(3); jestClient.execute(new Update.Builder(employee).index("employees").id("1").build());
それは我々が2間の動作コードの共有が容易になります以前のJSON表現を、見た同じインデックス操作を受け付けます。
削除操作を使用してインデックスから削除文書が完成されます。これは、インデックス名や文書IDが必要です。
jestClient.execute(new Delete.Builder("17") .index("employees") .build());
冗談クライアントは、バッチ操作をサポートしています。これは、時間と帯域幅を節約するために同時にすることで、複数の操作を送信できることを意味します。
一括操作を使用して、我々は、単一の呼び出しにリクエストの任意の数を組み合わせることができます。私たちも、リクエストの様々なタイプと組み合わせることができます。
jestClient.execute(new Bulk.Builder() .defaultIndex("employees") .addAction(new Index.Builder(employeeObject1).build()) .addAction(new Index.Builder(employeeObject2).build()) .addAction(new Delete.Builder("17").build()) .build());
冗談また、クライアントは、非同期操作をサポートしています。この手段我々は、これらの操作のいずれかを実行するために、ノンブロッキングI / Oを使用することができます。
非同期呼び出しに、単にクライアントの使用executeAsync
方法を:
jestClient.executeAsync(
new Index.Builder(employeeObject1).build(), new JestResultHandler<JestResult>() { @Override public void completed(JestResult result) { // handle result } @Override public void failed(Exception ex) { // handle exception } });
加えて、操作、必要な非同期ストリーム(本実施形態ではインデックスである)ことに留意されたいですJestResultHandler
。操作が完了すると、冗談クライアントがオブジェクトを呼び出します。そして、完全な故障- -インタフェースは2つのメソッドがあり、各処理動作の成功または失敗を可能にします。
このチュートリアルでは、簡単に冗談クライアント、RESTfulなJavaクライアントのElasticsearchのための1つを説明します。我々はその機能のごく一部をご紹介しますが、明らかに冗談は堅牢なElasticsearchクライアントがあるが。これは、スムーズなビルダークラスとRESTfulなインターフェースを学ぶために簡単にそれを作る、それが完全にElasticsearchインターフェイスがネイティブクライアントへの強力な代替になりサポートしています。
いつものように、このチュートリアルのコード例のすべては、私たちの内にあるGithubのページに。
著者:マイケル・プラット
翻訳:huowolf /