Elasticsearch は、コア検索エンジンとして Lucene 検索ライブラリを使用するオープン ソースの検索エンジンです。Elasticsearch は RESTful API を使用して対話し、複数のデータ型の検索と集計をサポートします。このチュートリアルでは、Elasticsearch の基本原理、その開発方法、および Spring Boot での Elasticsearch の使用方法を紹介します。
Elasticsearchの原理
Elasticsearch は、分散型ドキュメント ストレージおよび検索エンジンです。大量のデータを保存、検索、分析できます。Elasticsearch のデータ モデルはドキュメント (Document) であり、各ドキュメントにはいくつかのフィールド (フィールド) が含まれています。
Elasticsearch では、ドキュメントは 1 つ以上のインデックス (インデックス) に保存されます。各インデックスにはいくつかのドキュメントが含まれており、各ドキュメントには一意の ID があります。インデックスには、インデックスの基本単位であるシャードもいくつか含まれており、それらにはインデックス内のドキュメントの一部が含まれています。
Elasticsearch は、転置インデックス (Inverted Index) を使用してドキュメントを迅速に検索します。転置索引は、各用語を文書およびそれが出現する場所にマッピングします。用語を検索すると、Elasticsearch は転置インデックスでその用語を検索し、その用語を含むドキュメントを返します。
Elasticsearch は検索に加えて、集計 (Aggregation) と分析 (Analysis) もサポートしています。集計によりドキュメントをグループ化して統計を計算できる一方、分析により検索時のクエリをより細かく制御できます。
Elasticsearchの開発
Elasticsearchをインストールする
まず、Elasticsearch をインストールする必要があります。Elasticsearch の最新バージョンは、Elasticsearch の公式 Web サイトからダウンロードできます。Mac を使用している場合は、Homebrew を使用してインストールすることもできます。
brew install elasticsearch
インストールしたら、Elasticsearch サービスを開始できます。
elasticsearch
基本操作
インデックスを作成する
Elasticsearch では、PUT メソッドを使用してインデックスを作成できます。たとえば、「my_index」というインデックスを作成するには、次のようにします。
curl -X PUT "localhost:9200/my_index?pretty"
Elasticsearch では、各インデックスには、ドキュメント内のフィールドとそのタイプを定義するいくつかのマッピング (マッピング) が含まれています。インデックスの作成時にマッピングを指定できます。次に例を示します。
curl -X PUT "localhost:9200/my_index?pretty" -H 'Content-Type: application/json' -d'
{
"mappings": {
"properties": {
"title": { "type": "text" },
"content": { "type": "text" },
"tags": { "type": "keyword" },
"date": { "type": "date" }
}
}
}
'
このコマンドは、「my_index」という名前のインデックスを作成し、タイトル、コンテンツ、タグ、日付の 4 つのフィールドを指定します。このうち、タイトルと内容の種類はテキスト、タグの種類はキーワード、日付の種類は日付です。
ドキュメントを追加
インデックスを作成したら、POST メソッドを使用してドキュメントをインデックスに追加できます。たとえば、「Hello World」というタイトルのドキュメントを追加するには、次のようにします。
curl -X POST "localhost:9200/my_index/_doc?pretty" -H 'Content-Type: application/json' -d'
{
"title": "Hello World",
"content": "This is my first document in Elasticsearch.",
"tags": ["hello", "world"],
"date": "2023-02-17"
}
'
このコマンドは、ドキュメントを「my_index」インデックスに追加します。ドキュメントを追加するときにドキュメントの ID を指定できます。指定しない場合、Elasticsearch によって一意の ID が自動的に生成されます。
文書を検索する
検索は Elasticsearch の主な機能の 1 つです。GET メソッドを使用してドキュメントを検索できます。たとえば、タイトルに「Hello」が含まれるすべてのドキュメントを検索するには、次のようにします。
curl -X GET "localhost:9200/my_index/_search?q=title:Hello&pretty"
このコマンドは、検索クエリ (クエリ文字列) を使用して、タイトルに「Hello」が含まれるすべてのドキュメントを検索します。JSON 形式の検索クエリを使用することもできます。次に例を示します。
curl -X GET "localhost:9200/my_index/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"match": {
"title": "Hello"
}
}
}
'
このコマンドは、JSON 形式の検索クエリを使用して、タイトルに「Hello」が含まれるすべてのドキュメントを検索します。Elasticsearch では、検索クエリは非常に柔軟であり、ニーズに応じてより複雑な検索を実行できます。
Spring Boot での Elasticsearch の使用
Spring Boot は Elasticsearch のサポートを提供します。spring-data-elasticsearch を使用すると、Elasticsearch と簡単に対話できます。
依存関係を追加する
まず、spring-data-elasticsearch 依存関係を追加する必要があります。Maven では、次の依存関係を追加できます。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
Gradle では、次の依存関係を追加できます。
implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch'
Elasticsearchの構成
次に、Elasticsearch の接続情報を構成する必要があります。application.yml または application.properties に次の構成を追加します。
spring:
data:
elasticsearch:
cluster-name: my-cluster-name
cluster-nodes: localhost:9300
この設定では、Elasticsearch クラスター名が「my-cluster-name」、ノードアドレスが「localhost:9300」であることが指定されています。
リポジトリを作成する
Elasticsearch のデータにアクセスするための ElasticsearchRepository を作成します。たとえば、「ArticleRepository」という名前のリポジトリを作成するには、次のようにします。
public interface ArticleRepository extends ElasticsearchRepository<Article, String> {
}
このリポジトリは、いくつかの基本的な CRUD 操作を提供する ElasticsearchRepository を継承しています。Article は、Elasticsearch のドキュメントを表す単純な Java Bean です。
@Document(indexName = "my_index")
public class Article {
@Id
private String id;
private String title;
private String content;
private List<String> tags;
@Field(type = FieldType.Date)
private Date date;
// getter and setter
}
このJava Beanは、@Documentアノテーションを使用してインデックス名「my_index」を指定します。@Id アノテーションを使用してドキュメントの ID を指定し、@Field アノテーションを使用してドキュメントのフィールド タイプを指定します。
ドキュメントを追加
リポジトリを使用してドキュメントを追加します。たとえば、「Hello World」というタイトルのドキュメントを追加するには、次のようにします。
@Autowired
private ArticleRepository articleRepository;
// ...
Article article = new Article();
article.setTitle("Hello World");
article.setContent("This is my first document in Elasticsearch.");
article.setTags(Arrays.asList("hello", "world"));
article.setDate(new Date());
articleRepository.save(article);
このコードは、Article オブジェクトを作成し、タイトル、コンテンツ、タグ、日付を設定し、articleRepository.save() メソッドを使用してドキュメントを Elasticsearch に保存します。
文書を検索する
リポジトリを使用してドキュメントを検索します。たとえば、タイトルに「Hello」が含まれるすべてのドキュメントを検索するには、次のようにします。
@Autowired
private ArticleRepository articleRepository;
// ...
Iterable<Article> articles = articleRepository.findByTitleContaining("Hello");
このコードは、articleRepository.findByTitleContaining() メソッドを使用して、タイトルに「Hello」が含まれるすべてのドキュメントを検索します。
完全な例
以下は、CRUD 操作と検索に Elasticsearch を使用する方法を示す完全な Spring Boot アプリケーションです。
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Autowired
private ArticleRepository articleRepository;
@PostConstruct
public void addData() {
Article article1 = new Article();
article1.setTitle("Hello World");
article1.setContent("This is my first document in Elasticsearch.");
article1.setTags(Arrays.asList("hello", "world"));
article1.setDate(new Date());
articleRepository.save(article1);
Article article2 = new Article();
article2.setTitle("Elasticsearch Tutorial");
article2.setContent("This is a tutorial for Elasticsearch.");
article2.setTags(Arrays.asList("elasticsearch", "tutorial"));
article2.setDate(new Date());
articleRepository.save(article2);
}
@GetMapping("/search")
public List<Article> search(@RequestParam String q) {
Iterable<Article> articles = articleRepository.findByTitleContaining(q);
List<Article> result = new ArrayList<>();
articles.forEach(result::add);
return result;
}
}
このアプリケーションは Spring Boot フレームワークを使用します。「DemoApplication」という Spring Boot アプリケーションを作成します。アプリケーションが起動すると、@PostConstruct アノテーションを使用して 2 つの記事が Elasticsearch に追加されます。また、キーワードに基づいて記事を検索するための「/search」という REST インターフェイスも提供します。
結論は
Elasticsearch は、さまざまなシナリオで広く使用されている強力な検索エンジンおよびデータ分析プラットフォームです。この記事では、Elasticsearch の原理、開発、使用法を紹介し、Spring Boot に基づくサンプル アプリケーションを提供して、CRUD 操作と検索に Elasticsearch を使用する方法を示します。読者の皆様がこの記事を通じて Elasticsearch の基礎知識を習得し、実践的な問題解決に活用できるようになれば幸いです。
参考文献
- Elasticsearch 公式ドキュメント、 https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
- Elasticsearch の権威あるガイド、 https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html
- Spring Data Elasticsearch 公式ドキュメント、 https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/
- Spring Boot 公式ドキュメント、 https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/