Plugin Elasticsearch untuk Para
Para dirancang sebagai kerangka kerja back-end yang sederhana dan modular untuk kegigihan dan pengambilan objek. Ini memungkinkan aplikasi Anda untuk menyimpan objek secara langsung ke penyimpanan data (NOSQL) atau database relasional (RDBMS) dan juga secara otomatis mengindeks objek tersebut dan membuatnya dapat dicari.
Plugin ini memungkinkan Anda untuk menggunakan Elasticsearch sebagai mesin pencari untuk para.
Search paragraf menggunakan klien Java Elasticsearch Resmi/v1/_elasticsearch - relay semua permintaan langsung ke Elasticsearch (dinonaktifkan secara default)| Versi plugin ES | Dukungan Elasticsearch | Dukungan OpenSearch |
|---|---|---|
1.40.0 dan di atas | 8.x dan di atas (dengan bendera konfigurasi) | 1.0.0 dan di atas (dengan bendera konfigurasi) |
1.39.0 dan di bawah | hingga 7.15.2 | 1.0.0 dan di atas |
Setelah versi 1.40.0 Bendera konfigurasi diperlukan untuk membuat takdir antara dua rasa ELEASTICSEarch yang berbeda:
para.es.flavor = " elasticsearch "
# ==== OR ==== #
para.es.flavor = " opensearch " Opsi default di sini adalah elasticsearch .
Plugin berada di Maven Central. Inilah cuplikan Maven yang akan dimasukkan ke dalam pom.xml Anda:
< dependency >
< groupId >com.erudika</ groupId >
< artifactId >para-search-elasticsearch</ artifactId >
< version >{see_green_version_badge_above}</ version >
</ dependency > Atau Anda dapat mengunduh toples dari tab "Rilis" di atas meletakkannya di folder lib di samping file perang server para-xyzwar . Para akan mencari plugin di dalam lib dan mengambil plugin Elasticsearch.
Berikut adalah semua properti konfigurasi untuk plugin ini (ini masuk ke dalam application.conf Anda.conf):
# ES flavor - elasticsearch or opensearch
para.es.flavor = " elasticsearch "
# enable this to bypass the DB and read all data straight from ES
para.read_from_index = false
para.es.shards = 5
para.es.replicas = 0
para.es.dir = " data "
para.es.auto_expand_replicas = " 0-1 "
para.es.restclient_scheme = " http "
para.es.restclient_host = " localhost "
para.es.restclient_port = 9200
# context path of elasticsearch e.g. /es
para.es.restclient_context_path = " "
para.es.sign_requests_to_aws = false
para.es.aws_region = " eu-west-1 "
para.es.fail_on_indexing_errors = false
para.es.track_total_hits = 10000
# if login and password are filled then add for each request
# the Authorization header with basic auth
para.es.basic_auth_login = " "
para.es.basic_auth_password = " "
# asynchronous settings
para.es.async_enabled = false
para.es.bulk.size_limit_mb = 5
para.es.bulk.action_limit = 1000
para.es.bulk.concurrent_requests = 1
para.es.bulk.flush_interval_ms = 5000
para.es.bulk.backoff_initial_delay_ms = 50
para.es.bulk.max_num_retries = 8
para.es.bulk.flush_immediately = false
# proxy settings
para.es.proxy_enabled = false
para.es.proxy_path = " _elasticsearch "
para.es.proxy_reindexing_enabled = falseAkhirnya, atur properti konfigurasi:
para.search = "ElasticSearch"
Ini bisa berupa properti sistem java atau bagian dari file application.conf di classpath. Ini memberitahu PARA untuk menggunakan implementasi Elasticsearch alih -alih default (Lucene).
Versi ES yang lebih baru menggunakan HTTPS secara default dan menghasilkan sertifikat SSL yang unik pada startup pertama. Untuk memiliki koneksi yang berhasil, Anda harus terlebih dahulu menambahkan CA yang dihasilkan dari ES Server ke Java Keystore Anda, menunjukkan bahwa Anda mempercayai sertifikat itu. Ini adalah perintah konsol untuk melakukan itu:
echo -n |
openssl s_client -connect localhost:9200 |
sed -ne ' /-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p ' > ./ca_elasticsearch.cer &&
keytool -import -alias saelk -file ca_elasticsearch.cer -keystore ${JAVA_HOME} /lib/security/cacerts -storepass changeit Akhirnya, atur para.es.restclient_scheme = "https" .
Plugin Elasticsearch mendukung mode pengindeksan sinkron (default) dan asinkron. Untuk pengindeksan sinkron, plugin Elasticsearch akan membuat permintaan tunggal, pemblokiran melalui klien dan menunggu tanggapan. Ini berarti setiap operasi dokumen (indeks, reindex, atau hapus) mengajukan permintaan klien baru. Untuk aplikasi tertentu, ini dapat menyebabkan beban berat pada cluster Elasticsearch. Namun, keuntungan dari pengindeksan sinkron adalah hasil dari permintaan tersebut dapat dikomunikasikan kembali ke aplikasi klien. Jika pengaturan para.es.fail_on_indexing_errors diatur ke permintaan true , sinkron yang menghasilkan kesalahan akan menyebarkan kembali ke aplikasi klien dengan kode kesalahan HTTP.
Mode pengindeksan asinkron menggunakan Elasticsearch BulkProcessor untuk batching semua permintaan ke Cluster Elasticsearch. Jika mode asinkron diaktifkan, semua permintaan dokumen akan dimasukkan ke dalam processor bulk, yang akan menyiram permintaan ke cluster sesekali. Ada beberapa parameter yang dapat dikonfigurasi untuk mengontrol frekuensi flush berdasarkan jumlah dokumen, ukuran dokumen total (MB), dan durasi total (MS). Karena Elasticsearch dirancang sebagai mesin pencari real-time yang dekat, mode asinkron sangat dianjurkan. Membuat sekumpulan permintaan dokumen yang lebih besar dan lebih besar akan membantu mengurangi beban pada kluster Elasticsearch.
Mode pengindeksan asinkron juga menawarkan fitur yang menarik untuk secara otomatis mencoba kembali permintaan pengindeksan yang gagal. Jika cluster Elasticsearch Anda berada di bawah beban berat, ada kemungkinan permintaan untuk mengindeks dokumen baru dapat ditolak. Dengan pengindeksan sinkron, beban jatuh pada aplikasi klien untuk mencoba permintaan pengindeksan lagi. Elasticsearch BulkProcessor, bagaimanapun, menawarkan fitur yang berguna untuk secara otomatis mencoba kembali permintaan pengindeksan dengan backoff eksponensial antara retries. Jika permintaan indeks gagal dengan EsRejectedExecutionException , permintaan akan diulang hingga ke para.es.bulk.max_num_retries kali. Bahkan jika kasus penggunaan Anda menuntut tingkat kepercayaan yang tinggi sehubungan dengan konsistensi data antara database Anda ( DAO ) dan indeks ( Search ), masih disarankan untuk menggunakan pengindeksan asinkron dengan retries diaktifkan. Jika Anda lebih suka menggunakan pengindeksan asinkron tetapi memiliki processor yang dibuang pada setiap doa indeks/unindex/indexall/unindexall, cukup diaktifkan para.es.bulk.flush_immediately . Ketika opsi ini diaktifkan, metode flush BulkProcessor akan dipanggil segera setelah menambahkan dokumen dalam permintaan. Opsi ini juga berguna untuk menulis tes unit di mana Anda ingin memastikan dokumen flush segera.
Plugin ini memiliki dua mode pengindeksan: normal dan bersarang . Mode bersarang ditambahkan setelah v1.28 untuk melindungi terhadap kemungkinan ledakan pemetaan yang terjadi ketika ada banyak objek dengan banyak properti khusus yang berbeda di dalamnya. Ini membebani metadata indeks Elasticsearch dan dapat menghancurkan seluruh cluster. Mode pengindeksan ini hanya mempengaruhi properti khusus di objek Sysprop .
Mode "normal" lama cocok untuk sebagian besar penyebaran paragraf, dengan hanya beberapa penyewa atau satu penyewa (satu aplikasi per server). Dalam mode ini, objek paragraf diindeks tanpa modifikasi (semua tipe data dipertahankan) tetapi ini dapat menyebabkan ledakan pemetaan.
Struktur data bersarang untuk dua mode pengindeksan ini ditunjukkan di bawah ini:
// NORMAL MODE // NESTED MODE
{ {
"id": "123", "id": "123",
"appid": "para", "appid": "para",
"type": "custom", "type": "custom",
"properties": { "properties": [
"key1": "value1", {"k": "key1", "v": "value1"},
"key2": { {"k": "key2-subkey1", "v": "subValue1"},
"subkey1": "subValue1" {"k": "numericKey3", "vn": 5}
}, ],
"numericKey3": 5 "_properties": "{"key1":"value1"}..."
} }
}
Beralih ke mode pengindeksan bersarang baru dilakukan dengan properti konfigurasi:
para.es.es.use_nested_custom_fields = true
Manfaat lain, saat menggunakan mode "bersarang", adalah dukungan untuk pertanyaan bersarang dalam string kueri. Ini adalah fitur yang sangat berguna yang, pada saat penulisan ini, belum diimplementasikan dalam Elasticsearch (masalah elastis/elasticsearch#11322). Bahkan lebih baik, Anda dapat meminta objek dalam array bersarang dengan presisi pinpoint, misalnya ?q=properties.nestedArray[2].key:value . Kueri string kueri bersarang terdeteksi jika berisi bidang dengan properties.* . Contoh kueri string kueri:
/v1/search?q=term AND properties.owner.age:[* TO 34]
/v1/search?q=properties.owner.name:alice OR properties.owner.pets[1].name=whiskers
CATATAN: Penyortiran di bidang bersarang hanya berfungsi dengan data numerik. Misalnya, menyortir properties.year lapangan. Tahun akan berfungsi, tetapi menyortir properties.month Month tidak akan (hanya berlaku untuk mode "bersarang").
Anda dapat secara langsung menghubungi API Elasticsearch melalui /v1/_elasticsearch . Untuk mengaktifkannya mengatur para.es.proxy_enabled = true pertama. Maka Anda harus menentukan parameter path sesuai dengan jalur sumber daya API Elasticsearch. Ini dilakukan untuk setiap GET , PUT , POST , PATCH atau DELETE permintaan ke Elasticsearch. Titik akhir menerima permintaan ke salah satu /v1/_elasticsearch atau /v1/_elasticsearch/{path} di mana path adalah parameter jalur yang dikodekan URL. Jangan menambahkan parameter kueri ke jalur permintaan dengan ? , sebagai gantinya, lewati mereka sebagai peta parameter.
GET /v1/_elasticsearch/_search
GET /v1/_elasticsearch/mytype%2f_search
DELETE /v1/_elasticsearch/tweet%2f1
Contoh ParaClient :
Response get = paraClient . invokeGet ( "_elasticsearch/" + Utils . urlEncode ( "tweet/_search" ), params );
Response post = paraClient . invokePost ( "_elasticsearch/_count" ,
Entity . json ( Collections . singletonMap ( "query" ,
Collections . singletonMap ( "term" ,
Collections . singletonMap ( "type" , "cat" ))))); Jika parameter path dihilangkan, itu default ke _search .
Objek respons akan diubah menjadi kompatibel dengan klien para dan terlihat seperti ini:
{
"page" : 0 ,
"totalHits" : 3 ,
"items" : [ { ... } ]
} Jika Anda ingin mendapatkan respons kueri mentah dari Elasticsearch, tambahkan parameter getRawResponse=true ke jalur requst dan juga encode URL:
GET /v1/_elasticsearch/mytype%2f_search%3FgetRawResponse%3Dtrue
Setara, hal yang sama dapat dilakukan dengan menambahkan parameter kueri menggunakan ParaClient :
MultivaluedHashMap<String, String> params = new MultivaluedHashMap<>();
params.putSingle("getRawRequest", "true");
paraClient.invokeGet("_elasticsearch/" + Utils.urlEncode("mytype/_search"), params);
Catatan: Titik akhir ini membutuhkan otentikasi dan permintaan yang tidak ditandatangani tidak diizinkan. Perlu diingat bahwa semua permintaan ke Elasticsearch diawali dengan pengidentifikasi aplikasi. Misalnya jika ID aplikasi adalah "App: myApp, maka PARA akan memberikan permintaan untuk Elasticsearch di http://eshost:9200/myapp/{path} .
Anda dapat membangun kembali seluruh indeks aplikasi dari awal dengan menelepon POST /v1/_elasticsearch/reindex . Untuk mengaktifkannya mengatur para.es.proxy_reindexing_enabled = true pertama. Operasi ini mengeksekusi ElasticSearchUtils.rebuildIndex() secara internal, dan mengembalikan respons yang menunjukkan jumlah objek reindeks dan waktu yang berlalu:
{
"reindexed": 154,
"tookMillis": 365
}
Selain itu, Anda dapat menentukan indeks tujuan untuk reindex ke, yang pasti telah dibuat sebelumnya:
POST /v1/_elasticsearch/reindex?destinationIndex=yourCustomIndex
Plugin ini juga mendukung berbagi indeks, di mana indeks aplikasi root dibagikan dengan aplikasi lain yang dibuat dengan app.isSharingIndex = true . Fitur ini diaktifkan dengan para.es.root_index_sharing_enabled = true dan tidak aktif secara default. Ketika indeks root dibuat dengan berbagi yang diaktifkan, alias khusus dibuat untuk itu yang berisi bidang perutean yang mengirimkan semua dokumen aplikasi anak ke pecahan tertentu, sambil memberikan isolasi total antar aplikasi. Ini berguna ketika ada banyak aplikasi yang lebih kecil dengan masing -masing hanya beberapa ratus dokumen dan kami ingin menghindari overhead satu indeks per aplikasi.
IndexBasedDAO yang sebelumnya dibundel telah dihapus karena memiliki banyak masalah.Apache 2.0