Elasticsearchは、大規模なデータセットを処理するために設計されたフルテキスト検索エンジンです。説明によると、当然のアプリケーションログを格納し、検索するためにそれを使用。そしてLogstashとKibanaは一緒に、それはこの中に私の以前の記事のいくつかの弾性スタックが記載されている強力なソリューションの一部です。
Elasticsearchされていないアプリケーションログの使用のみのシナリオを保持します。それは主リレーショナルデータベースであり、補助データベース・アプリケーションのような通常使用されます。あなたは、フルテキスト検索や、もはや大規模なデータセットを変更していない唯一のストレージアプリケーションの歴史の多くを実行する必要がある場合、このメソッドは特に便利です。もちろん、この方法には長所と短所があります。あなたは、同じデータを含む2つの異なるデータソースを使用するときは、最初の同期を考慮する必要があります。あなたは、いくつかのオプションがあります:リレーショナルデータベースベンダーによると、あなたは、SQL更新の履歴が含まれているバイナリまたはトランザクションログを使用することができます。この方法では、ログ、Elasticsearchにそのデータを読み取るために、いくつかのミドルウェアが必要です。あなたは、常にデータベース全体側の責任(フリップフロップ)またはElasticsearch端(JDBCプラグイン)を移動することができます。
データ構造:どんなにあなたがElasticsearchにデータをインポートする方法、我々は別の問題を考慮してはなりません。リレーショナルデータベース内のデータは、複数のテーブル間で分散されてもよいです。あなたがElasticsearchを使用する場合は、単一のタイプとしてそれを保存する必要があります。これは、より多くのディスク領域の使用状況につながることができます冗長データを、維持するためにあなたを強制します。同等のリレーショナルデータベースよりクエリElasticsearchが速く照会し、その場合はもちろん、この効果は許容されます。
さて、この場合には導入後の長期継続。春ブーツ春データリポジトリとElasticsearchを介して相互作用するための簡単な方法を提供します。
1 Elasticsearchのサポートを有効にします
慣例春ブーツによって、我々はElasticsearchのサポートを有効にするためのコンテキストで任意のBeanを提供する必要はありません。我々は唯一のpom.xmlに以下の依存関係を追加する必要があります。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
デフォルトでは、アプリケーションがローカルホスト上のElasticsearchに接続しようとします。私たちは別のターゲットURLを使用する場合、我々は、構成設定でそれをオーバーライドする必要があります。これはデフォルトのクラスタ名と住所、及びドッカーコンテナElasticsearchの先頭のアドレスを上書きし、当社のapplication.ymlファイルの断片であります:
spring:
data:
elasticsearch:
cluster-name: docker-cluster
cluster-nodes: 192.168.1.100:9300
アプリケーションことができ、健康エンドポイント春ブーツアクチュエータヘルスモニタリングElasticsearch接続による。まず、次のMavenの依存関係を追加する必要があります。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
ヘルスチェックはデフォルトで有効になっており、自動的にElasticsearchチェックを設定します。しかし、これはElasticsearch休憩APIクライアントの実行によって検証されます。この場合、我々は、RESTを使用するようにクライアントのアドレスを設定するためのプロパティspring.elasticsearch.rest.uris-責任を上書きする必要があります。
spring:
elasticsearch:
rest:
uris: http://192.168.1.100:9200
2つの実行Elasticsearch
我々のテストのために、我々は開発モードでの単一ノードのElasticsearch例を実行する必要があります。いつものように、我々はドッカーコンテナを使用します。これは、ドッカーコンテナアップで、9200と9300のポート上で公開されてコマンド。
$ docker run -d --name elasticsearch -p 9200 : 9200 -p 9300 : 9300 -e "discovery.type=single-node" elasticsearch: 6.6.2
春データライブラリーの構築3
Elasticsearchリポジトリを有効にするには、我々は唯一のメインクラス@EnableElasticsearchRepositoriesコメントやコンフィギュレーション・クラスを使用する必要があります。
@SpringBootApplication
@EnableElasticsearchRepositories
public class SampleApplication { ... }
次のステップは、拡張CrudRepositoryリポジトリインターフェースを作成することです。このような保存やfindByIdなど、いくつかの基本的な操作を提供します。あなたには、いくつかの追加のメソッドを検索したい場合は、インターフェイス春データを次の中の新しいネーミング・メソッドを定義する必要があります。
public interface EmployeeRepository extends CrudRepository<Employee, Long> {
List<Employee> findByOrganizationName(String name);
List<Employee> findByName(String name);
}
4ビルドのドキュメント
関連するオブジェクトが含まれている私たちの物理的な関係のタイル構造(組織、部署)単一Employeeオブジェクト。あなたは比較し、RDBMS内の関連するグループテーブルのビューを作成するには、このメソッドを使用することができます。スプリングデータElasticsearch命名法では、文書は単一のオブジェクトとして格納されています。したがって、@Document注釈オブジェクトを使用する必要があります。また、ターゲットのインデックス名、タイプを設定する必要があり、IDはElasticsearchです。注釈は@Field他のマップを構成するために使用することができます。
@Document(indexName = "sample", type = "employee")
public class Employee {
@Id
private Long id;
@Field(type = FieldType.Object)
private Organization organization;
@Field(type = FieldType.Object)
private Department department;
private String name;
private int age;
private String position;
// Getters and Setters ...
}
5つの初期化データ
冒頭で述べたように、あなたはElasticsearch主な理由は、大規模なデータを処理する必要がある使用することもできます。したがって、それは我々のテストElasticsearchノードを埋めるために多数の文書を使用するのが最適です。あなたがワンステップで多くのドキュメントを挿入したい場合は、バルクAPIを使用する必要があります。バルクAPIは、インデックス/削除操作の数の実装は、単一のAPIコールで可能であるができます。これは大幅にインデックス速度を向上させることができます。あなたは春データElasticsearchTemplate Beanを使用して一括操作を行うことができます。また、自動的に春ブーツに設定することができます。テンプレートは、インデックス入力パラメータとしてクエリのリストを意志bulkIndex方法を提供します。これは、アプリケーションの起動豆でサンプルテストデータに挿入達成されます。
public class SampleDataSet {
private static final Logger LOGGER = LoggerFactory.getLogger(SampleDataSet.class);
private static final String INDEX_NAME = "sample";
private static final String INDEX_TYPE = "employee";
@Autowired
EmployeeRepository repository;
@Autowired
ElasticsearchTemplate template;
@PostConstruct
public void init() {
for (int i = 0; i < 10000; i++) {
bulk(i);
}
}
public void bulk(int ii) {
try {
if (!template.indexExists(INDEX_NAME)) {
template.createIndex(INDEX_NAME);
}
ObjectMapper mapper = new ObjectMapper();
List<IndexQuery> queries = new ArrayList<>();
List<Employee> employees = employees();
for (Employee employee : employees) {
IndexQuery indexQuery = new IndexQuery();
indexQuery.setId(employee.getId().toString());
indexQuery.setSource(mapper.writeValueAsString(employee));
indexQuery.setIndexName(INDEX_NAME);
indexQuery.setType(INDEX_TYPE);
queries.add(indexQuery);
}
if (queries.size() > 0) {
template.bulkIndex(queries);
}
template.refresh(INDEX_NAME);
LOGGER.info("BulkIndex completed: {}", ii);
} catch (Exception e) {
LOGGER.error("Error bulk index", e);
}
}
// sample data set implementation ...
}
起動時にデータを挿入する必要がない場合は、最初のインポートは、プロセスを無効にするにはfalseを有効に変更属性をすることができます。これはSampleDataSet豆宣言です:
@Bean
@ConditionalOnProperty("initial-import.enabled")
public SampleDataSet dataSet() {
return new SampleDataSet();
}
6つのビューデータと実行クエリ
無効になっているBeanが拡張インデックスについては責任を負いません、あなたは、サンプル・アプリケーションを開始していると仮定し、すべてのデータがElasticsearchノードに挿入されるまで、数時間待つのに十分な忍耐を持って、それは今100Mの従業員に文書の種類が含まれています。クラスタディスプレイに関する一部の情報はそれだけの価値があります。あなたはまた、ElasticHQとして、利用できるGUIツールをダウンロードすることができ、これを行うにはElasticsearchクエリを使用することができます。偶然にも、ElasticHQはドッカーコンテナとして使用することができます。あなたはElasticHQコンテナを起動するには、次のコマンドを実行する必要があります。
$ docker run -d --name elastichq -p 5000:5000 elastichq/elasticsearch-hq
ElasticHQ、ポート5000 GUI経由のWebブラウザーアクセスを開始した後。同社のWebコンソールは、クラスタ化に関する情報を提供し、インデックスと基本的な情報は、クエリの実行を可能にします。あなただけが統計で、メインのダッシュボードにリダイレクトされます、Elasticsearchノードアドレスを入力する必要があります。これは、メインのインストルメントパネルをElasticHQています。
あなたが見ることができるように、私たちはサンプルが5つのスライスに分割されるという名前のインデックスを持っています。これは、春データ@DocumentがFRAGフィールドはそれをカバーするために使用することができる提供されるデフォルトです。クリックした後、私たちはインデックス管理パネルにナビゲートすることができます。あなたは、このようなキャッシュやリフレッシュのインデックスをクリアすると、インデックスの特定の操作を行うことができます。また、すべての統計のスライスを表示することができます。
現在のテストのために、私は(スペースの3ギガバイト程度)25M文書の従業員の種類について持っています。我々はいくつかのテストクエリを実行することができます。従業員名のGET /従業員/ {名前}と組織名のGET /従業員/組織/ {organizationNameの}によって:私は、検索のための2つのエンドポイントを開示してきました。結果は圧倒的ではありません。私は、同じ量のデータを使用してリレーショナルデータベースが同じ結果を得ることができると思います。
7テスト
さて、私たちは、大規模なデータセットの開発といくつかの手動テストを完了しています。今、それが構築されたときに、いくつかの統合テストの実行を作成するための時間です。Testcontainers - 私たちは、テストのJUnitライブラリ時に自動的にドッカーコンテナデータベースを開始するために許可を使用することができます。VaultとのPostgresで使用TestcontainersフレームワークSpring統合テスト:このライブラリの詳細については、自分のサイトhttps://www.testcontainers.orgまたは私の以前の記事を参照してください。幸い、TestcontainersはElasticsearchをサポートしています。テスト範囲でそれを有効にするには、最初のpom.xmlに以下の依存関係を追加する必要があります。
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>elasticsearch</artifactId>
<version>1.11.1</version>
<scope>test</scope>
</dependency>
次のステップは、点又はElasticsearch容器@ClassRule @Rule Beanを定義することです。それは、各テストクラスの前に自動的に起動したり、注釈の使用に依存する前に。出版ポート番号が自動的に生成され、あなたはその値属性spring.data.elasticsearch.cluster-ノードを設定する必要があります。これが私たちのJUnit統合テストの完全な実現です。
@RunWith(SpringRunner.class)
@SpringBootTest
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class EmployeeRepositoryTest {
@ClassRule
public static ElasticsearchContainer container = new ElasticsearchContainer();
@Autowired
EmployeeRepository repository;
@BeforeClass
public static void before() {
System.setProperty("spring.data.elasticsearch.cluster-nodes", container.getContainerIpAddress() + ":" + container.getMappedPort(9300));
}
@Test
public void testAdd() {
Employee employee = new Employee();
employee.setId(1L);
employee.setName("John Smith");
employee.setAge(33);
employee.setPosition("Developer");
employee.setDepartment(new Department(1L, "TestD"));
employee.setOrganization(new Organization(1L, "TestO", "Test Street No. 1"));
employee = repository.save(employee);
Assert.assertNotNull(employee);
}
@Test
public void testFindAll() {
Iterable<Employee> employees = repository.findAll();
Assert.assertTrue(employees.iterator().hasNext());
}
@Test
public void testFindByOrganization() {
List<Employee> employees = repository.findByOrganizationName("TestO");
Assert.assertTrue(employees.size() > 0);
}
@Test
public void testFindByName() {
List<Employee> employees = repository.findByName("John Smith");
Assert.assertTrue(employees.size() > 0);
}
}
概要
この記事では、学びます。
-
ドッカー実行Elasticsearchのローカルインスタンスを使用します
-
春ブートアプリケーションの統合とElasticsearch
-
春データリポジトリを使用すると、データを保存し、単純なクエリを実行します
-
春データElasticsearchTemplateユーザーがインデックスにバッチ操作を実行するには
-
ElasticHQモニタクラスタを使用します
-
使用Testcontainers为Elasticsearch构建自动集成测试 示例应用程序源代码通常在GitHub上的sample-spring-elasticsearch。
本文来源于微信公众号 java微技术