Entorno del sistema: CentOS 7.2 bajo VM12
Versión instalada actual: Elasticsearch-2.4.0.tar.gz
Java Operation ES Cluster Pasos 1: Configurar información del objeto de clúster; 2: crear cliente; 3: Ver información del clúster
1: nombre del clúster
El nombre predeterminado del clúster es Elasticsearch. Si el nombre del clúster es inconsistente con el especificado, se informará un error al usar recursos de nodo.
2: Función de oler
Inicie la función Sniff a través de client.transport.sniff, para que solo necesite especificar un nodo en el clúster (no necesariamente un nodo maestro), y luego cargar otros nodos en el clúster. De esta manera, siempre que el programa siga apagando, aún puede conectarse a otros nodos incluso si este nodo baja.
3: Tipo de consulta SearchType.Query_then_fetch
Hay 4 tipos de tipos de consultas en la consulta de ES
Query_and_fetch:
El nodo maestro distribuye la solicitud de consulta a todos los fragmentos. Cada fragmento se clasifica y clasifica de acuerdo con sus propias reglas de consulta, a saber, la frecuencia de documento de frecuencia de palabras, y luego devuelve el resultado al nodo maestro. El nodo maestro resume y clasifica todos los datos y los devuelve al cliente. Este método solo requiere interacción con ES una vez.
Este método de consulta tiene problemas con el volumen de datos y la clasificación. El nodo principal resumirá los datos devueltos por todos los fragmentos para que el volumen de datos sea relativamente grande. En segundo lugar, las reglas sobre cada fragmento pueden ser inconsistentes.
Query_then_fetch:
El nodo maestro distribuye la solicitud a todos los fragmentos. Después de ordenar cada fragmento, la identificación y la puntuación de los datos se devuelven al nodo maestro. Después de recibirlo, el nodo maestro lo resume y lo clasifica, y luego lee los datos correspondientes al nodo correspondiente de acuerdo con la identificación ordenada y lo devuelve al cliente. Este método requiere interacción con ES dos veces.
Este método resuelve el problema del volumen de datos, pero el problema de clasificación todavía existe y es el método de consulta predeterminado de ES
Def_query_and_fetch: y dfs_query_then_fetch:
Unifique las reglas de cada fragmento para anotar. Resolvió el problema de clasificación, pero DFS_Query_and_fetch todavía tiene problemas de volumen de datos, DFS_Query_then_fetch tiene el mejor problema, pero la eficiencia es la peor.
1. Obtenga el cliente, dos formas de obtener
@Bebore public void antes () lanza la excepción {map <string, string> map = new Hashmap <String, String> (); map.put ("cluster.name", "elastic_wenbronk"); Settings.builder settings = settings.builder (). Put (map); Client = TransportClient.Builder (). Configuración (Configuración) .Build () .addtransportAddress (nuevo inetSocketTransportAddress (inetaddress.getByName ("www.wenbronk.com"), Integer.Parseint ("9300")); } @Bebore public void antes11 () lanza la excepción {// Crear el cliente, use el nombre de clúster predeterminado, "Elasticsearch" // cliente = transportlient.builder (). Build () // .addtransportaddress (nuevo inetSocketTransportAddress (inetDress.getByName ("www.wenbronk.com"), 9300));); // Especifique la información de configuración del clúster a través del objeto de configuración, y la configuración configurada de nombre de clúster configuración settings = settings.settingsBuilder (). Put ("cluster.name", "elasticsearch_wenbronk") // establecer el nombre del clúster // .put ("cluste.transport.sniff", verdadero) // encender Sniff, no estará conectado, estará conectado, la apertura, la apertura, la razón se desconoce el motivo // .put ("network.host", "192.168.50.37") .put ("client.transport.ignore_cluster_name", true) // ignorar la verificación del nombre del clúster, y puede conectarse al nombre del clúster si el nombre del clúster está incorrecto después de abrir // .put ("client.transport.nodes_sampler_interval", 5) // informes, // .put ("client.transport.ping_timeout", 5) // informa un error, tiempo de espera de ping, .build (); Client = TransportClient.Builder (). Configuración (Configuración) .Build () .AddTransportAddress (nuevo inetSocketTransportAddress (nuevo inetSocketAddress ("192.168.50.37", 9300))); // predeterminado 5s // ¿Cuánto tiempo se tarda en abrir la conexión, 5S System.out.println ("Success Connect"); }PD: Los dos métodos dados por el sitio web oficial no se pueden usar, deben combinarse para usarlos, y estoy desperdiciando mi tarde ...
El significado de otros parámetros:
Código:
paquete com.wenbronk.javaes; import java.net.inetaddress; import java.net.inetsocketaddress; import java.util.date; import java.util.hashmap; import java.util.list; import java.util.map; import java.util.concurrent.timit; import org.elasticsearch.action.bulk.backoffpolicy; importar org.elasticsearch.action.bulk.bulkprocessor; importar org.elasticsearch.action.bulk.bulkprocessor.listener; importar org.elastic.bulk.bulkRequest; import org.elasticsearch.bulk.bulk.Bulkbulk; org.elasticsearch.action.bulk.bulkesponse; import org.elasticsearch.action.delete.deleterequest; import og.elasticsearch.action.delete.deleterponse; importar org.elastic.action.get.getResponse; import org.elasticsearch.action.get.multigetResponse; import org.elasticsearch.action.index.indexRequest; import org.elasticsearch.accion.index.indexResponse; import org.elasticsearch.Action.Update.UpdAtePonse; import org.elasticsearch.action.update.UpdaterSeSponse; importación; importación; org.elasticsearch.client.transport.transportclient; import org.elasticsearch.cluster.node.discoverynode; importar org.elasticsearch.common.settings.settings; importar org.elasticsearch.common.transport.inetsocketTransportadDress; import org.elasticsearch.common.unit.bytesizeValue; import org.elasticsearch.common.unit.timeValue; import og.elasticsearch.common.xContent.xContentBuilder; import org.junit.before; import org.junit.test; import com.alibaba.fastjson.jsonObject;/** * Use la API Java para operar ElasticseSearch * * @author 231 * */public class Javaestest {Cliente de transporte privado; Fuente privada de IndexRequest; /*** Obtenga la conexión, la primera forma* @throws Exception* /// @bebore public void antes () lanza la excepción {map <string, string> map = new Hashmap <String, String> (); map.put ("cluster.name", "elastic_wenbronk"); Settings.builder settings = settings.builder (). Put (map); Client = TransportClient.Builder (). Configuración (Configuración) .Build () .addtransportAddress (nuevo inetSocketTransportAddress (inetaddress.getByName ("www.wenbronk.com"), Integer.Parseint ("9300")); }/ *** Ver información de clúster*/ @Test public void testInfo () {list <Scubedynode> nodos = client.connectedNodes (); para (nodo Discoverynode: nodos) {System.out.println (node.gethostaddress ()); }}/*** Organizar cadenas JSON, Método 1, empalmando directamente*/public String createJson1 () {String json = "{" + "/" user/":/" kimchy/"," + "/" postdate/":/" 2013-01-30/"," + "/" mensaje/":" intentando elasticsearch/" +" + "}"; regresar json; } / ** * Crear json con map * / public map <string, object> createjson2 () {map <string, object> json = new HashMap <String, Object> (); json.put ("usuario", "kimchy"); json.put ("PostDate", nueva fecha ()); json.put ("Mensaje", "Probar elasticsearch"); regresar json; } / *** Crear usando FastJson* / public jsonObject createJson3 () {jsonObject json = new jsonObject (); json.put ("usuario", "kimchy"); json.put ("PostDate", nueva fecha ()); json.put ("Mensaje", "Probar elasticsearch"); regresar json; } / *** Use la clase de ayuda de ES* / public xContentBuilder createJson4 () lanza excepción {// create JSON Object, una de las formas de crear JSON XContentBuilder Source = xContentFactory.jsonBuilder (). Elasticsearch ") .EndObject (); fuente de retorno; } / *** Guardar en el índice* @throws Exception* / @test public void test1 () lanza la excepción {xContentBuilder Source = createJSON4 (); // almacena JSON en la respuesta índice indexResponse = client.prepareIndex ("twitter", "tweet", "1"). SetSource (fuente) .get (); // // El resultado se obtiene String index = respuesta.getIndex (); String type = respuesta.gettype (); Cadena id = respuesta.getId (); Versión larga = respuesta.getVersion (); boolean creado = respuesta.IsCreated (); System.out.println (index + ":" + type + ":" + id + ":" + versión + ":" + creado); }/ *** Get API Obtenga la información del documento especificada*/ @test public void testget () {// getResponse Response = Client.PrepareGet ("Twitter", "Tweet", "1") // .get (); GetResponse Response = Client.PrepareGet ("Twitter", "Tweet", "1") .SetOperationThreaded (false) // Thread Safe.get (); System.out.println (Response.getSourCeASString ()); } / ** * Test Delete API * / @Test public void testDelete () {deletreponse respuesta = client.preparedelete ("twitter", "tweet", "1") .get (); String index = respuesta.getIndex (); String type = respuesta.gettype (); Cadena id = respuesta.getId (); Versión larga = respuesta.getVersion (); System.out.println (index + ":" + type + ":" + id + ":" + versión); } / ** * Test Update Update API * Use el objeto UpdateRequest * @throws excepción * / @test public void topDate () lanza la excepción {UpdateRequest UpdateRequest = new UpdateRequest (); updateRequest.Index ("Twitter"); updateRequest.type ("tweet"); updateRequest.id ("1"); updateRequest.doc (xContentFactory.jsonBuilder () .StartObject () // Agregar campos que no existen, reemplazar los campos.field existentes ("género", "masculino") .field ("mensaje", "hola") .EnDoBject ()); UpdaterAponse Response = Client.Update (UpdateRequest) .get (); // imprime cadena index = respuesta.getIndex (); String type = respuesta.gettype (); Cadena id = respuesta.getId (); Versión larga = respuesta.getVersion (); System.out.println (index + ":" + type + ":" + id + ":" + versión); }/** * PRUEBA LA API ACTUALIZACIÓN, use Client * @trows Exception */@test public void topDate2 () lanza la excepción {// actualizada con el objeto de script // updaterSponse respuesta = client.prepareUpdate ("twitter", "tweet", "1") // .setscript (nuevo script ("hits._source.gender =/" macho/"")///);); // UpdaterSponse Response = Client.PrepareUpdate ("Twitter", "Tweet", "1") // .SetDoc (xContentFactory.jsonBuilder () // .StartObject () // .Field ("Gender", "Malelelele") // .EdObject ()). Get (); // Use el objeto UpdateRequest y script // updateRequest UpdateRequest = new UpdateRequest ("Twitter", "Tweet", "1") // .script (nuevo script ("ctx._source.gender =/" masculino/")); // Respuesta UpdaterSponse = Client.Update (UpdateRequest) .get (); // UpdaterSponse Response = Client.Update (nuevo UpdateRequest ("Twitter", "Tweet", "1") .Doc (xContentFactory.jsonBuilder () .StartObject () .field ("género", "masculino") .EdObject ()). Get (); System.out.println (respuesta.getIndex ()); }/** * ACTUALIZACIÓN DE PRUEBA * Use UpdateRequest * @throws Exception * @throws InterruptedException */@Test public void topUpDate3 () lanza interruptedException, excepción {updateRequest updateRequest = new updateRequest ("twitter", "tweet", "1") .script (nuevo script ("ctx._source.gender =/"/");"); UpdaterAponse Response = Client.Update (UpdateRequest) .get (); } / ** * Test Método Upsert * @throws Exception * * / @test public void topUpSert () lanza la excepción {// establece las condiciones de consulta, agregue el indexRequest indexRequest indexRequest = new IndexRequest ("twitter", "tweet", "2") .source (xContentFactory.jsonBuider () .start () .field ("Nombre") .Source "). .field ("género", "gfrerq") .endoBject ()); // Establezca la actualización, busque la configuración de actualización a continuación UpdateRequest UpSert = new UpdateRequest ("Twitter", "Tweet", "2") .Doc (xContentFactory.jsonBuUder () .StartObject () .Field ("Usuario", "WenBronk") .EdObject ()) .Upsert (IndexRequest); Client.Update (Upsert) .get (); } /** * Test multi get api * Get from different index, type, and id */ @Test public void testMultiGet() { MultiGetResponse multiGetResponse = client.prepareMultiGet() .add("twitter", "tweet", "1") .add("twitter", "tweet", "2", "3", "4") .add("anothoer", "type", "foo") .get (); para (multigetitemResponse itemResponse: multigetresponse) {getResponse respuesta = itemResponse.getResponse (); if (respuesta.isexists ()) {String SourceASString = Response.getSourCeAsString (); System.out.println (SourceaseString); }}} / *** Ejecución de lotes a granel* Una consulta se puede actualizar o eliminar múltiples documentos* / @test public void testBulk () lanza una excepción {bulkrequestBuilder bulkrequest = client.preparebulk (); bulkrequest.add (client.prepareIndex ("twitter", "tweet", "1") .setSource (xContentFactory.jsonBuilder () .StartObject () .field ("user", "kimchy") .field ("post -date", nueva fecha ()) .field ("mensaje", "intentando elasticsearch") .EndeObject ());) bulkrequest.add (client.prepareIndex ("twitter", "tweet", "2") .setSource (xContentFactory.jsonBuilder () .StartObject () .field ("user", "kimchy") .field ("postdate", nueva fecha ()) .field ("mensaje", "otra publicación") .EdObject ())); Respuesta BulkResponse = BulkRequest.get (); System.out.println (Response.Getheaders ()); } / ** * Use el procesador a granel * @throws Exception * / @test public void testBulkprocessor () lanza la excepción {// crea bulkporcessor ObjectBulkprocessor bulkprocessor = bulkprocessor.builder (client, new Learcher () {public void antes de Bulk (Long ParamLong, parambulkrequest) stub} // ejecutar public void Afterbulk (Long ParamLong, bulkRequest parambulkRequest, showleable paramthrowable) {// tODO auto-generado método generado stub} public void Afterbulk (long paramlong, bulkrequest parambulkrequest, bulkResponse parambulkResponse) {// todoDo aDO stubeN // 1W Solicitudes para ejecutar Bulk .SetBulkactions (10000) // 1GB Data Refresh Bulk .SetBulkSize (new byTesizeValue (1, bytesizeUnit.gb)) // fijo 5s debe ser actualizado una vez. simultáneamente.setConcurrentRequests (1) // retrocede, ejecute después de 100 ms, máximo 3 solicitudes. // Agregar una sola solicitud bulkprocessor.add (nueva indexRequest ("twitter", "tweet", "1")); bulkprocessor.add (nuevo deleterequest ("twitter", "tweet", "2")); // cierre bulkprocessor.awaitclose (10, timeunit.mines); // o bulkprocessor.close (); }} Código TES2:
paquete com.wenbronk.javaes; import java.net.inetsocketaddress; import org.apache.lucene.QueryParser.xml.filterBuilderfactory; import ORG.elasticsearch.action.search.multisearchRponse; import og.elasticsearch.acation.search.searchrequebuilder; import; importar; import org.elasticsearch.action.search.searchResponse; importar org.elasticsearch.accion.search.searchType; import org.elasticsearch.client.transport.transportclient; import org.elasticsearch.common.settings.settings; import org.elasticsearch.common.transport.inetsockettransportaddress; import org.elasticsearch.common.unit.timeValue; importar org.elasticsearch.index.query.QueryBuuder; import oterSearch.index.Query.Querybuilders; import og.elasticsearch.searchhit; org.elasticsearch.search.aggregations.aggregation; importar org.elasticsearch.search.aggregations.aggregations.aggregationsbuilders; import org.elasticsearch.search.aggregations.bucket.histogram.datehistograminterval; import oelticsearch.search.sort.sortorder; importar; import org.elasticsearch.search.sort.sortParseElement; import org.junit.before; import org.junit.test;/** * Use la API Java para operar Elasticsearch * Buscar api * @author 231 * */clase pública Javaestest2 {private Transportlient Client; / *** Objetivo Get Client*/ @bebore public void testbefore () {Builder Builder = settings.settingsBuilder (); builder.put ("cluster.name", "wenbronk_escluster"); // .put ("client.transport.ignore_cluster_name", true); Configuración Configuración = Builder.Build (); org.elasticsearch.client.transport.transportclient.builder TransportBuild = TransportClient.Build (); TransportClient Client1 = TransportBuild.settings (Configuración) .Build (); Client = Client1.AddTransportAddress ((nuevo inetSocketTransportAddress (nuevo inetSocketAddress ("192.168.50.37", 9300)))); System.out.println ("Success Conecte a Escluster"); }/*** Consulta de prueba*/@Test public void testSearch () {// SearchRequestBuilder SearchRequestBuilder = Client.PrepareSearch ("Twitter", "Tweet", "1"); // Respuesta SearchResponse = SearchRequestBuilder.settypes ("Type1", "Type2") // .SetSearchType (searchType.dfs_query_then_fetch) // .setQuery (QueryBuilders.MermQuery ("Usuario", "Test")) // .SetPostFilter (QueryBuilders.RangeQuery ("Age"). De (0) .to (1)) // .SetFrom (0) .setsize (2). .execute (). ActionGet (); SearchResponse Respuesta = Client.PrepareSearch () .ExeCute (). ActionGet (); // SearchHits Hits = Response.Gethits (); // para (SearchHit SearchHit: Hits) {// for (ITerator <S. SearchHitField> ITERATOR = SearchHit.iterator (); Iterator.hasnext ();) {// SearchHieldField System.out.println (next.getValues ()); //} //} System.out.println (respuesta); } / *** Test Scroll API* Procesamiento más eficiente de grandes cantidades de datos* / @Test public void testScrolls () {QueryBuilder QueryBuilder = QueryBuilders.TermQuery ("Twitter", "Tweet"); SearchResponse Respuesta = Client.PrepareSearch ("Twitter") .addsort (sortParseElement.doc_field_name, sortOrder.asc) .setsCroll (newValue (60000)) .setQuery (QueryBuilder) .setsize (100) .Execute (). ActionGet (); while (true) {for (SearchHit Hit: Response.gethits (). Gethits ()) {System.out.println ("Estoy veniendo"); } SearchResponse Response2 = Client.PrepareSearchScroll (Response.getScrollID ()) .setsCroll (new TimeValue (60000)). Execute (). ActionGet (); if (respuesta2.gethits (). gethits (). longitud == 0) {system.out.println ("oh no ======"); romper; }}} / ** * Test MultISearch * / @test public void testMultIearch () {QueryBuilder qb1 = QueryBuilders.queryStringQuery ("Elasticsearch"); SearchRequestBuilder requestBuilder1 = client.preparesearch (). SetQuery (QB1) .setsize (1); QueryBuilder QB2 = QueryBuilders.MatchQuery ("Usuario", "Kimchy"); SearchRequestBuilder requestBuilder2 = client.preparesearch (). SetQuery (QB2) .setsize (1); MultISearchResponse MultIResponse = Client.PreparemUltIeEarch (). Add (requestBuilder1) .Add (requestBuilder2) .Execute (). ActionGet (); nbhits largos = 0; for (múltiple en múltiple el elemento de item: multiResponse.getResponse ()) {SearchResponse Response = item.getResponse (); nbhits = respuesta.gethits (). getTotalHits (); SearchHit [] Hits = Response.gethits (). Gethits (); System.out.println (nbhits); }} / *** Consulta de agregación de prueba* / @Test public void testaggregation () {searchResponse Response = Client.PrepareSearch () .SetQuery (QueryBuilders.matchallQuery ()) // Primer uso de la consulta para filtrar una parte de IT.Addaggregation (AgregationBuilders.terms.terms ("término"). Campo (") (" Usar ")))) .addaggregation (AgregationBuilders.datehistogram ("agg2"). campo ("nacimiento") .interval (datehistograminterval.year)) .execute (). ActionGet (); Agregación agregación2 = respuesta.getAgGregations (). Get ("término"); Agregación agregación = respuesta.getAgGregations (). Get ("agg2"); // searchResponse Response2 = Client.search (nueva SearchRequest (). SearchType (SearchType.Query_and_fetch)). ActionGet (); } / ** * Test Terminate * / @test public void testterMinAteAftter () {searchResponse Response = Client.PrepareSearch ("Twitter"). SetTerminAtefter (1000) .get (); if (respuesta.estherminedearly ()) {system.out.println ("ternimate"); }} /** * Consulta de filtro: mayor que GT, menor que LT, menor o igual a LTE, mayor o igual a GTE * /@Test public Void testFilter () {SearchResponse Response = Client.PrepareSearch ("Twitter") .SettyPes ("") .SetQuery (QueryBuLilders.matchallQuery () // Query Allery .SetSearchType (SearchType.Query_then_fetch) // .SetPostFilter (FilterBuilders.RangeFilter ("Age"). Desde (0) .to (19) // .includelower (true) .includeUpper (true)) // .SetPostFilter (FilterBuilderyFactoryFactoryfactory .rangeFilter ("edad"). gte (18) .lte (22)) .setExplan (true) // Explicar es cierto para indicar que la clasificación se clasifica de acuerdo con la relevancia de los datos, y la palabra clave más alta está en front.get (); } / *** consulta de grupo* / @test public void testGroupby () {client.preparesearch ("twitter"). Settypes ("tweet") .setQuery (QueryBuilders.matchallQuery ()) .SetSearchType (SearchType.Query_Then_Fetch) .addaggregation (agregaciones. .field ("usuario"). tamaño (0) // grupo según el usuario // tamaño (0) también es 10) .get (); }}Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.