问题
I am running ElasticSearch
on Docker
which is available locally as
$ 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"
}
I am using Elastic4s, for connecting to ElasticSearch
, I tried following approach, but all of them gave me error as
val client = ElasticClient.remote(host = "192.168.99.100", port = 9200)
and
val settings = ImmutableSettings.settingsBuilder().put("cluster.name", "elasticsearch").build()
val uri = ElasticsearchClientUri("elasticsearch://192.168.99.100:9200")
val client = ElasticClient.remote(uri)
The error is
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)
My complete code is
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)
}
}
回答1:
9200 is the port for connecting via HTTP, which is why it works from your browser. If you check you the top of your stack trace, you can see in your case that you're connecting via the Transport client (i.e. TCP) so you need to use the port 9300 instead. Try this:
val uri = ElasticsearchClientUri("elasticsearch://192.168.99.100:9300")
val client = ElasticClient.remote(uri)
回答2:
Make sure client version is same as ElasticSearch server.
回答3:
Try adding settigs with HTTP enabled
Just set host:
val host = "YOUR HOST NAME"
and then:
val settings = ImmutableSettings.settingsBuilder()
.put("http.enabled", true).put("cluster.name", "CLUSTER-NAME").build()
val uri = ElasticsearchClientUri(s"${host}:9200")
val esClient = ElasticClient
.remote(settings, uri)
It should work with port 9200 now
来源:https://stackoverflow.com/questions/32277401/org-elasticsearch-client-transport-nonodeavailableexception-none-of-the-configu