官网API地址
https://www.elastic.co/guide/en/elasticsearch/client/index.html
具体学习描述
- 所有的elasticsearch操作都是通过 Client对象进行的。
- 操作会存储在client中 然后以批处理的方式执行
-所有相关API 都基于java API
maven依赖
- 需要加入Log4j 2 dependencies
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.7</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.7</version>
</dependency>
- 在classpath路径下添加log4j 2 的配置文件,例如在src/main/resources project 目录下的 log4j2.properties:
appender.console.type = Console
appender.console.name = console
appender.console.layout.type = PatternLayout
rootLogger.level = info
rootLogger.appenderRef.console.ref = console
- 使用SLF4J 需加入以下如下 :
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
<version>2.7</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
我们可以用很多有关SLF4J的实现详细见这个页面,作为例子 ,此处使用slf4j-simple 作为展示
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.21</version>
</dependency>
处理jar包依赖冲突
通过第三方依赖如Guava and Joda 来处理jar包冲突 ;例如 如果es(以后凡是elasticsearch简称es) 使用的是 Joda 2.8 而你的java代码使用的是 Joda 2.1
那么你又两种方式可以解决这个问题
方式一
更新你的代码版本
方式二
重新加载冲突依赖,使其与你的项目或者es及es client其相关插所需版本一致
详细操作方法参见这里
打包成含有依赖的jar包
如果你想讲你的应用打包成含有所有依赖的jar包,不能使用 maven-assembly-plugin 因为他不能处理 META-INF/services目录结构,而应该使用maven-shade-plugin 其配置如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.1</version>
<executions>
<execution>
<phase>package</phase>
<goals><goal>shade</goal></goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
注意:如果你想要把你的应用入口主程序 main.class 加入jar包以便运行,你需要做如下操作:
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>org.elasticsearch.demo.Generate</mainClass>
</transformer>
部署项目在 JBoss EAP6 module.
Elasticsearch 和 Lucene classes 需要部署在同一个 JBoss module
配置module.xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<module name="org.elasticsearch">
<resources>
<!-- Elasticsearch -->
<resource-root path="elasticsearch-2.0.0.jar"/>
<!-- Lucene -->
<resource-root path="lucene-core-5.1.0.jar"/>
<resource-root path="lucene-analyzers-common-5.1.0.jar"/>
<resource-root path="lucene-queries-5.1.0.jar"/>
<resource-root path="lucene-memory-5.1.0.jar"/>
<resource-root path="lucene-highlighter-5.1.0.jar"/>
<resource-root path="lucene-queryparser-5.1.0.jar"/>
<resource-root path="lucene-sandbox-5.1.0.jar"/>
<resource-root path="lucene-suggest-5.1.0.jar"/>
<resource-root path="lucene-misc-5.1.0.jar"/>
<resource-root path="lucene-join-5.1.0.jar"/>
<resource-root path="lucene-grouping-5.1.0.jar"/>
<resource-root path="lucene-spatial-5.1.0.jar"/>
<resource-root path="lucene-expressions-5.1.0.jar"/>
<!-- Insert other resources here -->
</resources>
<dependencies>
<module name="sun.jdk" export="true" >
<imports>
<include path="sun/misc/Unsafe" />
</imports>
</module>
<module name="org.apache.log4j"/>
<module name="org.apache.commons.logging"/>
<module name="javax.api"/>
</dependencies>
</module>
补充:
Lucene是一套用于全文检索和搜寻的开源程式库.
Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库;人们经常提到信息检索程序库,虽然与搜索引擎有关,但不应该将信息检索程序库与搜索引擎相混淆
client
你可以通过多种方式使用 Java client:
- 在一个已有的集群中,执行标准的索引(index)、获取、删除、搜索操作
- 在一个运行中的集群,执行管理任务
最简单的获取client的方式
通过与集群相连的TransportClient
注意:client 的主程序版本必须和集群中的节点一致,如果有些微的不同会导致某些新增功能无法使用. Clients 应该和cluster的版本一致.
Transport Client
TransportClient 使用 the transport 模块与Elasticsearch cluster 远程连接.它并没有加入集群中,而仅仅是获取一个或多个传输地址并且以round robin fashion(原谅我暂时无法翻译!!!)在每个操作上通信 (though most actions will probably be "two hop" operations).
// on startup
TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host1"), 9300))
.addTransportAddress(new InetSocketTransportAddress(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...
所谓的鼻息特征: sniffing feature
Transport client 可以动态添加新的或删除旧的主机
原理说明
1,在sniffing 被启用时 transport client会连接它内部通过调用 addTransportAddress 建立的节点列表. 此后, transport client会调用这些节点的内部集群状态API 去发现可用的数据节点. 这个client的内部节点列表将仅仅被这些数据节点替代.
2,这个数据列表默认每5秒刷新一次
3,sniffer所连接的ip地址都是在es的配置中定义声明的
4,这个列表可能不会包含它所连接的初始节点,如果改初始节点不是数据节点
例如:如果你初始化连接了一个主机节点,在sniffing之后,不会请求访问这个主机节点,而是请求访问其他任意的数据节点,因为排除非数据节点可以避免非数据主节点的搜索阻塞
启用sniffing: set client.transport.sniff 为 true
Settings settings = Settings.settingsBuilder()
.put("client.transport.sniff", true).build();
TransportClient client = new PreBuiltTransportClient(settings);
其他 transport client 参数设置说明:
client.transport.ignore_cluster_name
设为true 时将忽略对连接的节点集群名称的有效性验证(since 0.19.4)
client.transport.ping_timeout
等待ping一个节点的操作响应时间;默认5s.
client.transport.nodes_sampler_interval
sample / ping节点列表和连接的节点的频率. 默认5s.
** coordinating node **
如果一个节点没有主节点的功能,不能持有数据,也不能预处理文件,那么这个节点就是一个 coordinating node ,它只能发送请求,处理减少搜索时间,分配批处理索引.最重要的是可以作为 协调节点的智能负载平衡器。
Coordinating only nodes在大集群的时候是非常有用的,可以通过从数据节点和主节点上将转移负担到 协调节点. 协调节点加入集群并像其他节点一样,接受完整的集群状态信息,并利用这些信息去匹配寻找最佳请求路径
过多的Coordinating only nodes会增加集群的负担
Connecting a Client to a Coordinating Only Node
在应用里创建一个连接到 Coordinating Only Node的TransportClient
你就可以加载任何你需要的插件.例如 搜索插件