今天寫了一段ES的測試代碼,以下:java
package elasticSearch; import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.elasticsearch.action.index.IndexRequestBuilder; import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.Client; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import entity.Person; import util.JsonUtils; public class ESTest { private Client client; public ESTest() { this("localhost"); } public ESTest(String ip) { Settings settings = Settings.settingsBuilder().put("cluster.name", "huiTest") .build(); client = TransportClient.builder().settings(settings).build(); client = ((TransportClient) client).addTransportAddress( new InetSocketTransportAddress(new InetSocketAddress(ip, 9300))); } public IndexResponse createIndex(String indexName, String type, List<String> jsonArray) { IndexRequestBuilder builder = client.prepareIndex(indexName, type); for (String jsonTemp : jsonArray) { System.out.println(jsonTemp); builder = builder.setSource(jsonTemp); } IndexResponse response = builder.execute().actionGet(); return response; } public List<Person> search(QueryBuilder queryBuilder, String indexName, String type) { List<Person> persons = new ArrayList<>(); SearchResponse sResponse = client.prepareSearch(indexName).setTypes(type) .setQuery(queryBuilder).execute().actionGet(); SearchHits hits = sResponse.getHits(); System.out.println(hits.getTotalHits()); Double salary = 0.0; SearchHit[] hitArray = hits.hits(); for (SearchHit hit : hitArray) { Map<String, Object> map = hit.getSource(); Integer age = (Integer) map.get("age"); String name = (String) map.get("name"); Object salaryO = map.get("salary"); if (salaryO instanceof Integer) { salary = (Integer) salaryO * 1.0; } else { salary = (Double) salaryO; } Person p = new Person(name, age, salary); persons.add(p); } return persons; } public static void main(String[] args) { ESTest esTest = new ESTest(); List<Person> persons = JsonUtils.getData(10); List<String> jsonArray = JsonUtils.covertList2String(persons); String indexName = "liuhui'sindex";// 要小寫 String type = "liuhui'sType"; esTest.createIndex(indexName, type, jsonArray); // QueryBuilder builder = QueryBuilders.matchAllQuery(); // QueryBuilder builder = QueryBuilders.termQuery("name", "hui10"); QueryBuilder builder = QueryBuilders.termQuery("age", "20"); List<Person> list = esTest.search(builder, indexName, type); System.out.println(list); } }
運行時報錯以下:node
Exception in thread "main" NoNodeAvailableException[None of the configured nodes are available: [{#transport#-1}{127.0.0.1}{localhost/127.0.0.1:9300}]] 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:288) at org.elasticsearch.client.support.AbstractClient.execute(AbstractClient.java:359) at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:86) at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:56) at elasticSearch.ESTest.search( ESTest.java:60) at elasticSearch.ESTest.main( ESTest.java:99)
形成這一異常的緣由,僅我所知的,有如下幾個:json
運行該客戶端時 elasticsearch.bat未啓動;elasticsearch
cluster.name:huiTest未在ES的安裝目錄config下的elasticsearch.yml中配置,即若是代碼裏使用了put("cluster.name","huiTest"),則必定要在elasticsearch.yml中添加一行配置:cluster.name:huiTest,由於cluster.name默認是elasticsearch。固然也能夠不使用put("cluster.name","huiTest"),或者使用put("cluster.name","elasticsearch");這裏要注意若是修改了elasticsearch.yml文件,必定要重啓elasticsearch.bat;測試
客戶端端口不是用的9300,而是9200.9200是爲http協議準備的,9300纔是客戶端使用的;ui
以上3條逐個排查,多半問題就解決了;this