Panduan untuk Elasticsearch di Java

1. Ikhtisar

Pada artikel ini, kita akan mendalami beberapa konsep utama yang terkait dengan mesin pencari teks lengkap, dengan fokus khusus pada Elasticsearch.

Karena ini adalah artikel berorientasi Java, kami tidak akan memberikan tutorial langkah demi langkah terperinci tentang cara menyiapkan Elasticsearch dan menunjukkan cara kerjanya di bawah tenda. Sebagai gantinya, kami akan menargetkan klien Java, dan cara menggunakan fitur utama seperti indeks , hapus , dapatkan , dan cari .

2. Penyiapan

Demi kesederhanaan, kami akan menggunakan gambar buruh pelabuhan untuk instance Elasticsearch kami, meskipun instance Elasticsearch apa pun yang mendengarkan di port 9200 bisa digunakan .

Kami mulai dengan menjalankan contoh Elasticsearch kami:

docker run -d --name es762 -p 9200:9200 -e "discovery.type=single-node" elasticsearch:7.6.2

Secara default, Elasticsearch mendengarkan pada port 9200 untuk kueri HTTP yang akan datang. Kami dapat memverifikasi bahwa itu berhasil diluncurkan dengan membuka // localhost: 9200 / URL di browser favorit Anda:

{ "name" : "M4ojISw", "cluster_name" : "docker-cluster", "cluster_uuid" : "CNnjvDZzRqeVP-B04D3CmA", "version" : { "number" : "7.6.2", "build_flavor" : "default", "build_type" : "docker", "build_hash" : "2f4c224", "build_date" : "2020-03-18T23:22:18.622755Z", "build_snapshot" : false, "lucene_version" : "8.4.0", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.8.0-beta1" }, "tagline" : "You Know, for Search" }

3. Konfigurasi Maven

Sekarang setelah cluster Elasticsearch dasar kami aktif dan berjalan, mari langsung beralih ke klien Java. Pertama-tama, kita harus memiliki dependensi Maven berikut yang dideklarasikan di file pom.xml kita :

 org.elasticsearch elasticsearch 7.6.2 

Anda selalu dapat memeriksa versi terbaru yang dihosting oleh Maven Central dengan tautan yang disediakan sebelumnya.

4. API Java

Sebelum kita langsung beralih ke cara menggunakan fitur utama Java API, kita perlu memulai RestHighLevelClient :

ClientConfiguration clientConfiguration = ClientConfiguration.builder().connectedTo("localhost:9200").build(); RestHighLevelClient client = RestClients.create(clientConfiguration).rest();

4.1. Mengindeks Dokumen

Fungsi index () memungkinkan untuk menyimpan dokumen JSON arbitrer dan membuatnya dapat dicari:

@Test public void givenJsonString_whenJavaObject_thenIndexDocument() { String jsonObject = "{\"age\":10,\"dateOfBirth\":1471466076564," +"\"fullName\":\"John Doe\"}"; IndexRequest request = new IndexRequest("people"); request.source(jsonObject, XContentType.JSON); IndexResponse response = client.index(request, RequestOptions.DEFAULT); String index = response.getIndex(); long version = response.getVersion(); assertEquals(Result.CREATED, response.getResult()); assertEquals(1, version); assertEquals("people", index); }

Perhatikan bahwa dimungkinkan untuk menggunakan pustaka Java JSON apa pun untuk membuat dan memproses dokumen Anda. Jika Anda tidak terbiasa dengan ini, Anda dapat menggunakan pembantu Elasticsearch untuk membuat dokumen JSON Anda sendiri :

XContentBuilder builder = XContentFactory.jsonBuilder() .startObject() .field("fullName", "Test") .field("dateOfBirth", new Date()) .field("age", "10") .endObject(); IndexRequest indexRequest = new IndexRequest("people"); indexRequest.source(builder); IndexResponse response = client.index(indexRequest, RequestOptions.DEFAULT); assertEquals(Result.CREATED, response.getResult());

4.2. Membuat Kueri Dokumen Terindeks

Sekarang kita memiliki dokumen JSON yang dapat dicari yang diindeks, kita dapat melanjutkan dan mencari menggunakan metode search () :

SearchRequest searchRequest = new SearchRequest(); SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); SearchHit[] searchHits = response.getHits().getHits(); List results = Arrays.stream(searchHits) .map(hit -> JSON.parseObject(hit.getSourceAsString(), Person.class)) .collect(Collectors.toList());

Hasil yang dikembalikan oleh metode search () disebut Hit , setiap Hit mengacu pada dokumen JSON yang cocok dengan permintaan pencarian.

Dalam hal ini, daftar hasil berisi semua data yang disimpan di cluster. Perhatikan bahwa dalam contoh ini kami menggunakan pustaka FastJson untuk mengonversi JSON Strings ke objek Java.

Kita dapat meningkatkan permintaan dengan menambahkan parameter tambahan untuk menyesuaikan kueri menggunakan metode QueryBuilders :

SearchSourceBuilder builder = new SearchSourceBuilder() .postFilter(QueryBuilders.rangeQuery("age").from(5).to(15)); SearchRequest searchRequest = new SearchRequest(); searchRequest.searchType(SearchType.DFS_QUERY_THEN_FETCH); searchRequest.source(builder); SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);

