สภาพแวดล้อมของระบบ: CentOS 7.2 ภายใต้ VM12
เวอร์ชันที่ติดตั้งปัจจุบัน: elasticsearch-2.4.0.tar.gz
Java Operation es Cluster ขั้นตอนที่ 1: กำหนดค่าข้อมูลวัตถุคลัสเตอร์; 2: สร้างไคลเอนต์; 3: ดูข้อมูลคลัสเตอร์
1: ชื่อคลัสเตอร์
ชื่อคลัสเตอร์เริ่มต้นคือ Elasticsearch หากชื่อคลัสเตอร์ไม่สอดคล้องกับชื่อที่ระบุจะมีการรายงานข้อผิดพลาดเมื่อใช้ทรัพยากรโหนด
2: ฟังก์ชั่นดมกลิ่น
เริ่มฟังก์ชั่นการดมกลิ่นผ่าน client.transport.sniff เพื่อที่คุณจะต้องระบุโหนดในคลัสเตอร์ (ไม่จำเป็นต้องเป็นโหนดหลัก) จากนั้นโหลดโหนดอื่น ๆ ในคลัสเตอร์ ด้วยวิธีนี้ตราบใดที่โปรแกรมยังคงปิดตัวลงคุณยังสามารถเชื่อมต่อกับโหนดอื่นได้แม้ว่าโหนดนี้จะลดลง
3: Query Type Searthtype.query_then_fetch
มีแบบสอบถาม 4 ประเภทในคำถาม ES มี 4 ประเภท
query_and_fetch:
โหนดหลักกระจายคำขอแบบสอบถามไปยังเศษทั้งหมด แต่ละแผ่นจะถูกจัดเรียงและจัดเรียงตามกฎการสืบค้นของตัวเองคือความถี่เอกสารความถี่คำแล้วส่งคืนผลลัพธ์ไปยังโหนดหลัก โหนดหลักสรุปและเรียงลำดับข้อมูลทั้งหมดและส่งคืนไปยังไคลเอนต์ วิธีนี้ต้องมีปฏิสัมพันธ์กับ ES เพียงครั้งเดียวเท่านั้น
วิธีการสืบค้นนี้มีปัญหาเกี่ยวกับปริมาณข้อมูลและการเรียงลำดับ โหนดหลักจะสรุปข้อมูลที่ส่งคืนโดยเศษทั้งหมดเพื่อให้ปริมาณข้อมูลจะค่อนข้างใหญ่ ประการที่สองกฎของแต่ละ Shard อาจไม่สอดคล้องกัน
query_then_fetch:
โหนดหลักกระจายคำขอไปยังเศษทั้งหมด หลังจากการจัดเรียงแต่ละครั้ง ID และคะแนนของข้อมูลจะถูกส่งกลับไปยังโหนดหลัก หลังจากได้รับมันโหนดหลักจะสรุปและเรียงลำดับแล้วอ่านข้อมูลที่เกี่ยวข้องกับโหนดที่เกี่ยวข้องตาม ID ที่เรียงลำดับและส่งคืนไปยังไคลเอนต์ วิธีนี้ต้องมีปฏิสัมพันธ์กับ ES สองครั้ง
วิธีนี้ช่วยแก้ปัญหาปริมาณข้อมูล แต่ปัญหาการเรียงลำดับยังคงมีอยู่และเป็นวิธีการสืบค้นเริ่มต้นของ ES
def_query_and_fetch: และ dfs_query_then_fetch:
รวมกฎของการให้คะแนนแต่ละครั้ง แก้ไขปัญหาการเรียงลำดับ แต่ DFS_Query_and_Fetch ยังคงมีปัญหาปริมาณข้อมูล DFS_QUERY_THEN_FETCH ทั้งคู่มีปัญหาที่ดีที่สุด แต่ประสิทธิภาพนั้นแย่ที่สุด
1. รับไคลเอนต์สองวิธีในการรับ
@Before โมฆะสาธารณะก่อน () พ่นข้อยกเว้น {แผนที่ <สตริง, สตริง> แผนที่ = ใหม่ hashmap <สตริง, สตริง> (); map.put ("cluster.name", "elasticsearch_wenbronk"); การตั้งค่าการตั้งค่า builder = การตั้งค่า. builder (). ใส่ (แผนที่); client = transportClient.builder (). การตั้งค่า (การตั้งค่า) .build () .AddTransportAddress (ใหม่ InetSocketTransportaddress (inetaddress.getByName ("www.wenbronk.com"), integer.parseint ("9300"))); - @Before public void ก่อน 11 () พ่นข้อยกเว้น {// สร้างไคลเอนต์ใช้ชื่อคลัสเตอร์เริ่มต้น "elasticsearch" // client = transportClient.builder (). build () // .addtransportaddress // ระบุข้อมูลการกำหนดค่าคลัสเตอร์ผ่านวัตถุการตั้งค่าและการตั้งค่าชื่อคลัสเตอร์ที่กำหนดค่าไว้ = การตั้งค่า SettingsBuilder () ใส่ ("cluster.name", "elasticsearch_wenbronk") // ตั้งชื่อคลัสเตอร์ //.put ("client.transport.sniff" .put ("Network.host", "192.168.50.37") .put ("client.transport.ignore_cluster_name", จริง) // ละเว้นการตรวจสอบชื่อคลัสเตอร์และสามารถเชื่อมต่อกับชื่อคลัสเตอร์ได้ .put ("client.transport.ping_timeout", 5) // รายงานข้อผิดพลาด, เวลารอ ping, .build (); client = transportClient.builder (). การตั้งค่า (การตั้งค่า) .build () .AddTransportAddress (ใหม่ InetSocketTransportaddress (ใหม่ inetSocketAddress ("192.168.50.37", 9300))); // ค่าเริ่มต้น 5S // ใช้เวลานานเท่าใดในการเปิดการเชื่อมต่อ, ค่าเริ่มต้น 5S System.out.println ("Success Connect"); -PS: ไม่สามารถใช้สองวิธีที่ได้รับจากเว็บไซต์อย่างเป็นทางการพวกเขาจำเป็นต้องรวมกันเพื่อใช้และฉันก็เสียช่วงบ่าย ...
ความหมายของพารามิเตอร์อื่น ๆ :
รหัส:
แพ็คเกจ com.wenbronk.javaes; นำเข้า java.net.inetaddress; นำเข้า java.net.inetsocketaddress; นำเข้า java.util.date นำเข้า java.util.hashmap; นำเข้า Java.util.list; org.elasticsearch.action.bulk.backoffpolicy; นำเข้า org.elasticsearch.action.bulk.bulkprocessor; นำเข้า org.elasticsearch.action.bulk.bulkprocessor.listener; นำเข้า org.elasticsearch.bulk.bulkrequest; org.elasticsearch.action.bulk.bulkrequestbuilder; นำเข้า org.elasticsearch.action.bulk.bulkresponse; นำเข้า org.elasticsearch.action.delete.deleteRequest; นำเข้า org.elasticsearch.action.get.multigetItemResponse; นำเข้า org.elasticsearch.action.get.multigetResponse; นำเข้า org.elasticsearch.Action.index.indexRequest; นำเข้า org.elasticsearch.Action.index.indexResponse; org.elasticsearch.action.update.updateresponse; นำเข้า org.elasticsearch.client.transport.transportclient; นำเข้า org.elasticsearch.cluster.node.discoverynode; นำเข้า org.elasticsearch.common.settings.settings; org.elasticsearch.common.unit.bytesizeunit; นำเข้า org.elasticsearch.common.unit.bytesizevalue; นำเข้า org.elasticsearch.common.unit.timevalue; นำเข้า org.elasticsearch.common.xcontent.xcontent org.elasticsearch.common.xcontent.xcontentfactory; นำเข้า org.elasticsearch.script.script; นำเข้า org.junit.before; นำเข้า org.junit.test; นำเข้า com.alibaba.fastjson.jsonobject;/** * ใช้ Java api ไคลเอนต์ TransportClient; แหล่งที่มาของดัชนีส่วนตัว /*** รับการเชื่อมต่อวิธีแรก* @throws Exception* /// @Before โมฆะสาธารณะก่อน () พ่นข้อยกเว้น {แผนที่ <สตริง, สตริง> แผนที่ = ใหม่ hashmap <สตริง, สตริง> (); map.put ("cluster.name", "elasticsearch_wenbronk"); การตั้งค่าการตั้งค่า builder = การตั้งค่า. builder (). ใส่ (แผนที่); client = transportClient.builder (). การตั้งค่า (การตั้งค่า) .build () .AddTransportAddress (ใหม่ InetSocketTransportaddress (inetaddress.getByName ("www.wenbronk.com"), integer.parseint ("9300"))); }/ *** ดูข้อมูลคลัสเตอร์*/ @Test โมฆะสาธารณะ public TestInfo () {list <Seescovernode> nodes = client.ConnectedNodes (); สำหรับ (DiscoveryNode Node: โหนด) {system.out.println (node.getHostaddress ()); }}/*** จัดระเบียบสตริง JSON, วิธีที่ 1, ประกบโดยตรง*/สตริงสาธารณะ createjson1 () {String json = "{" + "/" ผู้ใช้/":/" Kimchy/"," + "/" postdate/":/" 2013-01-30/"," + " กลับ JSON; } / ** * สร้าง json ด้วยแผนที่ * / แผนที่สาธารณะ <สตริงวัตถุ> createjson2 () {แผนที่ <สตริงวัตถุ> json = new hashmap <string, object> (); json.put ("ผู้ใช้", "Kimchy"); json.put ("postdate", วันที่ใหม่ ()); json.put ("ข้อความ", "ลองใช้ Elasticsearch"); กลับ JSON; } / *** สร้างโดยใช้ fastjson* / public jsonObject createjson3 () {jsonObject json = new JsonObject (); json.put ("ผู้ใช้", "Kimchy"); json.put ("postdate", วันที่ใหม่ ()); json.put ("ข้อความ", "ลองใช้ Elasticsearch"); กลับ JSON; } / *** ใช้ ES Help Class* / Public XContentBuilder CreateJSON4 () โยนข้อยกเว้น {// สร้างวัตถุ JSON หนึ่งในวิธีที่จะสร้าง json xcontentBuilder แหล่งที่มา = xcontentFactory.jsonBuilder () ElasticSearch ") .endObject (); แหล่งที่มากลับ; } / *** บันทึกในดัชนี* @throws Exception* / @Test Public Public Void Test1 () พ่นข้อยกเว้น {XContentBuilder Source = CreateJSON4 (); // จัดเก็บ json ในดัชนีดัชนีการตอบสนองการตอบสนอง = client.pareIndex ("Twitter", "ทวีต", "1"). setSource (แหล่งที่มา) .get (); // // ผลที่ได้คือ string index = response.getIndex (); ประเภทสตริง = response.getType (); string id = response.getId (); เวอร์ชันยาว = response.getVersion (); บูลีนสร้าง = response.iscreated (); System.out.println (ดัชนี + ":" + type + ":" + id + ":" + เวอร์ชัน + ":" + สร้าง); }/ *** รับ API รับข้อมูลเอกสารที่ระบุ*/ @Test Public Public Void TestGet () {// getResponse Response = client.pareGet ("Twitter", "ทวีต", "1") // .get (); getResponse response = client.pareGet ("Twitter", "ทวีต", "1") System.out.println (Response.getSourceasstring ()); } / ** * ทดสอบลบ API * / @Test โมฆะสาธารณะ TestDelete () {deleterEsponse Response = client.prepareDelete ("Twitter", "ทวีต", "1") .get (); string index = response.getIndex (); ประเภทสตริง = response.getType (); string id = response.getId (); เวอร์ชันยาว = response.getVersion (); System.out.println (ดัชนี + ":" + type + ":" + id + ":" + เวอร์ชัน); } / ** * ทดสอบการอัปเดตการอัปเดต API * ใช้ updateRequest Object * @throws Exception * / @Test Public Public Void TestupDate () โยนข้อยกเว้น {updateRequest updateRequest = ใหม่ updateRequest (); updaterequest.index ("Twitter"); updaterequest.type ("ทวีต"); updaterequest.id ("1"); updaterequest.doc (xcontentfactory.jsonbuilder () .startobject () // เพิ่มฟิลด์ที่ไม่มีอยู่แทนที่ฟิลด์ที่มีอยู่ฟิลด์ ("เพศ", "ชาย") .field ("ข้อความ", "hello") updateresponse response = client.update (updateRequest) .get (); // พิมพ์ดัชนีสตริง = response.getIndex (); ประเภทสตริง = response.getType (); string id = response.getId (); เวอร์ชันยาว = response.getVersion (); System.out.println (ดัชนี + ":" + type + ":" + id + ":" + เวอร์ชัน); }/** * ทดสอบการอัปเดต API ใช้ไคลเอนต์ * @Trows Exception */@Test โมฆะสาธารณะ testUpDate2 () พ่นข้อยกเว้น {// อัปเดตด้วยวัตถุสคริปต์ // updateresponse Response = client.prepareUpdate ("Twitter", "Tweet", "1") // .SetScript ( // updateresponse Response = client.pareUpdate ("Twitter", "ทวีต", "1") // .SetDoc (xcontentFactory.jsonBuilder () // .startObject () // .field ("เพศ", "malelelele") //. endobject () // ใช้ updateRequest วัตถุและสคริปต์ // updateRequest updateRequest = ใหม่ updateRequest ("twitter", "ทวีต", "1") // .script (สคริปต์ใหม่ ("ctx._source.gender =/" male/"")); // updateresponse response = client.update (updateRequest) .get (); // updateresponse response = client.update (updateDeverequest ใหม่ ("Twitter", "ทวีต", "1") .doc (xcontentFactory.jsonBuilder () .startObject () .field ("เพศ", "ชาย"). System.out.println (Response.getIndex ()); }/** * การทดสอบการอัปเดต * ใช้ updateRequest * @throws Exception * @throws interruptedException */@Test Public Public Void TestUpDate3 () พ่น InterruptedException, Exception updateresponse response = client.update (updateRequest) .get (); } / ** * วิธีการทดสอบ upsert * @throws Exception * * / @Test Public Public Void TestupSert () โยนข้อยกเว้น {// ตั้งค่าเงื่อนไขการสืบค้นเพิ่ม indexRequest indexRequest ที่มีประสิทธิภาพ = indexRequest ใหม่ ("Twitter", "ทวีต", "2"). .Field ("เพศ", "GFRERQ") .ENDOBJECT ()); // ตั้งค่าอัปเดตค้นหาการตั้งค่าการอัปเดตด้านล่าง updatequest upsert = updateDeverequest ใหม่ ("Twitter", "ทวีต", "2") .doc (xcontentFactory.jsonBuilder () .startObject () .field ("ผู้ใช้", "Wenbronk") client.update (upsert) .get (); } / ** * ทดสอบ multi get api * รับจากดัชนีที่แตกต่างกันประเภทและ id * / @test public void testmultiget () {multigetresponse multigetresponse = client.preparemultiget () .add ("Twitter", "ทวีต", "1") "foo") .get (); สำหรับ (multigetItemResponse itemResponse: MultigetResponse) {getResponse response = itemResponse.getResponse (); if (response.isexists ()) {string sourceasstring = response.getSourceasstring (); System.out.println (sourceasstring); }}} / *** การดำเนินการแบทช์จำนวนมาก* สามารถอัปเดตหรือลบเอกสารหลายฉบับ* / @Test โมฆะสาธารณะ TestBulk () โยนข้อยกเว้น {BulkRequestBuilder BulkRequest = client.prepareBulk (); bulkrequest.add (client.prepareindex ("Twitter", "ทวีต", "1") .SetSource (XcontentFactory.jsonBuilder () .startobject () .Field ("ผู้ใช้", "Kimchy"). bulkrequest.add (client.prepareindex ("Twitter", "ทวีต", "2") .SetSource (xcontentFactory.jsonBuilder () .startObject () .Field ("ผู้ใช้", "Kimchy"). การตอบสนองแบบ bulkresponse = bulkrequest.get (); System.out.println (Response.getheaders ()); } / ** * ใช้โปรเซสเซอร์จำนวนมาก * @throws Exception * / @Test โมฆะสาธารณะ TestBulkProcessor () โยนข้อยกเว้น {// สร้าง bulkporcessor objectBulkprocessor bulkprocessor = bulkprocessor.builder (ไคลเอนต์ วิธีการที่สร้างขึ้นอัตโนมัติ Stub} // ดำเนินการโมฆะสาธารณะ Afterbulk (ยาว paramlong, bulkrequest parambulkrequest, paramthrowable throwable) {// todo วิธีการที่สร้างขึ้นอัตโนมัติ} void parambulk (paramlong long, bulkrequest parambulkrequest }) // 1W คำขอเรียกใช้งานจำนวนมาก. setBulkActions (10,000) // 1GB ข้อมูลการรีเฟรชจำนวนมาก. setBulksize (bytesizeValue ใหม่ (1, bytesizeUnit.gb) // 5S จะต้องรีเฟรชครั้งเดียว ได้รับอนุญาตให้ดำเนินการพร้อมกัน SetCurcurrentRequests (1) // ตั้งค่ากลับมาทำงานหลังจาก 100ms, สูงสุด 3 คำขอ SetBackOffPolicy (backOffPolicy.exponentialBackoff (timeValue.timevaluemillis (100), 3)). build (); // เพิ่มคำขอเดียว bulkprocessor.add (indexrequest ใหม่ ("Twitter", "ทวีต", "1")); BULKPROCESSOR.ADD (ใหม่ DeLeterEquest ("Twitter", "ทวีต", "2")); // ปิด bulkprocessor.awaitclose (10, timeunit.minutes); // หรือ bulkprocessor.close (); - รหัส tes2:
แพ็คเกจ com.wenbronk.javaes; นำเข้า java.net.inetsocketaddress; นำเข้า org.apache.lucene.queryparser.xml.filterbuilderfactory; นำเข้า org.elasticsearch.search.multisearch org.elasticsearch.action.search.searchresponse; นำเข้า org.elasticsearch.action.search.searchtype; นำเข้า org.elasticsearch.client.transport.transportclient; นำเข้า org.elasticsearch.common.settings.settings; org.elasticsearch.common.transport.inetsockettransportaddress; นำเข้า org.elasticsearch.common.unit.timevalue; นำเข้า org.elasticsearch.index.query.querybuilder; Import org.elasticsearch.index.querybuilyers; org.elasticsearch.search.aggregations.aggregation; นำเข้า org.elasticsearch.search.aggregations.aggregations.aggregationsbuilders; นำเข้า org.elasticsearch.search.aggregations.bucket.historm.datehistograminterval; org.elasticsearch.search.sort.sortparselement; นำเข้า org.junit.before; นำเข้า org.junit.test;/** * ใช้ java api เพื่อใช้งาน elasticsearch * ค้นหา api * @author 231 * */คลาสสาธารณะ / *** รับวัตถุไคลเอนต์*/ @Before โมฆะสาธารณะทดสอบก่อน () {Builder Builder = settings.settingsBuilder (); builder.put ("cluster.name", "wenbronk_escluster"); // .put ("client.transport.ignore_cluster_name", จริง); การตั้งค่าการตั้งค่า = builder.build (); org.elasticsearch.client.transport.transportclient.builder TransportBuild = TransportClient.build (); TransportClient client1 = transportBuild.Settings (การตั้งค่า). build (); client = client1.addtransportaddress ((ใหม่ InetSocketTransportAddress (ใหม่ InetSocketAddress ("192.168.50.37", 9300)))); System.out.println ("ความสำเร็จเชื่อมต่อกับ escluster"); }/*** สอบถามการทดสอบ*/@Test Public Void TestSearch () {// SearchRequestBuilder SearchRequestBuilder = client.preparesearch ("Twitter", "ทวีต", "1"); .SetSearchType (searthType.dfs_query_then_fetch) // .setQuery (queryBuilders.termQuery ("ผู้ใช้", "test")) // .setPostFilter (queryBuilders.RangeQuery ("อายุ" .Execute (). ActionGet (); SearchResponse Response = client.preparesearch () .execute (). actionget (); // searchhits hit = response.gethits (); // สำหรับ (searchhit searchhit: hits) {// สำหรับ (iterator <Searchhitfield> iterator = searchhit.iterator (); System.out.println (next.getValues ()); //} //} system.out.println (การตอบสนอง); } / *** ทดสอบ Scroll API* การประมวลผลที่มีประสิทธิภาพมากขึ้นของข้อมูลจำนวนมาก* / @Test Public Public Void TestsCrolls () {QueryBuilder QueryBuilder = QueryBuilders.termQuery ("Twitter", "ทวีต"); SearchResponse Response = client.preparesearch ("Twitter") .AddSort (SortParseElement.doc_field_name, SortOrder.asc) .SetScroll (TimeValue ใหม่ (60000)) .SetQuery (QueryBuilder) ในขณะที่ (จริง) {สำหรับ (searchhit hit: response.getHits (). gethits ()) {system.out.println ("ฉันกำลังจะมา"); } searchResponse response2 = client.prepareSearchScroll (response.getScrollid ()) .SetScroll (TimeValue ใหม่ (60000)). Execute (). ActionGet (); if (response2.getHits (). gethits (). ความยาว == 0) {system.out.println ("โอ้ไม่มี ======"); หยุดพัก; }}} / ** * ทดสอบ multisearch * / @test โมฆะสาธารณะ testMultisearch () {queryBuilder qb1 = queryBuilders.QueryStringQuery ("elasticsearch"); SearchRequestBuilder requestBuilder1 = client.preparesearch (). setQuery (QB1) .setsize (1); QueryBuilder QB2 = QueryBuilders.MatchQuery ("ผู้ใช้", "Kimchy"); SearchRequestBuilder requestbuilder2 = client.preparesearch (). setquery (qb2) .setsize (1); MultisearchResponse MultireSesponse = client.preparemultisearch (). เพิ่ม (requestBuilder1) .Add (requestBuilder2) .Execute (). ActionGet (); long nbhits = 0; สำหรับ (MultisearchResponse.Item รายการ: multiresesponse.getResponse ()) {searchResponse Response = item.getResponse (); nbhits = response.getHits (). getTotalhits (); Searchhit [] hit = response.getHits (). gethits (); System.out.println (nbhits); }} / *** แบบสอบถามการรวมการรวม* / @Test โมฆะสาธารณะ testAggRegation () {การตอบสนองการค้นหา = client.preparesearch () .SetQuery (queryBuilders.MatchAllQuery ()) // ใช้แบบสอบถามครั้งแรก .Addaggregation (AggregationBuilders.DateHistogram ("AGG2"). ฟิลด์ ("เกิด") .interval (DateHistograminterval.year)) .Execute (). ActionGet (); การรวมการรวม 2 = response.petaggregations (). รับ ("คำศัพท์"); การรวมการรวม = response.getAggregations (). get ("AGG2"); // searchResponse response2 = client.search (ใหม่ SearchRequest (). SearchType (searchType.Query_and_Fetch)). ActionGet (); } / ** * การทดสอบสิ้นสุด * / @Test โมฆะสาธารณะ testTermInateFter () {SearchResponse Response = client.prepareSearch ("Twitter"). setTerminatefter (1000) .get (); if (response.isterminatearly ()) {system.out.println ("ternimate"); }} /** * แบบสอบถามตัวกรอง: มากกว่า GT น้อยกว่า LT น้อยกว่าหรือเท่ากับ LTE มากกว่าหรือเท่ากับ GTE * /@Test Public Public Void TestFilter () {SearchResponse Response = client.preparesearch ("Twitter") .setTypes (""). .SetSearchType (SearchType.Query_then_fetch) // .setPostFilter (FilterBuilders.RangeFilter ("อายุ") จาก (0) .to (19) // .includelower (จริง) .RangeFilter ("อายุ"). gte (18) .lte (22)) .Setexplain (จริง) // อธิบายเป็นจริงเพื่อระบุว่าการจัดอันดับนั้นจัดเรียงตามความเกี่ยวข้องของข้อมูล } / *** Query กลุ่ม* / @Test Public Void TestGroupBy () {client.preparesearch ("Twitter"). setTypes ("ทวีต") .SetQuery (queryBuilders.MatchAllQuery () .Field ("ผู้ใช้"). ขนาด (0) // กลุ่มตามผู้ใช้ // ขนาด (0) คือ 10) .get (); -ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น