JavaのElasticsearchガイド

1概要

この記事では、Elasticsearchを中心に、全文検索エンジンに関するいくつかの重要な概念について説明します。

これはJava指向の記事なので、Elasticsearchの設定方法に関する詳細なステップバイステップのチュートリアルを提供し、それが内部でどのように機能するかを示すのではなく、代わりにJavaクライアントをターゲットにします index delete get search などの主な機能の使い方。

2セットアップ

お使いのマシンにElasticsearchをインストールするには、https://www.elastic.co/guide/en/elasticsearch/reference/current/__installation.html[公式セットアップガイド]を参照してください。

インストールプロセスはとても簡単です。zip/tarパッケージをダウンロードして elasticsearch スクリプトファイル(Windowsユーザーの場合は _ elasticsearch _ bat )を実行するだけです。

デフォルトでは、Elasticsearchは今後のHTTPクエリをデフォルトで9200ポートで待機します。お気に入りのブラウザで http://localhost:9200/ というURLを開くことで、正常に起動されたことを確認できます。

{
  "name" : "GEpcsab",
  "cluster__name" : "elasticsearch",
  "cluster__uuid" : "z3FfAe6gRMmSmeWBIOihJg",
  "version" : {
    "number" : "5.6.10",
    "build__hash" : "b727a60",
    "build__date" : "2018-06-06T15:48:34.860Z",
    "build__snapshot" : false,
    "lucene__version" : "6.6.1"
  },
  "tagline" : "You Know, for Search"
}

3 Mavenの設定

これで基本的なElasticsearchクラスターが稼働し始めたので、Javaクライアントに直接ジャンプしましょう。まず第一に、私たちは以下のものを持っている必要があります。 pom.xml ファイルで宣言されている

<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>5.6.0</version>
</dependency>

Maven Centralがホストしている最新バージョンは、以前に提供されたリンクでいつでも確認できます。

4 Java API

Java APIの主な機能の使い方を直接説明する前に、トランスポートクライアントを起動する必要があります _: _

Client client = new PreBuiltTransportClient(
  Settings.builder().put("client.transport.sniff", true)
                    .put("cluster.name","elasticsearch").build())
  .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));

4.1. 索引付け文書

prepareIndex() 関数を使用すると、任意のJSONドキュメントを格納して検索可能にすることができます。

@Test
public void givenJsonString__whenJavaObject__thenIndexDocument() {
    String jsonObject = "{\"age\":10,\"dateOfBirth\":1471466076564,"
      +"\"fullName\":\"John Doe\"}";
    IndexResponse response = client.prepareIndex("people", "Doe")
      .setSource(jsonObject, XContentType.JSON).get();

    String id = response.getId();
    String index = response.getIndex();
    String type = response.getType();
    long version = response.getVersion();

    assertEquals(Result.CREATED, response.getResult());
    assertEquals(0, version);
    assertEquals("people", index);
    assertEquals("Doe", type);
}

テストを実行するときは、必ず path.home 変数を宣言してください。

java.lang.IllegalStateException: path.home is not configured

Mavenコマンドを実行した後: mvn clean install -Des.path.home = C:\ elastic 、JSONドキュメントは people をインデックスとして、 Doe をタイプとして格納されます。

文書を作成して処理するために 任意のJSON Javaライブラリ を使用することが可能です。 これらのどれにも慣れていない場合は、Elasticsearchヘルパーを使用して独自のJSON文書を生成することができます

XContentBuilder builder = XContentFactory.jsonBuilder()
  .startObject()
  .field("fullName", "Test")
  .field("dateOfBirth", new Date())
  .field("age", "10")
  .endObject();
IndexResponse response = client.prepareIndex("people", "Doe")
  .setSource(builder).get();

assertEquals(Result.CREATED, response.getResult());

4.2. インデックス付きドキュメントのクエリ

型付きの検索可能なJSONドキュメントにインデックスが付けられたので、次に進み、 prepareSearch() メソッドを使用して検索します。

