我正在ElasticSearch上Docker它可为本地
ElasticSearch
Docker
$ curl http://192.168.99.100:9200/?pretty { "status" : 200, "name" : "Collector", "cluster_name" : "elasticsearch", "version" : { "number" : "1.4.4", "build_hash" : "c88f77ffc81301dfa9dfd81ca2232f09588bd512", "build_timestamp" : "2015-02-19T13:05:36Z", "build_snapshot" : false, "lucene_version" : "4.10.3" }, "tagline" : "You Know, for Search" }
我正在使用Elastic4s进行连接ElasticSearch,尝试了以下方法,但是所有这些都给了我错误
val client = ElasticClient.remote(host = "192.168.99.100", port = 9200)
和
val settings = ImmutableSettings.settingsBuilder().put("cluster.name", "elasticsearch").build() val uri = ElasticsearchClientUri("elasticsearch://192.168.99.100:9200") val client = ElasticClient.remote(uri)
错误是
Exception in thread "main" org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available: [] at org.elasticsearch.client.transport.TransportClientNodesService.ensureNodesAreAvailable(TransportClientNodesService.java:305) at org.elasticsearch.client.transport.TransportClientNodesService.execute(TransportClientNodesService.java:200) at org.elasticsearch.client.transport.support.InternalTransportClient.execute(InternalTransportClient.java:106) at org.elasticsearch.client.support.AbstractClient.index(AbstractClient.java:102) at org.elasticsearch.client.transport.TransportClient.index(TransportClient.java:340) at com.sksamuel.elastic4s.IndexDsl$IndexDefinitionExecutable$$anonfun$apply$1.apply(IndexDsl.scala:23) at com.sksamuel.elastic4s.IndexDsl$IndexDefinitionExecutable$$anonfun$apply$1.apply(IndexDsl.scala:23) at com.sksamuel.elastic4s.Executable$class.injectFuture(Executable.scala:21) at com.sksamuel.elastic4s.IndexDsl$IndexDefinitionExecutable$.injectFuture(IndexDsl.scala:20) at com.sksamuel.elastic4s.IndexDsl$IndexDefinitionExecutable$.apply(IndexDsl.scala:23) at com.sksamuel.elastic4s.IndexDsl$IndexDefinitionExecutable$.apply(IndexDsl.scala:20) at com.sksamuel.elastic4s.ElasticClient.execute(ElasticClient.scala:28) at com.enterpriseconnector.persistence.Elastic$.insert(Elastic.scala:17) at com.enterpriseconnector.persistence.Test$$anonfun$1.apply(Elastic.scala:27) at com.enterpriseconnector.persistence.Test$$anonfun$1.apply(Elastic.scala:24) at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245) at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245) at scala.collection.immutable.Range.foreach(Range.scala:166) at scala.collection.TraversableLike$class.map(TraversableLike.scala:245) at scala.collection.AbstractTraversable.map(Traversable.scala:104) at com.enterpriseconnector.persistence.Test$.delayedEndpoint$com$enterpriseconnector$persistence$Test$1(Elastic.scala:24) at com.enterpriseconnector.persistence.Test$delayedInit$body.apply(Elastic.scala:23) at scala.Function0$class.apply$mcV$sp(Function0.scala:34) at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12) at scala.App$$anonfun$main$1.apply(App.scala:76) at scala.App$$anonfun$main$1.apply(App.scala:76) at scala.collection.immutable.List.foreach(List.scala:381) at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35) at scala.App$class.main(App.scala:76) at com.enterpriseconnector.persistence.Test$.main(Elastic.scala:23) at com.enterpriseconnector.persistence.Test.main(Elastic.scala) 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:497) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
我完整的代码是
import java.util.Calendar import com.sksamuel.elastic4s.{ElasticsearchClientUri, ElasticClient} import com.sksamuel.elastic4s.ElasticDsl._ import com.sksamuel.elastic4s.source.StringDocumentSource import org.elasticsearch.common.settings.ImmutableSettings object Elastic { println("Creating Elastic Connection") val settings = ImmutableSettings.settingsBuilder().put("cluster.name", "elasticsearch").build() val uri = ElasticsearchClientUri("elasticsearch://192.168.99.100:9200") val client = ElasticClient.remote(uri) def insert(monitorJson: String) = { client execute { index into "test" -> "elastic4s" doc StringDocumentSource(monitorJson) } } } object Test extends App { for (_ <- 1 to 100) yield { val json: String = s"{time: ${Calendar.getInstance().getTime()}}" println(s"inserting ${json}") Elastic.insert(json) } }
9200是用于通过HTTP连接的端口,这就是为什么它可以在您的浏览器中工作的原因。如果检查堆栈跟踪的顶部,则可以看到通过传输客户端(即TCP)进行连接,因此需要使用端口9300。试试这个:
val uri = ElasticsearchClientUri("elasticsearch://192.168.99.100:9300") val client = ElasticClient.remote(uri)