1. elasticsearch安装

官方下载地址:https://www.elastic.co/downloads/elasticsearch

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

解压文件 elasticsearch-2.4.0.zip

修改配置文件

?
1 2 3 4 elasticsearch-2.4.0 cat config /elasticsearch .yml | grep - v "#" cluster.name: rainbow network.host: 127.0.0.1 http.port: 9200

 配置说明

cluster.name表示es集群的名称,可以自定义一个自己需要的集群名称
http.port 表示对外提供http服务时的http端口。
network.host 表示本地监听绑定的ip地址,此处为测试环境,直接使用本机的ip地址 127.0.0.1.

 启动说明

?
1 elasticsearch-2.4.0 nohup . /bin/elasticsearch &

 启动后显示信息

elastic search使用总结 随笔 第1张

es启动监听两个端口,9300和9200
9300端口是使用tcp客户端连接使用的端口;
9200端口是通过http协议连接es使用的端口;

2. 使用http方式增加和查询数据

增加数据(http PUT):

?
1 2 3 ➜ curl -XPUT localhost:9200 /user_idx/type_tags/12 -d\<br> '{"name" : "Mr.YF", "tags" : ["Go","Java","Lua","C++","Tcl","..."]}'   { "_index" : "user_idx" , "_type" : "type_tags" , "_id" : "12" , "_version" :1, "_shards" :{ "total" :2, "successful" :1, "failed" :0}, "created" : true }

 查询数据(http GET)

elastic search使用总结 随笔 第2张

3. 使用elasticsearch客户端编写java代码访问es

编写es客户端提供者类,对es连接做简单的封装

SearchClientProvider.java

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 package org.wyf.elasticsearch.search;   /**   * Created by wyf on 16/9/25.   */ import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.wyf.common.property.XmlProperties;   import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.HashMap; import java.util.Iterator; import java.util.Map;   import static java.lang.System.out;   public class SearchClientProvider {      private static final Logger LOGGER = LoggerFactory.getLogger(SearchClientProvider. class );        private TransportClient client = null ;      private volatile boolean inited = false ;        public TransportClient get() {          return this .client;      }        @PreDestroy      public synchronized void close() {          if ( this .client != null ) {              this .client.close();          }      }        @PostConstruct      public synchronized void init() {          if (!inited) {              try {                  Map<String, String> config = XmlProperties.loadFromXml( "properties/elasticsearch.xml" );                  if (config == null ) {                      out.println( "load xml err" );                      return ;                  }                  Iterator<Map.Entry<String, String>> iterator = config.entrySet().iterator();                  Map<String, String> settingConfig = new HashMap<String, String>();                  while (iterator.hasNext()) {                      Map.Entry<String, String> next = iterator.next();                      if (!next.getKey().equals( "transport.addresses" )) {                          settingConfig.put(next.getKey(), next.getValue());                      }                  }                  Settings settings = Settings.builder().put(settingConfig).build();                  TransportClient client = TransportClient.builder().settings(settings).build();                  this .client = client;                    String[] addresses = config.get( "transport.addresses" ).split( "," );                  for (String address : addresses) {                      String[] hostAndPort = address.split( ":" );                      client.addTransportAddress( new InetSocketTransportAddress(InetAddress.getByName(hostAndPort[ 0 ]), Integer.valueOf(hostAndPort[ 1 ])));                    }                  this .inited = true ;              } catch (UnknownHostException e) {                  LOGGER.error(String.format( "init search client err:=>msg:[%s]" , e.getMessage()), e);                  if (client != null ) {                      this .client.close();                  }              }          }      } }

 编写elasticsearch的配置文件加载类

 XmlProperties.java

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 package org.wyf.common.property;   import org.slf4j.LoggerFactory; import org.slf4j.Logger;   import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.*;   public class XmlProperties {      private static final Logger LOGGER = LoggerFactory.getLogger(XmlProperties. class );        private XmlProperties() {      }        public static Map<String, String> loadFromXml(String xmlPropertiesPath) {          try {              Object in = XmlProperties. class .getClassLoader().getResourceAsStream(xmlPropertiesPath);              if (in != null ) {                  LOGGER.info( "Found the xml properties [{}] in class path,use it" , xmlPropertiesPath);                  Map e1 = loadFromXml((InputStream)in);                  return e1;              }              Map<String, String> resMap = null ;                File e = new File(xmlPropertiesPath);              if (!e.isFile()) {                  return resMap;              }                LOGGER.info( "Found the xml properties [{}] in file path,use it" , xmlPropertiesPath);              in = new FileInputStream( new File(xmlPropertiesPath));              resMap = loadFromXml((InputStream)in);              ((InputStream) in).close();              return resMap;          } catch (Exception var7) {              LOGGER.error( "Load xml properties [" + xmlPropertiesPath + "] error." , var7);          }          return null ;      }        public static Map<String, String> loadFromXml(InputStream in) throws IOException {          Properties properties = new Properties();          properties.loadFromXML(in);          HashMap map = new HashMap();          Set entries = properties.entrySet();          Iterator iter = entries.iterator();            while (iter.hasNext()) {              Map.Entry entry = (Map.Entry)iter.next();              map.put((String)entry.getKey(), (String)entry.getValue());          }            return map;      } }

 编写elasticsearch简单的操作类,包含成员函数 save update get 和delete

