Vient de télécharger et d'installer elasticsearch 1.3.2 il y a une heure
Tables IP ouvertes pour le port 9200 et 9300: 9400
Définir le nom de mon ordinateur et mon adresse IP dans/etc/hosts
Head Module et Paramédic installés et fonctionnant sans à-coups
boucle sur localhost fonctionne parfaitement
copié tous les fichiers jar du téléchargement dans Eclipse afin que le même client version
- Java -
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.ImmutableSettings;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.index.query.QueryBuilders;
public class Test{
public static void main(String[] args) {
Settings settings = ImmutableSettings.settingsBuilder().put("cluster.name", "elastictest").build();
TransportClient transportClient = new TransportClient(settings);
Client client = transportClient.addTransportAddress(new InetSocketTransportAddress("143.79.236.xxx",9300));//just masking ip with xxx for SO Question
try{
SearchResponse response = client.prepareSearch().setQuery(QueryBuilders.matchQuery("url", "Twitter")).setSize(5).execute().actionGet();//bunch of urls indexed
String output = response.toString();
System.out.println(output);
}catch(Exception e){
e.printStackTrace();
}
client.close();
}
}
- Sortie -
log4j:WARN No appenders could be found for logger (org.elasticsearch.plugins).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.Apache.org/log4j/1.2/faq.html#noconfig for more info.
org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available: []
at org.elasticsearch.client.transport.TransportClientNodesService.ensureNodesAreAvailable(TransportClientNodesService.Java:298)
at org.elasticsearch.client.transport.TransportClientNodesService.execute(TransportClientNodesService.Java:214)
at org.elasticsearch.client.transport.support.InternalTransportClient.execute(InternalTransportClient.Java:105)
at org.elasticsearch.client.support.AbstractClient.search(AbstractClient.Java:330)
at org.elasticsearch.client.transport.TransportClient.search(TransportClient.Java:421)
at org.elasticsearch.action.search.SearchRequestBuilder.doExecute(SearchRequestBuilder.Java:1097)
at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.Java:91)
at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.Java:65)
at Test.main(Test.Java:20)
Mise à jour: maintenant je suis vraiment confus. Je viens d'appuyer 3 fois sur Eclipse. 2 fois reçu l'erreur ci-dessus. 1 fois la recherche a fonctionné! ?? Centos 6.5 vps neuf, jdk neuf installé. Ensuite, elasticsearch installé, n'ont rien fait d'autre pour boxer.
Mise à jour: après avoir exécuté la console ./bin/elasticsearch
[2014-09-18 08:56:13,694][INFO ][node ] [Acrobat] version[1.3.2], pid[2978], build[dee175d/2014-08-13T14:29:30Z]
[2014-09-18 08:56:13,695][INFO ][node ] [Acrobat] initializing ...
[2014-09-18 08:56:13,703][INFO ][plugins ] [Acrobat] loaded [], sites [head, paramedic]
[2014-09-18 08:56:15,941][WARN ][common.network ] failed to resolve local Host, fallback to loopback
Java.net.UnknownHostException: elasticsearchtest: elasticsearchtest: Name or service not known
at Java.net.InetAddress.getLocalHost(InetAddress.Java:1473)
at org.elasticsearch.common.network.NetworkUtils.<clinit>(NetworkUtils.Java:54)
at org.elasticsearch.transport.netty.NettyTransport.<init>(NettyTransport.Java:204)
at Sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at Sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.Java:57)
at Sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.Java:45)
at Java.lang.reflect.Constructor.newInstance(Constructor.Java:526)
at org.elasticsearch.common.inject.DefaultConstructionProxyFactory$1.newInstance(DefaultConstructionProxyFactory.Java:54)
at org.elasticsearch.common.inject.ConstructorInjector.construct(ConstructorInjector.Java:86)
at org.elasticsearch.common.inject.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.Java:98)
at org.elasticsearch.common.inject.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.Java:45)
at org.elasticsearch.common.inject.InjectorImpl.callInContext(InjectorImpl.Java:837)
at org.elasticsearch.common.inject.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.Java:42)
at org.elasticsearch.common.inject.Scopes$1$1.get(Scopes.Java:57)
at org.elasticsearch.common.inject.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.Java:45)
at org.elasticsearch.common.inject.FactoryProxy.get(FactoryProxy.Java:52)
at org.elasticsearch.common.inject.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.Java:45)
at org.elasticsearch.common.inject.InjectorImpl.callInContext(InjectorImpl.Java:837)
at org.elasticsearch.common.inject.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.Java:42)
at org.elasticsearch.common.inject.Scopes$1$1.get(Scopes.Java:57)
at org.elasticsearch.common.inject.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.Java:45)
at org.elasticsearch.common.inject.SingleParameterInjector.inject(SingleParameterInjector.Java:42)
at org.elasticsearch.common.inject.SingleParameterInjector.getAll(SingleParameterInjector.Java:66)
at org.elasticsearch.common.inject.ConstructorInjector.construct(ConstructorInjector.Java:85)
at org.elasticsearch.common.inject.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.Java:98)
at org.elasticsearch.common.inject.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.Java:45)
at org.elasticsearch.common.inject.InjectorImpl.callInContext(InjectorImpl.Java:837)
at org.elasticsearch.common.inject.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.Java:42)
at org.elasticsearch.common.inject.Scopes$1$1.get(Scopes.Java:57)
at org.elasticsearch.common.inject.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.Java:45)
at org.elasticsearch.common.inject.SingleParameterInjector.inject(SingleParameterInjector.Java:42)
at org.elasticsearch.common.inject.SingleParameterInjector.getAll(SingleParameterInjector.Java:66)
at org.elasticsearch.common.inject.ConstructorInjector.construct(ConstructorInjector.Java:85)
at org.elasticsearch.common.inject.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.Java:98)
at org.elasticsearch.common.inject.FactoryProxy.get(FactoryProxy.Java:52)
at org.elasticsearch.common.inject.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.Java:45)
at org.elasticsearch.common.inject.InjectorImpl.callInContext(InjectorImpl.Java:837)
at org.elasticsearch.common.inject.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.Java:42)
at org.elasticsearch.common.inject.Scopes$1$1.get(Scopes.Java:57)
at org.elasticsearch.common.inject.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.Java:45)
at org.elasticsearch.common.inject.SingleParameterInjector.inject(SingleParameterInjector.Java:42)
at org.elasticsearch.common.inject.SingleParameterInjector.getAll(SingleParameterInjector.Java:66)
at org.elasticsearch.common.inject.ConstructorInjector.construct(ConstructorInjector.Java:85)
at org.elasticsearch.common.inject.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.Java:98)
at org.elasticsearch.common.inject.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.Java:45)
at org.elasticsearch.common.inject.InjectorImpl.callInContext(InjectorImpl.Java:837)
at org.elasticsearch.common.inject.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.Java:42)
at org.elasticsearch.common.inject.Scopes$1$1.get(Scopes.Java:57)
at org.elasticsearch.common.inject.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.Java:45)
at org.elasticsearch.common.inject.InjectorBuilder$1.call(InjectorBuilder.Java:200)
at org.elasticsearch.common.inject.InjectorBuilder$1.call(InjectorBuilder.Java:193)
at org.elasticsearch.common.inject.InjectorImpl.callInContext(InjectorImpl.Java:830)
at org.elasticsearch.common.inject.InjectorBuilder.loadEagerSingletons(InjectorBuilder.Java:193)
at org.elasticsearch.common.inject.InjectorBuilder.injectDynamically(InjectorBuilder.Java:175)
at org.elasticsearch.common.inject.InjectorBuilder.build(InjectorBuilder.Java:110)
at org.elasticsearch.common.inject.Guice.createInjector(Guice.Java:93)
at org.elasticsearch.common.inject.Guice.createInjector(Guice.Java:70)
at org.elasticsearch.common.inject.ModulesBuilder.createInjector(ModulesBuilder.Java:59)
at org.elasticsearch.node.internal.InternalNode.<init>(InternalNode.Java:192)
at org.elasticsearch.node.NodeBuilder.build(NodeBuilder.Java:159)
at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.Java:70)
at org.elasticsearch.bootstrap.Bootstrap.main(Bootstrap.Java:203)
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.Java:32)
Caused by: Java.net.UnknownHostException: elasticsearchtest: Name or service not known
at Java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
at Java.net.InetAddress$1.lookupAllHostAddr(InetAddress.Java:901)
at Java.net.InetAddress.getAddressesFromNameService(InetAddress.Java:1293)
at Java.net.InetAddress.getLocalHost(InetAddress.Java:1469)
... 62 more
[2014-09-18 08:56:16,937][INFO ][node ] [Acrobat] initialized
[2014-09-18 08:56:16,937][INFO ][node ] [Acrobat] starting ...
[2014-09-18 08:56:17,110][INFO ][transport ] [Acrobat] bound_address {inet[/0:0:0:0:0:0:0:0:9300]}, publish_address {inet[/143.79.236.31:9300]}
[2014-09-18 08:56:17,126][INFO ][discovery ] [Acrobat] elastictest/QvSNFajjQ9SFjU7WOdjaLw
[2014-09-18 08:56:20,145][INFO ][cluster.service ] [Acrobat] new_master [Acrobat][QvSNFajjQ9SFjU7WOdjaLw][localhost][inet[/143.79.236.31:9300]], reason: zen-disco-join (elected_as_master)
[2014-09-18 08:56:20,212][INFO ][http ] [Acrobat] bound_address {inet[/0:0:0:0:0:0:0:0:9200]}, publish_address {inet[/143.79.236.31:9200]}
[2014-09-18 08:56:20,214][INFO ][node ] [Acrobat] started
- configuration du cluster dans elasticsearch.yml -
################################### Cluster ###################################
# Cluster name identifies your cluster for auto-discovery. If you're running
# multiple clusters on the same network, make sure you're using unique names.
#
cluster.name: elastictest
Les paramètres Elasticsearch sont dans $ES_HOME/config/elasticsearch.yml
. Là, si le paramètre cluster.name
est commenté, cela signifie que ES prendrait à peu près n'importe quel nom de cluster. Donc, dans votre code, le cluster.name
en tant que "elastictest"
pourrait être le problème. Essaye ça:
Client client = new TransportClient()
.addTransportAddress(new InetSocketTransportAddress(
"143.79.236.xxx",
9300));
9300
, pas 9200
$ES_HOME/config/elasticsearch.yml
client.transport.sniff
sur true
mais ne pouvez pas vous connecter à tous les nœuds du cluster ES, ce qui entraînera également ce problème. ES doc here expliqué pourquoi.Vous devriez vérifier le port du noeud, vous pouvez le faire en utilisant head. Ces ports ne sont pas les mêmes. Exemple,
L'URL Web que vous pouvez ouvrir est localhost:9200
, mais le port du nœud est 9300
. Par conséquent, aucun des nœuds configurés n'est disponible si vous utilisez 9200
comme port.
Face à un problème similaire, et voici la solution
Exemple :
Dans elasticsearch.yml, ajoutez les propriétés ci-dessous
cluster.name: production
node.name: node1
network.bind_Host: 10.0.1.22
network.Host: 0.0.0.0
transport.tcp.port: 9300
Ajoutez les éléments suivants dans Java API Elastic pour Bulk Push (juste un extrait de code). Pour l'adresse IP, ajoutez l'adresse IP publique du moteur de recherche élastique
Client client;
BulkRequestBuilder requestBuilder;
try {
client = TransportClient.builder().settings(Settings.builder().put("cluster.name", "production").put("node.name","node1")).build().addTransportAddress(
new InetSocketTransportAddress(InetAddress.getByName(""), 9300));
requestBuilder = (client).prepareBulk();
}
catch (Exception e) {
}
Ouvrez les ports du pare-feu pour 9200,9300
NoNodeAvailableException[None of the configured nodes are available: [{#transport#-1}{UfB9geJCR--spyD7ewmoXQ}{192.168.1.245}{192.168.1.245:9300}]]
Dans mon cas, c'était la différence entre les versions. Si vous consultez les journaux dans le cluster elasticsearch, vous verrez s'afficher.
Journaux Elasticsearch
[node1] exception caught on transport layer [NettyTcpChannel{localAddress=/192.168.1.245:9300, remoteAddress=/172.16.1.47:65130}], closing connection
Java.lang.IllegalStateException: Received message from unsupported version: [5.0.0] minimal compatible version is: [5.6.0]
J'utilisais le client elasticsearch et la version de transport 5.1.1. Et ma version du cluster elasticsearch était dans la version 6. Je change donc la version de ma bibliothèque en 5.4.3.
Si les conseils ci-dessus ne fonctionnent pas, modifiez le niveau de journalisation de la configuration de votre structure de journalisation (log4j, logback ...) en INFO. Puis revérifiez la sortie.
L'enregistreur peut cacher des messages tels que:
INFO org.elasticsearch.client.transport.TransportClientNodesService - failed to get node info for...
Caused by: ElasticsearchSecurityException: missing authentication token for action...
(Dans l'exemple ci-dessus, il y avait un plugin X-Pack dans ElasticSearch qui nécessite une authentification)
Pour terminer, voici l'extrait qui crée le client de transport en utilisant la méthode statique appropriée fournie par InetSocketTransportAddress
:
Client esClient = TransportClient.builder()
.settings(settings)
.build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("143.79.236.xxx"), 9300));
Pour les autres utilisateurs rencontrant ce problème.
Vous pouvez obtenir cette erreur si vous exécutez un ElasticSearch plus récent (5.5 ou version ultérieure) lors de l’exécution de la version Spring Boot <2.
La recommandation est d'utiliser le client REST, car le client Java sera obsolète.
Une autre solution consiste à effectuer une mise à niveau vers Spring Boot 2, étant donné que cela devrait être compatible.
Voir https://discuss.elastic.co/t/spring-data-elasticsearch-cant-connect-connect-with-elasticsearch-5-5-0/94235 pour plus d'informations.
Je passe des jours ensemble à résoudre ce problème. Je sais qu'il est tard, mais cela pourrait être utile:
J'ai résolu ce problème en modifiant la version compatible/stable de:
Spring boot: 2.1.1
Spring Data Elastic: 2.1.4
Elastic: 6.4.0 (default)
Maven:
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>2.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
</dependency>
Vous n'avez pas besoin de mentionner la version Elastic. Par défaut, c'est 6.4.0. Mais si vous voulez ajouter une version spécifique. Utilisez l'extrait de code de propriété ci-dessous et utilisez la version compatible de Spring Boot et Spring Data (si nécessaire).
<properties>
<elasticsearch.version>6.8.0</elasticsearch.version>
</properties>
De plus, j'ai utilisé le client Rest High Level dans ElasticConfiguration:
@Value("${elasticsearch.Host}")
public String Host;
@Value("${elasticsearch.port}")
public int port;
@Bean(destroyMethod = "close")
public RestHighLevelClient restClient1() {
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
RestClientBuilder builder = RestClient.builder(new HttpHost(Host, port));
RestHighLevelClient client = new RestHighLevelClient(builder);
return client;
}
}
Remarque importante: Elastic utilise le port 9300 pour communiquer entre les nœuds et 9200 en tant que client HTTP. Dans les propriétés d'application:
elasticsearch.Host=10.40.43.111
elasticsearch.port=9200
spring.data.elasticsearch.cluster-nodes=10.40.43.111:9300 (customized Elastic server)
spring.data.elasticsearch.cluster-name=any-cluster-name (customized cluster name)
Depuis Postman, vous pouvez utiliser: http://10.40.43.111:9200/ [indexname]/_search
Bonne codage :)
Comme la plupart des réponses semblent obsolètes, voici le réglage qui a fonctionné pour moi:
elasticsearch.yml:
cluster.name: production
node.name: node1
network.Host: 0.0.0.0
transport.tcp.port: 9300
cluster.initial_master_nodes: node1
Installer:
client = new PreBuiltTransportClient(Settings.builder().put("cluster.name", "production").build());
client.addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9300));
Puisque PreBuiltTransportClient est obsolète, vous devez utiliser RestHighLevelClient pour Elasticsearch-Version 7.3.0: https://artifacts.elastic.co/javadoc/org/elasticsearch/client/elasticsearch-rest-high-level-level-level-lient-client/7.3. 0/index.html
Vérifiez votre propriété elasticsearch.yml. La propriété "transport.Host" doit être "0.0.0.0" et non "127.0.0.1" ou "localhost".
Celui-ci a fonctionné pour moi dans ES 1.7.5:
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.ImmutableSettings;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.xcontent.XContentBuilder;
public static void main(String[] args) throws IOException {
Settings settings = ImmutableSettings.settingsBuilder()
.put("client.transport.sniff",true)
.put("cluster.name","elasticcluster").build();
Client client = new TransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress("[ipaddress]",9300));
XContentBuilder builder = null;
try {
builder = jsonBuilder().startObject().field("user", "testdata").field("postdata",new Date()).field("message","testmessage")
.endObject();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(builder.string());
IndexResponse response = client.prepareIndex("Twitter","Tweet","1").setSource(builder).execute().actionGet();
client.close();
}
Cela signifie que nous ne sommes pas en mesure d'instancier ES transportClient et de lever cette exception. Il existe plusieurs possibilités qui causent ce problème.
ES_HOME_DIR/config/elasticserach.yml
et vérifiez la valeur du nom du cluster OR utilisez cette commande: curl -XGET 'http://localhost:9200/_nodes'
Problème d'authentification: définissez l'en-tête dans le contexte de transportClient pour l'authentification:
client.threadPool().getThreadContext()
.putHeader("Authorization", "Basic " + encodeBase64String(basicHeader.getBytes()));
Si vous êtes toujours confronté à ce problème, ajoutez la propriété suivante:
put("client.transport.ignore_cluster_name", true)
Le code de base ci-dessous fonctionne bien pour moi:
Settings settings = Settings.builder()
.put("cluster.name", "my-application").put("client.transport.sniff", true).put("client.transport.ignore_cluster_name", false).build();
TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
Si vous utilisez Java client de transport 1.check 9300 est accessible/ouvert. 2.cochez le nom du nœud et du cluster, cela devrait être correct, vous pouvez vérifier le nom du nœud et du cluster par type ip: port dans votre navigateur. 3.Vérifiez les versions de votre jar et de la version installée de Es.