TransportClient使用传输模块远程连接到一个弹性搜索集群。它不加入集群,但只获得一个或多个初始传输ip地址,并在每个动作上与它们进行轮询(尽管大多数操作可能是"two hop" 操作)。
// on startup TransportClient client = new PreBuiltTransportClient(Settings.EMPTY) .addTransportAddress(new TransportAddress(InetAddress.getByName("host1"), 9300)) .addTransportAddress(new TransportAddress(InetAddress.getByName("host2"), 9300)); // on shutdown client.close();
请注意,如果使用与“elasticsearch”不同的名称,则必须重新设置集群名称。
Settings settings = Settings.builder() .put("cluster.name", "myClusterName").build(); TransportClient client = new PreBuiltTransportClient(settings); //Add transport addresses and do something with the client...
TransportClient附带一个集群嗅探特性,该特性允许它动态地添加新主机并删除旧主机。在启用嗅嗅时,TransportClient将连接到其内部节点列表中的节点,该列表是通过调用addTransportAddress构建的。在此之后,TransportClient将调用这些节点上的内部集群状态API来发现可用的数据节点。客户机的内部节点列表将仅用这些数据节点替换。默认情况下,此列表每隔5秒刷新一次。注意,嗅探器连接的IP地址是在这些节点的搜索配置中声明为发布地址的。
请记住,如果该node不是一个数据节点,该列表可能不包括它连接到的原始节点。例如,如果您最初连接到一个主节点,在嗅探之后,没有进一步的请求将进入主节点,而是指向任何数据节点。TransportClient不包含非数据节点的原因是为了避免将搜索流量发送到只掌握节点。
为了启用嗅探,设置client.transport.sniff
为true
:
Settings settings = Settings.builder() .put("client.transport.sniff", true).build(); TransportClient client = new PreBuiltTransportClient(settings);
其他transport client级别设置包括:
client.transport.ignore_cluster_name | Set to (since 0.19.4) |
client.transport.ping_timeout | The time to wait for a ping response from a node. Defaults to |
client.transport.nodes_sampler_interval | The time to wait for a ping response from a node. Defaults to 5s . |
附上我这两天写的连接代码:
public class SearchEsUtils implements SearchEsUtilsInterface { TransportClient transportClient; //索引库名 String index = "ori_epotential_2018"; //类型名称 String type = "ori_epotential"; //集群名称 String es_cluster = "es_cluster"; //集群连接IP地址 String es_ip = "192.168.0.14"; //集群连接端口号 Integer es_port = 9300; public SearchEsUtils() { try { init(); } catch (IOException e) { e.printStackTrace(); } } /** * @throws IOException * 初始化ES客户端连接 */ public void init() throws IOException{ /** * 1:通过 setting对象来指定集群配置信息 */ Settings setting = Settings.builder() .put("cluster.name", es_cluster)//指定集群名称 .put("client.transport.sniff", true)//启动嗅探功能 .build(); /** * 2:创建客户端 * 通过setting来创建,若不指定则默认链接的集群名为elasticsearch * 链接使用TCP协议即9300 */ transportClient = new PreBuiltTransportClient(setting) .addTransportAddress(new TransportAddress(InetAddress.getByName(es_ip), es_port)); /** * 3:查看集群信息 * 注意我的集群结构是: * 131的elasticsearch.yml中指定为主节点不能存储数据, * 128的elasticsearch.yml中指定不为主节点只能存储数据。 * 所有控制台只打印了192.168.79.128,只能获取数据节点 * */ List<DiscoveryNode> connectedNodes = transportClient.connectedNodes(); for(DiscoveryNode node : connectedNodes) { System.out.println(node.getHostAddress()); } } }