ปลั๊กอิน Elasticsearch 5.x สำหรับ Para
โครงการนี้เลิกใช้แล้วและจะไม่ได้รับการดูแลอีกต่อไป โปรดใช้ปลั๊กอิน Para ล่าสุดสำหรับ Elasticsearch
Para ได้รับการออกแบบให้เป็นเฟรมเวิร์กแบ็คเอนด์ที่เรียบง่ายและเป็นโมดูลสำหรับการคงอยู่ของวัตถุและการดึงข้อมูล ช่วยให้แอปพลิเคชันของคุณสามารถจัดเก็บวัตถุโดยตรงไปยัง Data Store (NOSQL) หรือฐานข้อมูลเชิงสัมพันธ์ใด ๆ (RDBMS) และยังจัดทำดัชนีวัตถุเหล่านั้นโดยอัตโนมัติและทำให้สามารถค้นหาได้
ปลั๊กอินนี้ช่วยให้คุณใช้ Elasticsearch เป็นเครื่องมือค้นหาสำหรับ Para และ เข้ากันได้กับ Elasticsearch เวอร์ชัน 5.X เท่านั้น
Search และรองรับไคลเอ็นต์การขนส่งDAO เพื่อให้คุณสามารถใช้ ElasticSearch เป็นฐานข้อมูล (หลีกเลี่ยงในการผลิต!)/v1/_elasticsearch - รีเลย์คำขอทั้งหมดโดยตรงไปยัง Elasticsearch (ปิดใช้งานโดยค่าเริ่มต้น) ปลั๊กอินอยู่บน Maven Central นี่คือตัวอย่าง Maven ที่จะรวมไว้ใน pom.xml ของคุณ:
< dependency >
< groupId >com.erudika</ groupId >
< artifactId >para-search-elasticsearch-v5</ artifactId >
< version >{see_green_version_badge_above}</ version >
</ dependency > หรือคุณสามารถดาวน์โหลด jar จากแท็บ "releases" ด้านบนวางไว้ในโฟลเดอร์ lib ข้างไฟล์ Server War para-xyzwar Para จะมองหาปลั๊กอินภายใน lib และรับปลั๊กอิน Elasticsearch
นี่คือคุณสมบัติการกำหนดค่าทั้งหมดสำหรับปลั๊กอินนี้ (สิ่งเหล่านี้อยู่ใน application.conf ของคุณ):
# 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.use_transportclient = false
para.es.transportclient_host = " localhost "
para.es.transportclient_port = 9300
para.es.fail_on_indexing_errors = false
# 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.restclient_scheme = " http "
para.es.restclient_host = " localhost "
para.es.restclient_port = 9200สุดท้ายตั้งค่าคุณสมบัติกำหนดค่า:
para.search = "ElasticSearch"
นี่อาจเป็นคุณสมบัติของระบบ Java หรือเป็นส่วนหนึ่งของไฟล์ application.conf บน ClassPath สิ่งนี้บอกให้ Para ใช้การใช้งาน ElasticSearch แทนค่าเริ่มต้น (Lucene)
ปลั๊กอิน ElasticSearch รองรับทั้งโหมดการจัดทำดัชนีแบบซิงโครนัส (ค่าเริ่มต้น) และอะซิงโครนัส สำหรับการจัดทำดัชนีแบบซิงโครนัสปลั๊กอิน Elasticsearch จะทำเพียงครั้งเดียวโดยการปิดกั้นคำขอผ่านไคลเอนต์และรอการตอบกลับ ซึ่งหมายความว่าการดำเนินการเอกสารแต่ละครั้ง (ดัชนี, Reindex หรือ DELETE) เรียกร้องคำขอไคลเอนต์ใหม่ สำหรับแอปพลิเคชันบางอย่างสิ่งนี้สามารถทำให้เกิดการโหลดอย่างหนักบนคลัสเตอร์ Elasticsearch อย่างไรก็ตามข้อได้เปรียบของการจัดทำดัชนีแบบซิงโครนัสเป็นผลมาจากการร้องขอสามารถสื่อสารกลับไปยังแอปพลิเคชันไคลเอนต์ หากการตั้งค่า para.es.fail_on_indexing_errors ถูกตั้งค่าเป็น true การร้องขอแบบซิงโครนัสซึ่งส่งผลให้เกิดข้อผิดพลาดจะเผยแพร่กลับไปยังแอปพลิเคชันไคลเอนต์ด้วยรหัสข้อผิดพลาด HTTP
โหมดการจัดทำดัชนีแบบอะซิงโครนัสใช้ Elasticsearch BulkProcessor สำหรับการแบตช์การร้องขอทั้งหมดไปยังคลัสเตอร์ Elasticsearch หากเปิดใช้งานโหมดแบบอะซิงโครนัสคำขอเอกสารทั้งหมดจะถูกป้อนเข้าสู่ BulkProcessor ซึ่งจะล้างคำขอไปยังคลัสเตอร์ในบางโอกาส มีพารามิเตอร์ที่กำหนดค่าได้หลายประการเพื่อควบคุมความถี่ฟลัชตามจำนวนเอกสารขนาดเอกสารทั้งหมด (MB) และระยะเวลาทั้งหมด (MS) เนื่องจาก ElasticSearch ได้รับการออกแบบให้เป็นเครื่องมือค้นหาแบบเรียลไทม์ใกล้เวลาจึงขอแนะนำให้ใช้โหมดอะซิงโครนัส การทำคำขอเอกสารที่มีขนาดใหญ่ขึ้นเป็นครั้งคราวจะช่วยลดภาระในคลัสเตอร์ Elasticsearch
โหมดการจัดทำดัชนีแบบอะซิงโครนัสยังมีคุณสมบัติที่น่าสนใจในการลองคำขอดัชนีที่ล้มเหลวโดยอัตโนมัติ หากคลัสเตอร์ ElasticSearch ของคุณอยู่ภายใต้การโหลดอย่างหนักอาจเป็นไปได้ที่จะขอดัชนีเอกสารใหม่อาจถูกปฏิเสธ ด้วยการจัดทำดัชนีแบบซิงโครนัสภาระจะอยู่บนแอปพลิเคชันไคลเอนต์เพื่อลองคำขอการจัดทำดัชนีอีกครั้ง อย่างไรก็ตาม ElasticSearch BulkProcessor เสนอคุณสมบัติที่มีประโยชน์ในการลองคำขอดัชนีโดยอัตโนมัติด้วยการย้อนกลับแบบเอ็กซ์โปเนนเชียลระหว่างการลองใหม่ หากคำขอดัชนีล้มเหลวด้วย EsRejectedExecutionException คำขอจะถูกนำกลับไปที่ para.es.bulk.max_num_retries ครั้งต่อไป แม้ว่ากรณีการใช้งานของคุณต้องการความมั่นใจในระดับสูงเกี่ยวกับความสอดคล้องของข้อมูลระหว่าง DAO และการค้นหาของคุณ แต่ก็ยังแนะนำให้ใช้การจัดทำดัชนีแบบอะซิงโครนัสโดยเปิดใช้งานการลองใหม่ หากคุณต้องการใช้การจัดทำดัชนีแบบอะซิงโครนัส แต่มีการล้างข้อมูลจำนวนมากเมื่อมีการเรียกใช้ดัชนี/unindex/indexall/unindexall ทุกครั้งเพียงแค่เปิดใช้งาน para.es.bulk.flush_immediately เมื่อเปิดใช้งานตัวเลือกนี้วิธีการล้างของ BulkProcessor จะถูกเรียกทันทีหลังจากเพิ่มเอกสารในคำขอ ตัวเลือกนี้ยังมีประโยชน์สำหรับการเขียนการทดสอบหน่วยที่คุณต้องการให้แน่ใจว่าเอกสารล้างออกทันที
ปลั๊กอินนี้มีสองโหมดการจัดทำดัชนี: ปกติ และ ซ้อนกัน โหมดซ้อนกันถูกเพิ่มหลังจาก v1.28 เพื่อป้องกันการระเบิดการทำแผนที่ที่เป็นไปได้ซึ่งเกิดขึ้นเมื่อมีวัตถุจำนวนมากที่มีคุณสมบัติที่กำหนดเองมากมายในนั้น สิ่งนี้โอเวอร์โหลดข้อมูลเมตาดาต้าดัชนี Elasticsearch และสามารถขัดข้องทั้งคลัสเตอร์ โหมดการจัดทำดัชนีนี้มีผลต่อคุณสมบัติที่กำหนดเองเฉพาะในวัตถุ Sysprop
โหมด "ปกติ" แบบเก่าเหมาะสำหรับการปรับใช้ส่วนใหญ่โดยมีผู้เช่าเพียงไม่กี่คนหรือผู้เช่ารายเดียว (แอพหนึ่งตัวต่อเซิร์ฟเวอร์) ในโหมดนี้วัตถุ Para จะถูกจัดทำดัชนีโดยไม่มีการแก้ไข (ประเภทข้อมูลทั้งหมดจะถูกเก็บรักษาไว้) แต่สิ่งนี้อาจนำไปสู่การระเบิดการทำแผนที่
โครงสร้างข้อมูลที่ซ้อนกันสำหรับโหมดการจัดทำดัชนีทั้งสองนี้แสดงอยู่ด้านล่าง:
// 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"}..."
} }
}
การเปลี่ยนไปใช้โหมดการจัดทำดัชนีซ้อนใหม่นั้นทำด้วยคุณสมบัติการกำหนดค่า:
para.es.es.use_nested_custom_fields = true
ประโยชน์อีกประการหนึ่งเมื่อใช้โหมด "ซ้อนกัน" คือการสนับสนุนการสืบค้นซ้อนกันในสตริงแบบสอบถาม นี่เป็นคุณสมบัติที่มีประโยชน์จริง ๆ ซึ่งในขณะที่เขียนสิ่งนี้ยังไม่ได้นำมาใช้ใน Elasticsearch (ปัญหายืดหยุ่น/Elasticsearch#11322) ยิ่งไปกว่านั้นคุณสามารถสืบค้นวัตถุภายในอาร์เรย์ที่ซ้อนกันด้วยความแม่นยำในการระบุเช่น ?q=properties.nestedArray[2].key:value ตรวจพบการสืบค้นสตริงคิวรีซ้อนกันหากมีฟิลด์ที่มี properties.* ตัวอย่างของการสืบค้นสตริงแบบสอบถาม:
/v1/search?q=term AND properties.owner.age:[* TO 34]
/v1/search?q=properties.owner.name:alice OR properties.owner.pets[1].name=whiskers
หมายเหตุ: การเรียงลำดับในฟิลด์ที่ซ้อนกันใช้งานได้กับข้อมูลตัวเลขเท่านั้น ตัวอย่างเช่นการเรียงลำดับบน properties.year ฟิลด์ปีจะทำงานได้ แต่การเรียงลำดับบน properties.month จะไม่ (ใช้ได้เฉพาะกับโหมด "ซ้อน" เท่านั้น)
คุณสามารถโทรหา Elasticsearch API ผ่าน /v1/_elasticsearch โดยตรง ในการเปิดใช้งานมันตั้งค่า para.es.proxy_enabled = true ก่อน จากนั้นคุณต้องระบุพารามิเตอร์ path ที่สอดคล้องกับเส้นทางทรัพยากร Elasticsearch API สิ่งนี้ทำสำหรับทุกคน GET PUT POST PATCH หรือ DELETE คำขอไปยัง Elasticsearch จุดสิ้นสุดยอมรับคำขอไปที่ /v1/_elasticsearch หรือ /v1/_elasticsearch/{path} โดยที่ path เป็นพารามิเตอร์เส้นทางที่เข้ารหัส URL อย่าเพิ่มพารามิเตอร์แบบสอบถามไปยังเส้นทางคำขอด้วย ? แทนที่จะส่งผ่านเป็นแผนที่พารามิเตอร์
GET /v1/_elasticsearch/_search
GET /v1/_elasticsearch/mytype%2f_search
DELETE /v1/_elasticsearch/tweet%2f1
ตัวอย่าง 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" ))))); หากละเว้นพารามิเตอร์ path จะเริ่มต้นเป็น _search
วัตถุการตอบสนองจะถูกเปลี่ยนให้เข้ากันได้กับไคลเอนต์ Para ที่มีลักษณะเช่นนี้:
{
"page" : 0 ,
"totalHits" : 3 ,
"items" : [ { ... } ]
} หากคุณต้องการได้รับการตอบกลับแบบสอบถามดิบจาก Elasticsearch ให้เพิ่มพารามิเตอร์ getRawResponse=true ไปยังเส้นทาง requst และ url-encode ด้วย:
GET /v1/_elasticsearch/mytype%2f_search%3FgetRawResponse%3Dtrue
เท่ากันสามารถทำได้โดยการเพิ่มพารามิเตอร์การสืบค้นโดยใช้ ParaClient :
MultivaluedHashMap<String, String> params = new MultivaluedHashMap<>();
params.putSingle("getRawRequest", "true");
paraClient.invokeGet("_elasticsearch/" + Utils.urlEncode("mytype/_search"), params);
หมายเหตุ: ปลายทางนี้ต้องการการตรวจสอบสิทธิ์และคำขอที่ไม่ได้ลงนาม โปรดทราบว่าคำขอทั้งหมดไปยัง Elasticsearch นั้นถูกนำหน้าด้วยตัวระบุแอพ ตัวอย่างเช่นหากแอพ ID คือ "แอพ: MyApp, Para จะร้องขอพร็อกซีไปยัง Elasticsearch ที่ http://eshost:9200/myapp/{path}
คุณสามารถสร้างดัชนีแอพทั้งหมดใหม่ตั้งแต่เริ่มต้นโดยเรียก POST /v1/_elasticsearch/reindex ในการเปิดใช้งานมันตั้งค่า para.es.proxy_reindexing_enabled = true ก่อน การดำเนินการนี้ดำเนินการ ElasticSearchUtils.rebuildIndex() ภายในและส่งคืนการตอบกลับที่ระบุจำนวนวัตถุ reindexed และเวลาที่ผ่านไป:
{
"reindexed": 154,
"tookMillis": 365
}
นอกจากนี้คุณสามารถระบุดัชนีปลายทางเพื่อดำเนินการ reindex ซึ่งจะต้องถูกสร้างขึ้นล่วงหน้า:
POST /v1/_elasticsearch/reindex?destinationIndex=yourCustomIndex
ปลั๊กอินยังรองรับการแชร์ดัชนีโดยดัชนีแอพรูทจะถูกแชร์กับแอพอื่น ๆ ที่สร้างขึ้นด้วยแอป app.isSharingIndex = true คุณสมบัตินี้เปิดใช้งานด้วย para.es.root_index_sharing_enabled = true และปิดตามค่าเริ่มต้น เมื่อดัชนีรูทถูกสร้างขึ้นเมื่อเปิดใช้งานการแชร์นามแฝงพิเศษจะถูกสร้างขึ้นสำหรับมันที่มีฟิลด์การกำหนดเส้นทางซึ่งส่งเอกสารทั้งหมดของแอพเด็กไปยังเศษเล็กเศษน้อยโดยเฉพาะในขณะที่ให้การแยกทั้งหมดระหว่างแอพ สิ่งนี้มีประโยชน์เมื่อมีแอพขนาดเล็กจำนวนมากที่มีเอกสารเพียงไม่กี่ร้อยเอกสารและเราต้องการหลีกเลี่ยงค่าใช้จ่ายของดัชนีหนึ่งตัวต่อแอป
Apache 2.0