SearchImpl.java

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 package org.wyf.elasticsearch;   /**   * Created by wyf on 16/9/25.   */ import org.elasticsearch.action.delete.DeleteRequestBuilder; import org.elasticsearch.action.delete.DeleteResponse; import org.elasticsearch.action.get.GetRequestBuilder; import org.elasticsearch.action.get.GetResponse; import org.elasticsearch.action.index.IndexRequestBuilder; import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.index.engine.VersionConflictEngineException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.wyf.elasticsearch.search.SearchClientProvider;   import javax.annotation.PostConstruct; import java.util.Map;   public class SearchImpl implements ISearch {        private static final Logger LOGGER = LoggerFactory.getLogger(SearchImpl. class );        private SearchClientProvider searchClientProvider;      public  SearchImpl() {          searchClientProvider = new SearchClientProvider();          searchClientProvider.init();      }        public Map<String, Object> save(String index, String type, String id, Map<String, Object> data) {          TransportClient client = searchClientProvider.get();          IndexRequestBuilder builder = client.prepareIndex(index, type, id);          IndexResponse response = builder                  .setSource(data)                  .execute()                  .actionGet();          LOGGER.info( "save index:=>index:{}, type:{}, id:{}, data:{}, rsp:{}" , index, type, id, data, response);          return data;      }        public int update(String index, String type, String id, Map<String, Object> data) {          int i = 2 ;          do {              try {                  if (_innerUpdate(index, type, id, data)) return 1 ;              } catch (VersionConflictEngineException e) {                  LOGGER.warn(String.format( "update index:=>index:%s, type:%s, id:%s, data:%s, rsp:%s" ,                          index, type, id, data, e.getMessage()), e);              }          } while ((i--) > 0 );          return _innerUpdate(index, type, id, data) ? 1 : 0 ;      }        public int delete(String index, String type, String id) {          TransportClient client = searchClientProvider.get();          DeleteRequestBuilder builder = client.prepareDelete(index, type, id);          DeleteResponse response = builder.execute().actionGet();          LOGGER.info( "delete index:=>index:{}, type:{}, id:{}, rsp:{}" ,                  index, type, id, response);          return response.isFound() ? 1 : 0 ;      }        public Map<String, Object> get(String index, String type, String id) {          TransportClient client = searchClientProvider.get();          GetRequestBuilder builder = client.prepareGet(index, type, id);          GetResponse response = builder.execute().actionGet();          return response.isExists() ? response.getSource() : null ;      }        private boolean _innerUpdate(String index, String type, String id, Map<String, Object> data) {          TransportClient client = searchClientProvider.get();          GetRequestBuilder getRequestBuilder = client.prepareGet(index, type, id);          GetResponse getResponse = getRequestBuilder.execute().actionGet();          if (getResponse.isExists()) {              final long version = getResponse.getVersion();              final Map<String, Object> source = getResponse.getSource();              source.putAll(data);                IndexRequestBuilder builder = client.prepareIndex(index, type, id);              IndexResponse response = builder                      .setVersion(version)                      .setSource(source)                      .execute()                      .actionGet();              LOGGER.info( "update index:=>index:{}, type:{}, id:{}, data:{}, rsp:{}" ,                      index, type, id, data, response);              return true ;          }          throw new RuntimeException(String.format( "can not get document:=>index:%s, type:%s, id:%s " , index, type, id));      } }

 

编写单元测试类