4.3. Mengambil dan Menghapus Dokumen

Metode get () dan delete () memungkinkan untuk mendapatkan atau menghapus dokumen JSON dari cluster menggunakan id-nya:

GetRequest getRequest = new GetRequest("people"); getRequest.id(id); GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT); // process fields DeleteRequest deleteRequest = new DeleteRequest("people"); deleteRequest.id(id); DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);

Sintaksnya cukup mudah, Anda hanya perlu menentukan indeks di samping id objek.

5. Contoh QueryBuilders

Kelas QueryBuilders menyediakan berbagai metode statis yang digunakan sebagai pencocokan dinamis untuk menemukan entri tertentu dalam kluster. Saat menggunakan metode search () untuk mencari dokumen JSON tertentu di cluster, kita dapat menggunakan pembuat kueri untuk menyesuaikan hasil pencarian.

Berikut adalah daftar penggunaan QueryBuilders API yang paling umum .

Metode matchAllQuery () mengembalikan objek QueryBuilder yang cocok dengan semua dokumen di cluster:

QueryBuilder matchAllQuery = QueryBuilders.matchAllQuery();

The rangeQuery () cocok dokumen mana nilai lapangan adalah dalam kisaran tertentu:

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

Memberikan nama bidang - misalnya fullName , dan nilai yang sesuai - misalnya John Doe , Metode matchQuery () mencocokkan semua dokumen dengan nilai bidang yang tepat ini:

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

Kita juga bisa menggunakan metode multiMatchQuery () untuk membuat versi multi-bidang dari kueri pencocokan:

QueryBuilder matchSpecificFieldQuery= QueryBuilders.matchQuery( "Text I am looking for", "field_1", "field_2^3", "*_field_wildcard");

Kita dapat menggunakan simbol tanda sisipan (^) untuk meningkatkan bidang tertentu .

Dalam contoh kami, bidang_2 memiliki nilai pendorong yang disetel ke tiga, membuatnya lebih penting daripada bidang lainnya. Perhatikan bahwa dimungkinkan untuk menggunakan wildcard dan kueri regex, tetapi dari segi kinerja, waspadalah terhadap konsumsi memori dan penundaan waktu respons saat menangani wildcard, karena sesuatu seperti * _apples dapat menyebabkan dampak besar pada kinerja.

The coefficient of importance is used to order the result set of hits returned after executing the search() method.

If you are more familiar with the Lucene queries syntax, you can use the simpleQueryStringQuery() method to customize search queries:

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

As you can probably guess, we can use the Lucene's Query Parser syntax to build simple, yet powerful queries. Here're some basic operators that can be used alongside the AND/OR/NOT operators to build search queries:

  • The required operator (+): requires that a specific piece of text exists somewhere in fields of a document.
  • Operator larangan ( - ): mengecualikan semua dokumen yang berisi kata kunci yang dideklarasikan setelah simbol ( - ).

6. Kesimpulan

Dalam artikel singkat ini, kita telah melihat bagaimana menggunakan API Java ElasticSearch untuk melakukan beberapa fitur umum yang terkait dengan mesin pencari teks lengkap.

Anda dapat melihat contoh yang diberikan dalam artikel ini di proyek GitHub.