Elasticsearch java api 概述

官网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
你就可以加载任何你需要的插件.例如 搜索插件

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容