ElasticSearchTest.java

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 package org.wyf;   import org.junit.Before; import org.junit.Test; import org.wyf.elasticsearch.ISearch; import org.wyf.elasticsearch.SearchImpl;   import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set;   /**   * Created by wyf on 16/9/25.   */ public class ElasticsearchTest {      ISearch search;        @Test      public void get() {          Map<String,Object> map = search.get( "a" , "type1" , "123" );          Set<String> set = map.keySet();          for (Iterator<String> it = set.iterator(); it.hasNext();) {              String key = it.next();              System.out.println(key + ":" + map.get(key));          }      }        @Test      public void save() {          Map<String, Object> values = new HashMap<String, Object>();          values.put( "k1" , "v1" );          values.put( "k2" , "v2" );            Map<String,Object> map = search.save( "a" , "type1" , "123" , values);          Set<String> set = map.keySet();          for (Iterator<String> it = set.iterator(); it.hasNext();) {              String key = it.next();              System.out.println(key + ":" + map.get(key));          }        }        @Before      public void before() {          search = new SearchImpl();      } }

 

elasticsearch的配置文件

?
1 2 3 4 5 6 7 8 <? xml version="1.0" encoding="UTF-8" standalone="no"?> <! DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> < properties >      < comment >elasticsearch的配置</ comment >      < entry key="client.transport.sniff">true</ entry >      < entry key="cluster.name">rainbow</ entry >      < entry key="transport.addresses">127.0.0.1:9300</ entry > </ properties >

 

测试结果:

测试save函数结果

elastic search使用总结 随笔 第3张

 

http接口查询结果页面

elastic search使用总结 随笔 第4张

 

遇到的问题

