JavaでのElasticsearchのガイド
1. 概要
この記事では、Elasticsearchに特に焦点を当てて、全文検索エンジンに関連するいくつかの重要な概念について詳しく説明します。
これはJava指向の記事であるため、Elasticsearchをセットアップして内部でどのように機能するかを示す詳細なステップバイステップのチュートリアルは提供しません。代わりに、Javaクライアントをターゲットにします。 index、delete、get、searchなどの主な機能の使用方法。
2. セットアップ
マシンにElasticsearchをインストールするには、official setup guideを参照してください。
インストールプロセスは非常に簡単です。zip/ tarパッケージをダウンロードして、elasticsearchスクリプトファイル(Windowsユーザーの場合はelasticsearch.bat)を実行するだけです。
デフォルトでは、Elasticsearchは9200ポートでデフォルトのHTTPクエリをリッスンします。 お気に入りのブラウザで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ファイルで次のMaven dependencyを宣言する必要があります。
org.elasticsearch
elasticsearch
5.6.0
以前に提供されたリンクを使用して、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をタイプとして保存されます。
any JSON Java libraryを使用してドキュメントを作成および処理することが可能であることに注意してください。 If you are not familiar with any of these, you can use Elasticsearch helpers to generate your own JSON documents:
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 searchHits = Arrays.asList(response.getHits().getHits());
List results = new ArrayList();
searchHits.forEach(
hit -> results.add(JSON.parseObject(hit.getSourceAsString(), Person.class)));
The results returned by the actionGet() method are called Hits、各Hitは、検索リクエストに一致するJSONドキュメントを参照します。
この場合、resultsリストには、クラスターに保管されているすべてのデータが含まれています。 この例では、JSONStringsを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()メソッドを使用している間、クエリビルダーを使用して検索結果をカスタマイズできます。
QueryBuildersAPIの最も一般的な使用法のリストを次に示します。
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");
We can use the caret symbol (^) to boost specific fields。
この例では、field_2のブースト値が3に設定されているため、他のフィールドよりも重要です。 ワイルドカードと正規表現クエリを使用することは可能ですが、* _ applesのようなものはパフォーマンスに大きな影響を与える可能性があるため、パフォーマンスに関しては、ワイルドカードを処理するときのメモリ消費と応答時間の遅延に注意してください。
重要度係数は、prepareSearch()メソッドの実行後に返されるヒットの結果セットを順序付けるために使用されます。
Luceneクエリの構文に精通している場合は、simpleQueryStringQuery() method to customize search queries:を使用できます。
QueryBuilder simpleStringQuery = QueryBuilders
.simpleQueryStringQuery("+John -Doe OR Janette");
ご想像のとおり、we can use the Lucene’s Query Parser syntax to build simple, yet powerful queriesです。 AND/OR/NOT演算子と一緒に使用して検索クエリを作成できる基本的な演算子を次に示します。
-
必要な演算子(+):特定のテキストがドキュメントのフィールドのどこかに存在する必要があります。
-
禁止演算子(–):(–)記号の後に宣言されたキーワードを含むすべてのドキュメントを除外します。
6. 結論
この簡単な記事では、ElasticSearchのJava APIを使用して、全文検索エンジンに関連するいくつかの一般的な機能を実行する方法を説明しました。
この記事で提供されている例は、GitHub projectで確認できます。