SearchResponse response = client.prepareSearch().execute().actionGet();
List<SearchHit> searchHits = Arrays.asList(response.getHits().getHits());
List<Person> results = new ArrayList<Person>();
searchHits.forEach(
  hit -> results.add(JSON.parseObject(hit.getSourceAsString(), Person.class)));
  • actionGet() メソッドによって返される結果は Hits ** と呼ばれ、各 Hit は検索要求に一致するJSONドキュメントを参照します。

この場合、 results リストには、クラスターに格納されているすべてのデータが含まれています。この例では、JSON Strings をJavaオブジェクトに変換するために FastJson ライブラリを使用していることに注意してください。

QueryBuilders メソッドを使用してクエリをカスタマイズするために追加のパラメータを追加することでリクエストを強化できます。

SearchResponse response = client.prepareSearch()
  .setTypes()
  .setSearchType(SearchType.DFS__QUERY__THEN__FETCH)
  .setPostFilter(QueryBuilders.rangeQuery("age").from(5).to(15))
  .execute()
  .actionGet();

4.3. 文書の検索と削除

prepareGet() および prepareDelete() メソッドを使用すると、そのIDを使用してクラスタからJSONドキュメントを取得または削除できます。

GetResponse response = client.prepareGet("people","Doe","1").get();
String age = (String) response.getField("age").getValue();//Process other fields
DeleteResponse response = client.prepareDelete("people", "Doe", "5")
  .get();

構文は非常に簡単です。オブジェクトのIDと一緒にインデックスと型の値を指定するだけです。

5 QueryBuilders の例

QueryBuilders クラスは、クラスタ内の特定のエントリを見つけるための動的マッチャーとして使用されるさまざまな静的メソッドを提供します。クラスター内の特定のJSON文書を探すために prepareSearch() メソッドを使用しながら、検索結果をカスタマイズするためにクエリービルダーを使用できます。

これが QueryBuilders APIの最も一般的な用途のリストです。

matchAllQuery() メソッドは、クラスタ内のすべてのドキュメントに一致する QueryBuilder オブジェクトを返します。

QueryBuilder matchAllQuery = QueryBuilders.matchAllQuery();

rangeQuery() は、フィールドの値が特定の範囲内にあるドキュメントに一致します。

QueryBuilder matchDocumentsWithinRange = QueryBuilders
  .rangeQuery("price").from(15).to(100)

フィールド名を入力します - 例 fullName 、および対応する値 - 例えば John Doe matchQuery() メソッドは、次の正確なフィールドの値を持つすべてのドキュメントに一致します。

QueryBuilder matchSpecificFieldQuery= QueryBuilders
  .matchQuery("fullName", "John Doe");

multiMatchQuery() メソッドを使用して、マルチフィールドバージョンのマッチクエリを構築することもできます。

QueryBuilder matchSpecificFieldQuery= QueryBuilders.matchQuery(
  "Text I am looking for", "field__1", "field__2^3", "** __field__wildcard");
  • キャレット記号(^)を使って特定のフィールドを増やすことができます** 。

この例では、 field 2__のブースト値は3に設定されているため、他のフィールドよりも重要になります。ワイルドカードと正規表現のクエリを使用することは可能ですが、パフォーマンス的には、ワイルドカードを扱うときのメモリ消費と応答時間の遅延に注意してください。

重要度係数は、 prepareSearch() メソッドの実行後に返されたヒットの結果セットを順序付けるために使用されます。

Luceneクエリの構文に慣れている場合は、次のコマンドを使用できます。

QueryBuilder simpleStringQuery = QueryBuilders
  .simpleQueryStringQuery("+John -Doe OR Janette");

ご想像のとおり、 LuceneのQuery Parser構文を使用して、シンプルで強力なクエリを構築できます 。検索クエリを作成するために AND/OR/NOT 演算子と一緒に使用できる基本的な演算子は次のとおりです。

  • 必要な演算子( ):特定のテキストが必要です

文書の分野のどこかに存在します。

  • 禁止演算子( ):を含むすべての文書を除外します。

キーワードは( )記号の後に宣言されます。

6. 結論

このクイック記事では、ElasticSearchのJava APIを使用して全文検索エンジンに関連するいくつかの一般的な機能を実行する方法を説明しました。

この記事で提供されている例はhttps://github.com/eugenp/tutorials/tree/master/persistence-modules/spring-data-elasticsearch[GitHub project]にあります。