最开始调试时返回如下错误

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 NoNodeAvailableException[None of the configured nodes are available: [{#transport#- 1 }{ 127.0 . 0.1 }{ 127.0 . 0.1 : 9200 }] ]      at org.elasticsearch.client.transport.TransportClientNodesService.ensureNodesAreAvailable(TransportClientNodesService.java: 290 )      at org.elasticsearch.client.transport.TransportClientNodesService.execute(TransportClientNodesService.java: 207 )      at org.elasticsearch.client.transport.support.TransportProxyClient.execute(TransportProxyClient.java: 55 )      at org.elasticsearch.client.transport.TransportClient.doExecute(TransportClient.java: 283 )      at org.elasticsearch.client.support.AbstractClient.execute(AbstractClient.java: 347 )      at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java: 85 )      at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java: 59 )      at org.wyf.elasticsearch.SearchImpl.save(SearchImpl.java: 36 )      at org.wyf.ElasticsearchTest.save(ElasticsearchTest.java: 35 )      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java: 62 )      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: 43 )      at java.lang.reflect.Method.invoke(Method.java: 498 )      at org.junit.runners.model.FrameworkMethod$ 1 .runReflectiveCall(FrameworkMethod.java: 47 )      at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java: 12 )      at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java: 44 )      at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java: 17 )      at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java: 26 )      at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java: 271 )      at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java: 70 )      at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java: 50 )      at org.junit.runners.ParentRunner$ 3 .run(ParentRunner.java: 238 )      at org.junit.runners.ParentRunner$ 1 .schedule(ParentRunner.java: 63 )      at org.junit.runners.ParentRunner.runChildren(ParentRunner.java: 236 )      at org.junit.runners.ParentRunner.access$ 000 (ParentRunner.java: 53 )      at org.junit.runners.ParentRunner$ 2 .evaluate(ParentRunner.java: 229 )      at org.junit.runners.ParentRunner.run(ParentRunner.java: 309 )      at org.junit.runner.JUnitCore.run(JUnitCore.java: 160 )      at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java: 117 )      at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java: 42 )      at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java: 253 )      at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java: 84 )      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java: 62 )      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: 43 )      at java.lang.reflect.Method.invoke(Method.java: 498 )      at com.intellij.rt.execution.application.AppMain.main(AppMain.java: 147 )

 

解决办法是检查es集群的名称和端口是否正确

由于端口配置错误,导致如上问题

正确的端口是9300,正如最开始说的那样,使用tcp方式访问es时,使用端口9300,使用http方式访问es使用端口9200.

 

代码git地址:

https://github.com/gityf/java_demo/tree/master/demo/src/main/java/org/wyf/elasticsearch

Done.

 

,

1. elasticsearch安装

官方下载地址:https://www.elastic.co/downloads/elasticsearch

解压文件 elasticsearch-2.4.0.zip

修改配置文件

?
1 2 3 4 elasticsearch-2.4.0 cat config /elasticsearch .yml | grep - v "#" cluster.name: rainbow network.host: 127.0.0.1 http.port: 9200

 配置说明

cluster.name表示es集群的名称,可以自定义一个自己需要的集群名称
http.port 表示对外提供http服务时的http端口。
network.host 表示本地监听绑定的ip地址,此处为测试环境,直接使用本机的ip地址 127.0.0.1.

 启动说明

?
1 elasticsearch-2.4.0 nohup . /bin/elasticsearch &

 启动后显示信息

elastic search使用总结 随笔 第5张

es启动监听两个端口,9300和9200
9300端口是使用tcp客户端连接使用的端口;
9200端口是通过http协议连接es使用的端口;

2. 使用http方式增加和查询数据

增加数据(http PUT):

?
1 2 3 ➜ curl -XPUT localhost:9200 /user_idx/type_tags/12 -d\<br> '{"name" : "Mr.YF", "tags" : ["Go","Java","Lua","C++","Tcl","..."]}'   { "_index" : "user_idx" , "_type" : "type_tags" , "_id" : "12" , "_version" :1, "_shards" :{ "total" :2, "successful" :1, "failed" :0}, "created" : true }

 查询数据(http GET)

elastic search使用总结 随笔 第6张

3. 使用elasticsearch客户端编写java代码访问es

编写es客户端提供者类,对es连接做简单的封装

SearchClientProvider.java

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 package org.wyf.elasticsearch.search;   /**   * Created by wyf on 16/9/25.   */ import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.wyf.common.property.XmlProperties;   import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.HashMap; import java.util.Iterator; import java.util.Map;   import static java.lang.System.out;   public class SearchClientProvider {      private static final Logger LOGGER = LoggerFactory.getLogger(SearchClientProvider. class );        private TransportClient client = null ;      private volatile boolean inited = false ;        public TransportClient get() {          return this .client;      }        @PreDestroy      public synchronized void close() {          if ( this .client != null ) {              this .client.close();          }      }        @PostConstruct      public synchronized void init() {          if (!inited) {              try {                  Map<String, String> config = XmlProperties.loadFromXml( "properties/elasticsearch.xml" );                  if (config == null ) {                      out.println( "load xml err" );                      return ;                  }                  Iterator<Map.Entry<String, String>> iterator = config.entrySet().iterator();                  Map<String, String> settingConfig = new HashMap<String, String>();                  while (iterator.hasNext()) {                      Map.Entry<String, String> next = iterator.next();                      if (!next.getKey().equals( "transport.addresses" )) {                          settingConfig.put(next.getKey(), next.getValue());                      }                  }                  Settings settings = Settings.builder().put(settingConfig).build();                  TransportClient client = TransportClient.builder().settings(settings).build();                  this .client = client;                    String[] addresses = config.get( "transport.addresses" ).split( "," );                  for (String address : addresses) {                      String[] hostAndPort = address.split( ":" );                      client.addTransportAddress( new InetSocketTransportAddress(InetAddress.getByName(hostAndPort[ 0 ]), Integer.valueOf(hostAndPort[ 1 ])));                    }                  this .inited = true ;              } catch (UnknownHostException e) {                  LOGGER.error(String.format( "init search client err:=>msg:[%s]" , e.getMessage()), e);                  if (client != null ) {                      this .client.close();                  }              }          }      } }

 编写elasticsearch的配置文件加载类

 XmlProperties.java

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 package org.wyf.common.property;   import org.slf4j.LoggerFactory; import org.slf4j.Logger;   import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.*;   public class XmlProperties {      private static final Logger LOGGER = LoggerFactory.getLogger(XmlProperties. class );        private XmlProperties() {      }        public static Map<String, String> loadFromXml(String xmlPropertiesPath) {          try {              Object in = XmlProperties. class .getClassLoader().getResourceAsStream(xmlPropertiesPath);              if (in != null ) {                  LOGGER.info( "Found the xml properties [{}] in class path,use it" , xmlPropertiesPath);                  Map e1 = loadFromXml((InputStream)in);                  return e1;              }              Map<String, String> resMap = null ;                File e = new File(xmlPropertiesPath);              if (!e.isFile()) {                  return resMap;              }                LOGGER.info( "Found the xml properties [{}] in file path,use it" , xmlPropertiesPath);              in = new FileInputStream( new File(xmlPropertiesPath));              resMap = loadFromXml((InputStream)in);              ((InputStream) in).close();              return resMap;          } catch (Exception var7) {              LOGGER.error( "Load xml properties [" + xmlPropertiesPath + "] error." , var7);          }          return null ;      }        public static Map<String, String> loadFromXml(InputStream in) throws IOException {          Properties properties = new Properties();          properties.loadFromXML(in);          HashMap map = new HashMap();          Set entries = properties.entrySet();          Iterator iter = entries.iterator();            while (iter.hasNext()) {              Map.Entry entry = (Map.Entry)iter.next();              map.put((String)entry.getKey(), (String)entry.getValue());          }            return map;      } }

 编写elasticsearch简单的操作类,包含成员函数 save update get 和delete

SearchImpl.java

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 package org.wyf.elasticsearch;   /**   * Created by wyf on 16/9/25.   */ import org.elasticsearch.action.delete.DeleteRequestBuilder; import org.elasticsearch.action.delete.DeleteResponse; import org.elasticsearch.action.get.GetRequestBuilder; import org.elasticsearch.action.get.GetResponse; import org.elasticsearch.action.index.IndexRequestBuilder; import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.index.engine.VersionConflictEngineException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.wyf.elasticsearch.search.SearchClientProvider;   import javax.annotation.PostConstruct; import java.util.Map;   public class SearchImpl implements ISearch {        private static final Logger LOGGER = LoggerFactory.getLogger(SearchImpl. class );        private SearchClientProvider searchClientProvider;      public  SearchImpl() {          searchClientProvider = new SearchClientProvider();          searchClientProvider.init();      }        public Map<String, Object> save(String index, String type, String id, Map<String, Object> data) {          TransportClient client = searchClientProvider.get();          IndexRequestBuilder builder = client.prepareIndex(index, type, id);          IndexResponse response = builder                  .setSource(data)                  .execute()                  .actionGet();          LOGGER.info( "save index:=>index:{}, type:{}, id:{}, data:{}, rsp:{}" , index, type, id, data, response);          return data;      }        public int update(String index, String type, String id, Map<String, Object> data) {          int i = 2 ;          do {              try {                  if (_innerUpdate(index, type, id, data)) return 1 ;              } catch (VersionConflictEngineException e) {                  LOGGER.warn(String.format( "update index:=>index:%s, type:%s, id:%s, data:%s, rsp:%s" ,                          index, type, id, data, e.getMessage()), e);              }          } while ((i--) > 0 );          return _innerUpdate(index, type, id, data) ? 1 : 0 ;      }        public int delete(String index, String type, String id) {          TransportClient client = searchClientProvider.get();          DeleteRequestBuilder builder = client.prepareDelete(index, type, id);          DeleteResponse response = builder.execute().actionGet();          LOGGER.info( "delete index:=>index:{}, type:{}, id:{}, rsp:{}" ,                  index, type, id, response);          return response.isFound() ? 1 : 0 ;      }        public Map<String, Object> get(String index, String type, String id) {          TransportClient client = searchClientProvider.get();          GetRequestBuilder builder = client.prepareGet(index, type, id);          GetResponse response = builder.execute().actionGet();          return response.isExists() ? response.getSource() : null ;      }        private boolean _innerUpdate(String index, String type, String id, Map<String, Object> data) {          TransportClient client = searchClientProvider.get();          GetRequestBuilder getRequestBuilder = client.prepareGet(index, type, id);          GetResponse getResponse = getRequestBuilder.execute().actionGet();          if (getResponse.isExists()) {              final long version = getResponse.getVersion();              final Map<String, Object> source = getResponse.getSource();              source.putAll(data);                IndexRequestBuilder builder = client.prepareIndex(index, type, id);              IndexResponse response = builder                      .setVersion(version)                      .setSource(source)                      .execute()                      .actionGet();              LOGGER.info( "update index:=>index:{}, type:{}, id:{}, data:{}, rsp:{}" ,                      index, type, id, data, response);              return true ;          }          throw new RuntimeException(String.format( "can not get document:=>index:%s, type:%s, id:%s " , index, type, id));      } }

 

编写单元测试类

ElasticSearchTest.java

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 package org.wyf;   import org.junit.Before; import org.junit.Test; import org.wyf.elasticsearch.ISearch; import org.wyf.elasticsearch.SearchImpl;   import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set;   /**   * Created by wyf on 16/9/25.   */ public class ElasticsearchTest {      ISearch search;        @Test      public void get() {          Map<String,Object> map = search.get( "a" , "type1" , "123" );          Set<String> set = map.keySet();          for (Iterator<String> it = set.iterator(); it.hasNext();) {              String key = it.next();              System.out.println(key + ":" + map.get(key));          }      }        @Test      public void save() {          Map<String, Object> values = new HashMap<String, Object>();          values.put( "k1" , "v1" );          values.put( "k2" , "v2" );            Map<String,Object> map = search.save( "a" , "type1" , "123" , values);          Set<String> set = map.keySet();          for (Iterator<String> it = set.iterator(); it.hasNext();) {              String key = it.next();              System.out.println(key + ":" + map.get(key));          }        }        @Before      public void before() {          search = new SearchImpl();      } }

 

elasticsearch的配置文件

?
1 2 3 4 5 6 7 8 <? xml version="1.0" encoding="UTF-8" standalone="no"?> <! DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> < properties >      < comment >elasticsearch的配置</ comment >      < entry key="client.transport.sniff">true</ entry >      < entry key="cluster.name">rainbow</ entry >      < entry key="transport.addresses">127.0.0.1:9300</ entry > </ properties >

 

测试结果:

测试save函数结果

elastic search使用总结 随笔 第7张

 

http接口查询结果页面

elastic search使用总结 随笔 第8张

 

遇到的问题

最开始调试时返回如下错误

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 NoNodeAvailableException[None of the configured nodes are available: [{#transport#- 1 }{ 127.0 . 0.1 }{ 127.0 . 0.1 : 9200 }] ]      at org.elasticsearch.client.transport.TransportClientNodesService.ensureNodesAreAvailable(TransportClientNodesService.java: 290 )      at org.elasticsearch.client.transport.TransportClientNodesService.execute(TransportClientNodesService.java: 207 )      at org.elasticsearch.client.transport.support.TransportProxyClient.execute(TransportProxyClient.java: 55 )      at org.elasticsearch.client.transport.TransportClient.doExecute(TransportClient.java: 283 )      at org.elasticsearch.client.support.AbstractClient.execute(AbstractClient.java: 347 )      at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java: 85 )      at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java: 59 )      at org.wyf.elasticsearch.SearchImpl.save(SearchImpl.java: 36 )      at org.wyf.ElasticsearchTest.save(ElasticsearchTest.java: 35 )      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java: 62 )      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: 43 )      at java.lang.reflect.Method.invoke(Method.java: 498 )      at org.junit.runners.model.FrameworkMethod$ 1 .runReflectiveCall(FrameworkMethod.java: 47 )      at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java: 12 )      at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java: 44 )      at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java: 17 )      at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java: 26 )      at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java: 271 )      at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java: 70 )      at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java: 50 )      at org.junit.runners.ParentRunner$ 3 .run(ParentRunner.java: 238 )      at org.junit.runners.ParentRunner$ 1 .schedule(ParentRunner.java: 63 )      at org.junit.runners.ParentRunner.runChildren(ParentRunner.java: 236 )      at org.junit.runners.ParentRunner.access$ 000 (ParentRunner.java: 53 )      at org.junit.runners.ParentRunner$ 2 .evaluate(ParentRunner.java: 229 )      at org.junit.runners.ParentRunner.run(ParentRunner.java: 309 )      at org.junit.runner.JUnitCore.run(JUnitCore.java: 160 )      at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java: 117 )      at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java: 42 )      at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java: 253 )      at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java: 84 )      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java: 62 )      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: 43 )      at java.lang.reflect.Method.invoke(Method.java: 498 )      at com.intellij.rt.execution.application.AppMain.main(AppMain.java: 147 )

 

解决办法是检查es集群的名称和端口是否正确

由于端口配置错误,导致如上问题

正确的端口是9300,正如最开始说的那样,使用tcp方式访问es时,使用端口9300,使用http方式访问es使用端口9200.

 

代码git地址:

https://github.com/gityf/java_demo/tree/master/demo/src/main/java/org/wyf/elasticsearch

Done.

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