Environnement système: CentOS 7.2 sous VM12
Version installée actuelle: elasticsearch-2.4.0.tar.gz
Java Operation ES Cluster Étapes 1: Configurer les informations d'objet de cluster; 2: Créer un client; 3: afficher les informations du cluster
1: Nom du cluster
Le nom du cluster par défaut est Elasticsearch. Si le nom du cluster est incompatible avec celui spécifié, une erreur sera signalée lors de l'utilisation de ressources de nœud.
2: Fonction de reniflement
Démarrez la fonction Sniff via client.transport.sniff, afin que vous n'ayez besoin que de spécifier un nœud dans le cluster (pas nécessairement un nœud maître), puis de charger d'autres nœuds dans le cluster. De cette façon, tant que le programme continue de fermer, vous pouvez toujours vous connecter à d'autres nœuds même si ce nœud baisse.
3: Type de requête SearchType.Query_Then_Fetch
Il existe 4 types de types de requête dans la requête ES
Query_and_fetch:
Le nœud maître distribue la demande de requête à tous les éclats. Chaque éclat est trié et trié en fonction de ses propres règles de requête, à savoir la fréquence de document de fréquence de mots, puis renvoie le résultat au nœud maître. Le nœud maître résume et trie toutes les données et les renvoie au client. Cette méthode ne nécessite qu'une interaction avec ES une fois.
Cette méthode de requête a des problèmes de volume de données et de tri. Le nœud principal résumera les données renvoyées par tous les éclats afin que le volume de données soit relativement important. Deuxièmement, les règles sur chaque fragment peuvent être incohérentes.
Query_then_fetch:
Le nœud maître distribue la demande à tous les éclats. Une fois que chaque fragment est trié, l'ID et le score des données sont retournés au nœud maître. Après l'avoir reçu, le nœud maître résume et le trie, puis lit les données correspondantes au nœud correspondant en fonction de l'ID tri et le renvoie au client. Cette méthode nécessite une interaction avec ES deux fois.
Cette méthode résout le problème du volume de données, mais le problème de tri existe toujours et est la méthode de requête par défaut de ES
Def_query_and_fetch: et dfs_query_then_fetch:
Unifier les règles de chaque fragment pour la notation. Résolu le problème de tri, mais DFS_Query_and_Fetch a toujours des problèmes de volume de données, DFS_Query_Then_Fetch a les deux le meilleur problème, mais l'efficacité est la pire.
1. Obtenez le client, deux façons d'obtenir
@Before public void avant () lance l'exception {map <string, string> map = new hashmap <string, string> (); map.put ("cluster.name", "elasticsearch_wenbronk"); Settings.builder Settings = Settings.Builder (). Put (map); client = transportClient.Builder (). Paramètres (paramètres) .Build () .AddTransportAddress (New InetsocketTransportAddress (InetAddress.getByName ("www.wenbronk.com"), Integer.Parseint ("9300"))); } @Before public void avant11 () lève une exception {// Créer le client, utilisez le nom du cluster par défaut, "elasticsearch" // client = transportClient.builder (). Build () // .addtransportAddress (new InetsocketTronk.com "), 9300); // Spécifiez les informations de configuration du cluster via l'objet de réglage, et les paramètres de nom de cluster configuré Settings = Settings.SettingSbuilder (). .put ("Network.host", "192.168.50.37") .put ("client.transport.ignore_cluster_name", true) // ignorer la vérification du nom du cluster, et peut se connecter au nom du cluster si le nom du cluster est incorrect après ouverture //. .put ("client.transport.ping_timeout", 5) // Signaler une erreur, ping time d'attente, .build (); client = transportClient.Builder (). Paramètres (paramètres) .Build () .AddTransportAddress (New IneTsocketTransportAddress (New InetsocketDress ("192.168.50.37", 9300)))); // par défaut 5S // Combien de temps faut-il pour ouvrir la connexion, par défaut 5s System.out.println ("Success Connect"); }PS: Les deux méthodes données par le site officiel ne peuvent pas être utilisées, elles doivent être combinées pour les utiliser, et je gaspille mon après-midi ...
La signification des autres paramètres:
Code:
package com.wenbronk.javaes; import java.net.inetaddress; import java.net.inetsocketaddress; import java.util.date; import java.util.hashmap; import java.util.list.timenit; import; org.ellasticsearch.action.bulk.backoffpolicy; import org.elasticsearch.action.bulk.bulkprocessor; import org.ellasticsearch.action.bulk.bulkprocessor.Listener; import org.elasticsearch.action.bulk.bulkrequest; import Org.ellasticarch.action.bulk.bulkrequete org.ellasticsearch.action.bulk.bulkResponse; import org.ellasticsearch.action.delete.deletequest; import org.ellasticsearch.action.delete.deleterResponse; import org.elasticsearch.action.getResponse; import org.elascsearch.get.getSear org.ellasticsearch.action.get.MultigeTResponse; import org.ellasticsearch.action.index.indexRequest; import org.ellasticsearch.action.index.indexesponse; import org.ellasticsearch.action.update.updateResponse; import org.elasticsarch.action.update.updateSponse; Import org.ellasticsearch.client.transport.transportClient; import org.ellasticsearch.cluster.node.discoverynode; import org.ellasticsearch.common.setsage.Settings; import org.ellasticsearch.common.transport.intsockettransportaddress; import org.ellasticsearch.Common.unit.bytesize org.ellasticsearch.common.unit.bytesizevalue; import org.ellasticsearch.common.unit.timevalue; import org.ellasticsearch.common.xcontent.xcontentbuilder; import org.ellasticsearch.common.script.script; import; org.junit.before; import org.junit.test; import com.alibaba.fastjson.jsonObject; / ** * Utilisez l'API Java pour utiliser Elasticsearch * * @Author 231 * * / public class Javaestest {Private TransportClient Client; Source indexRequest privée; / ** * Obtenez la connexion, la première façon * @throws exception * /// @before public void avant () lève l'exception {map <string, string> map = new hashmap <string, string> (); map.put ("cluster.name", "elasticsearch_wenbronk"); Settings.builder Settings = Settings.Builder (). Put (map); client = transportClient.Builder (). Paramètres (paramètres) .Build () .AddTransportAddress (New InetsocketTransportAddress (InetAddress.getByName ("www.wenbronk.com"), Integer.Parseint ("9300"))); } / ** * Afficher les informations du cluster * / @Test public void testinfo () {list <découverteNode> nœuds = client.connedNodes (); for (DiscoveryNode Node: NODES) {System.out.println (Node.GethostAddress ()); }} / ** * Organisez JSON Strings, Method 1, épissant directement * / public string createjson1 () {String JSON = "{" + "/" user / ": /" kimchy / "," + "/" postdate / ": /" 2013-01-30 / "," + "/" Message / ": /" Essayer eLasticSearch / "" + ";;; retourner JSON; } / ** * Créer JSON avec map * / public map <string, object> createjson2 () {map <string, object> json = new hashmap <string, object> (); json.put ("utilisateur", "kimchy"); json.put ("postdate", new Date ()); JSON.PUT ("Message", "Trys Out Elasticsearch"); retourner JSON; } / ** * Créer en utilisant FastJSON * / public JSONObject CreateJSon3 () {JSONObject JSON = new JSONObject (); json.put ("utilisateur", "kimchy"); json.put ("postdate", new Date ()); JSON.PUT ("Message", "Trys Out Elasticsearch"); retourner JSON; } / ** * Utiliser ES Help Class * / public xcontentBuilder createjson4 () lève une exception {// Créer un objet JSON, l'une des façons de créer JSON XContentBuilder source = xcontentFactory.jsonBuilder () .StartObject () .Field ("User", "Kimchy") .Field ("postDate", New (). out elasticsearch ") .endObject (); retour de la source; } / ** * Enregistrer dans l'index * @Throws Exception * / @Test public void test1 () lève l'exception {xContentBuilder Source = CreateJson4 (); // Store JSON dans l'index indexResponse Response = client.prepareIndex ("Twitter", "Tweet", "1"). SetSource (source) .get (); // // Le résultat est obtenu String index = Response.getIndex (); String type = réponse.getType (); String id = réponse.getId (); Version longue = réponse.getVersion (); boolean créé = réponse.iscreated (); System.out.println (index + ":" + type + ":" + id + ":" + version + ":" + créé); } / ** * Obtenez l'API Obtenir les informations du document spécifié * / @Test public void testGet () {// getResponse Response = client.prepareget ("twitter", "tweet", "1") //get (); GetResponse Response = Client.Prepareget ("Twitter", "Tweet", "1") .SetOperationThread (false) // Thread Safe.get (); System.out.println (Response.getsourCeAsString ()); } / ** * Tester Delete API * / @Test public void TestDelete () {DeleterResponse Response = Client.PrepareDelete ("Twitter", "Tweet", "1") .get (); String index = réponse.getIndex (); String type = réponse.getType (); String id = réponse.getId (); Version longue = réponse.getVersion (); System.out.println (index + ":" + type + ":" + id + ":" + version); } / ** * Test Update Update API * Utilisez UpdateRequest Object * @throws Exception * / @Test public void TesUpDate () lève exception {updateRequest updateRequest = new UpdateRequest (); UpdateRequest.Index ("Twitter"); UpdateRequest.Type ("Tweet"); UpdateRequest.id ("1"); updateRequest.doc (xcontentfactory.jsonBuilder () .StartObject () // Ajouter des champs qui n'existent pas, remplacez les champs existants.field ("Gender", "Male") .field ("Message", "Hello") .endObject ()); UpdateResponse Response = Client.Update (UpdateRequest) .get (); // imprimer la chaîne index = réponse.getIndex (); String type = réponse.getType (); String id = réponse.getId (); Version longue = réponse.getVersion (); System.out.println (index + ":" + type + ":" + id + ":" + version); } / ** * Testez l'API de mise à jour, utilisez le client * @Trows Exception * / @Test public void TestupDate2 () lève une exception {// mise à jour avec l'objet de script // UpdateResponse Response = Client.PrepareupDate ("Twitter", "Tweet", "1") // .SetScript (New Script ("THITS._SOURCE.GENDER = /" " // UpdateResponse Response = client.prepareupDate ("Twitter", "Tweet", "1") // .SetDoc (xcontentFactory.jsonBuilder () // .StartObject () // .Field ("Gender", "malelelele") //. // Utilisez un objet UpdateRequest et un script // UpdateRequest updateRequest = new UpdateRequest ("Twitter", "Tweet", "1") // .Script (nouveau script ("ctx._source.gender = /" mâle / "")); // UpdateResponse Response = Client.Update (UpdateRequest) .get (); // updateResponse réponse = client.update (new UpdateRequest ("twitter", "tweet", "1") .doc (xcontentfactory.jsonbuilder () .startObject () .Field ("Gender", "masculin") .endObject ())). Get (); System.out.println (réponse.getIndex ()); } / ** * Test Update * Utilisez UpdateRequest * @Throws Exception * @throws InterruptedException * / @Test public void TestupDate3 () lance InterruptedException, Exception {UpdateRequest updateRequest = new UpdateRequest ("Twitter", "Tweet", "1") .Script (nouveau script ("ctx.__source.gender ="). "); UpdateResponse Response = Client.Update (UpdateRequest) .get (); } / ** * Test Upsert Method * @Throws Exception * * / @Test public void TesupSert () lève une exception {// définir les conditions de requête, ajouter l'indexequest indexRequest = new indexRequest ("Twitter", "Tweet", "2") .Source (xcontentFactory. "). .field ("Gender", "gfrerq") .endObject ()); // Définissez la mise à jour, recherchez les paramètres de mise à jour ci-dessous UpdateRequest upsert = new UpdateRequest ("Twitter", "Tweet", "2") .Doc (XContentFactory.jsonBuilder () .StartObject () .Field ("User", "Wenbronk") .endObject ()) .upsert (indexRequest); client.update (upsert) .get (); } / ** * Tester multi-get api * Get de différents index, types et id * / @test public void testmultiget () {multi-réponse multi-formeSsage = client.preparemultiget () .add ("twitter", "tweet", "1") .add ("twith", "2", "3", "4"). "type", "foo") .get (); for (MultigeTitemResponse itemResponse: MultigeTResponse) {getResponse Response = itemResponse.getResponse (); if (réponse.isexists ()) {String SourCeAsString = Response.getsourCeAsString (); System.out.println (SourceAsString); }}} / ** * Exécution par lots en vrac * Une requête peut être mise à jour ou supprimer plusieurs documents * / @Test public void testBulk () lève exception {bulkRequestBuilder bulkRequest = client.prepareBulk (); BulkRequest.Add (client.prepareIndex ("Twitter", "Tweet", "1") .SetSource (XContentFactory.jsonBuilder () .StartObject () .Field ("User", "Kimchy") .field ("postdate", new Date ()) .field ("Message", "Tring Out ElasticSearch") .endObject).).). BulkRequest.Add (client.prepareIndex ("Twitter", "Tweet", "2") .SetSource (xcontentFactory.jsonBuilder () .StartObject () .Field ("User", "Kimchy") .field ("postdate", nouveau Date () .Field ("Message", "Another post") .endObject ()); BulkResponse Response = BulkRequest.get (); System.out.println (Response.GetHeaders ()); } / ** * Utilisez le processeur en masse * @throws exception * / @Test public void testBulkProcessor () lève une exception {// créer BulkPorcesses objetBulkProcessor BulkProcessor = BulkProcessor.Builder (client, nouveau auditeur () {public Void avantbulk (Long Paramlong, Bulkrequest Parambulkrequest) Méthode générée automatiquement Stume} // Exécuter public void Afterbulk (long paramlong, bulkrequest Parambulkrequest, présentable paramhrowable) {// Todo méthode générée automatiquement // 1W demandes d'exécution de Bulk .SetBulkactions (10000) // 1 Go de rafraîchissement de données en vrac .setbulkSize (new byTesizeValue (1, bytesizeUnit.gb)) // Correction 5S doit être rafraîchi une fois.SetflushInterval (TimeValue. exécuter simultanément.setConCurrentRequests (1) // Engage, exécutez après 100 ms, maximum 3 requêtes.setbackoffpolicy (backoffpolicy.exponentialbackoff (TimeValue.TimeValuMillis (100), 3)) .Build (); // Ajouter une seule demande BulkProcessor.add (new IndexRequest ("Twitter", "Tweet", "1")); bulkprocessor.add (new DeleteRequest ("Twitter", "Tweet", "2")); // Close BulkProcessor.AwaitClose (10, timeUnit.Minutes); // ou bulkprocessor.close (); }} Code TES2:
package com.wenbronk.javaes; import java.net.inetsocketaddress; import org.apache.lucene.queryparser.xml.filterbuilderfactory; import org.ellasticsearch.action.search.multisearchResponse; import org.elascissearch.search.search.MultisestBuilder; org.ellasticsearch.action.search.searchResponse; import org.ellasticsearch.action.search.searchtype; import org.ellasticsearch.client.transport.transportclient; import org.ellasticsearch.common.settings.settings; import org.elascsearch.common.settings.settings.builder; import; org.ellasticsearch.common.transport.inetsockettransportaddress; import org.ellasticsearch.common.unit.timevalue; import org.ellasticsearch.index.query.querybuilder; import org.elasticsearch.index.query.querybuilders; import org.ellasticsearch.search.Searchhit; org.ellasticsearch.search.agregations.agregation; import org.ellasticsearch.search.agregations.aggregations.agregationsbuilders; import org.ellasticsearch.search.aggregations.bucket.histogram.datehistogramInterval; import org.elasticsearch.search.sort.sortorder; org.ellasticsearch.search.sort.sortparseElement; import org.junit.before; import org.junit.test; / ** * Utilisez l'API Java pour utiliser Elasticsearch * Recherche API * @Author 231 * * / public class JavaesTest2 {Private TransportClient Client; / ** * Obtenez un objet client * / @Before public void testForefore () {builder builder = settings.settingsbuilder (); builder.put ("cluster.name", "wenbronk_escluster"); // .put ("client.transport.ignore_cluster_name", true); Paramètres paramètres = builder.build (); org.ellasticsearch.client.transport.transportClient.builder TransportBuild = TransportClient.build (); TransportClient Client1 = TransportBuild.settings (Paramètres) .Build (); client = client1.addtransportAddress ((new IneTsocketTransportAddress (new InetsocketAddress ("192.168.50.37", 9300))))); System.out.println ("Success Connect to Escluster"); } / ** * Test Query * / @Test public void TestSearch () {// SearchRequestBuilder SearchRequestBuilder = Client.PrepareSearch ("Twitter", "Tweet", "1"); // SearchResponse Response = SearchReQuestBuilder.SetTypes ("Type1", "type2") // .SetSearchType (SearchType.dfs_Query_Then_Fetch) // .SetQuery (queryBuilders.terMquery ("User", "test")) // .SetpostFilter (queryBuilders.RangeQuery ("Age"). De (0) .to (1) // .SetFrom (0). .Execute (). ActionGet (); SearchResponse Response = Client.PrepareSearch () .Execute (). ActionGet (); // searchhits Hits = Response.Gethits (); // pour (SearchHit SearchHit: Hits) {// pour (iterator <earchhitField> iterator = searchHit.iterator (); iterator.hasnext ();) {// searchHitFiel System.out.println (next.getValues ()); //} //} System.out.println (réponse); } / ** * Test de défilement API * Traitement plus efficace de grandes quantités de données * / @Test public void testscrolls () {queryBuilder QueryBuilder = queryBuilders.terMquery ("Twitter", "Tweet"); SearchResponse réponse = client.prepareSearch ("twitter") .addsort (sortPaSeElement.doc_field_name, sortOrder.asc) .setscroll (new TimeValue (60000)) .setQuery (queryBuilder) .SetSize (100) .ExECUTE (). ActionGet (); while (true) {for (searchhit hit: réponse.gethits (). gethits ()) {System.out.println ("je viens"); } SearchResponse Response2 = client.PrepareSearchScroll (réponse.getscrollid ()) .SetScroll (new TimeValue (60000)). EXECUTE (). ActionGet (); if (réponse2.GETHiTS (). GETHITS (). LONGGET == 0) {System.out.println ("Oh non ====="); casser; }}} / ** * Test MultiSearch * / @Test public void testMultiSearch () {queryBuilder qb1 = queryBuilders.QuerystringQuery ("elasticsearch"); SearchRequestBuilder requestBuilder1 = client.PrepareSearch (). SetQuery (QB1) .SetSize (1); QueryBuilder qb2 = queryBuilders.matchQuery ("utilisateur", "kimchy"); SearchRequestBuilder requestBuilder2 = client.PrepareSearch (). SetQuery (QB2) .SetSize (1); MultiSearchResponse Multi -Response = Client.PrePareMultiSearch (). Add (requestBuilder1) .Add (requestBuilder2) .ExECUTE (). ActionGet (); long nbhits = 0; for (MultiSearchResponse.Item Item: MultiResponse.getResponse ()) {SearchResponse Response = item.getResponse (); nbhits = réponse.geThits (). getTotalHits (); SearchHit [] Hits = Response.GETHITS (). GETHITS (); System.out.println (nbhits); }} / ** * Test Aggregation Query * / @Test public void testAgGregation () {SearchResponse Response = client.PrepareSearch () .SetQuery (QueryBuilders.MatchallQuery ()) // Utilisez d'abord la question pour filtrer une partie de l'informatique. .Addaggregation (agrégationBuilders.DateHistogram ("Agg2"). Field ("Birth") .Interval (DateHistogramInterval.year)) .Exécute (). ActionGet (); Agrégation aggrégation2 = réponse.getAggregations (). Get ("terme"); Agrégation aggregation = réponse.getAggregations (). Get ("Agg2"); // SearchResponse Response2 = Client.Search (new SearchRequest (). SearchType (SearchType.Query_and_Fetch)). ActionGet (); } / ** * Test Termine * / @Test public void TestTerMatafter () {SearchResponse Response = Client.PrepareSearch ("Twitter"). Setterminatefter (1000) .get (); if (réponse.isterMinedEarly ()) {System.out.println ("ternimate"); }} / ** * Query de filtre: supérieur à GT, inférieur à LT, inférieur ou égal à LTE, supérieur ou égal à GTE * / @Test public void testFilter () {SearchResponse Response = client.prepareSearch ("Twitter") .SetTyPes ("") .SetQuery (QueryBuilders.MatchallQuery ()) / / Query. .SetSearchType (SearchType.Query_Then_Fetch) // .SetPostFilter (FilterBuilders.RangeFilter ("Age"). De (0) .To (19) // .CludeLoLer (true) .includeupper (true)) // .SetpostFilter (FilterBuilderFactory .RangeFilter ("Age"). gte (18) .lte (22)) .setExplain (true) // Expliquez est vrai pour indiquer que le classement est trié en fonction de la pertinence des données, et le mot-clé correspondant le plus élevé est devant.get (); } / ** * Query de groupe * / @Test public void TestGroupBy () {client.PrepareSearch ("Twitter"). SetTypes ("Tweet") .SetQuery (queryBuilders.matchallQuery ()) .SetSearchType (SearchType.Query_terms. .field ("utilisateur"). Size (0) // Groupe selon l'utilisateur // taille (0) est également 10) .get (); }}Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.