您的位置:首页 > Web前端 > HTML5

elastic search5.6.3学习笔记(一)

2020-02-18 10:03 519 查看

第一次写博客,有什么问问还请多多指教
参考:(2017-11-07)
https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-api.html

一、前言
该文档为es的java API,所有操作本质上都是完全异步执行,在客户端的操作可以被累计并且批量执行。
5.6.0版本被设计于用来在java应用中代替TransportClient,TransportClient将会在将来的版本中被弃用。
二、安装部署
es5.6.3包直接去官网下载
安装head插件参考:http://www.cnblogs.com/hunttown/p/6723286.html
pom:
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.6.3</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.6.3</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.24</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.21</version>
</dependency>
三、安装过程遇到的问题
1.org.elasticsearch.plugins.NetworkPlugin: elastic search版本低 尽量让transport和其版本一致
2.java.lang.IllegalStateException: Message not fully read (request) for requestId [1], action [], readerIndex [21] vs expected [45]; resetting和
java.io.IOException: Invalid string; unexpected character: 180 hex: b4 :如果出现类似这种,一般是客户端版本和依赖包版本不一致造成的
3.参考http://www.cnblogs.com/softidea/p/6080086.html
四、Transport Client

1.初始化client:
//TransportClient不加入到集群中,而只是得到一个或多个传输地址并且在每次访问的时候循环的进行交互
TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host1"), 9300))
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host2"), 9300));
client.close();

2.如果你用了一个不同于elastic search的集群名字,那你就得设置一下:
Settings settings = Settings.builder().put("cluster.name", "myClusterName").build();
TransportClient client = new PreBuiltTransportClient(settings);
//Add transport addresses and do something with the client...

3.传输客户端自带一个集群嗅探特性,可以动态地添加新主机并删除旧主机,当启用这个特性时,传输客户端将连接到其内部节点列表中的节点(即通过1中
addTransportAddress添加的节点),此后,客户端将调用这些节点上的内部集群API来发现可用的数据节点。客户端的内部节点列表将仅被这些数据节点替换。默认情况下,该列表5秒钟刷新一次。请注意,嗅探器连接的IP地址是在节点的es的配置文件中声明的作为发布的地址。
如果该节点不是一个数据节点,列表可能不包括它连接到的原始节点。例如,如果您最初连接到一个主节点,在嗅探之后,不会再有请求访问该主节点,而是访问其他只要有数据的节点。传输客户端不包含非数据节点的原因是为了避免将搜索流量发送到主节点。
嗅探器开启方式:
Settings settings = Settings.builder() .put("client.transport.sniff", true).build();
TransportClient client = new PreBuiltTransportClient(settings);

其他transport client的设置包括:
client.transport.ignore_cluster_name :设置为true 可以忽略节点连接时对集群名字的校验
client.transport.ping_timeout :设置一个节点在得到response时的等待时间,默认5秒
client.transport.nodes_sampler_interval:多久进行获取/ping 列出的节点并且连接,默认5秒
五、Index API
Index API允许将一个json类型的文档索引到一个特定的索引中并且使其可以被搜索到
1.Use Elasticsearch helpers
这里json化我们用es提供的内置助手:
import static org.elasticsearch.common.xcontent.XContentFactory.*;
XContentBuilder builder = jsonBuilder().startObject().field("user", "kimchy")
.field("postDate", new Date()) .field("message", "trying out Elasticsearch") .endObject()

你也可以用tartArray(String) 和 endArray()添加arrays数组,field支持数值、日期、甚至其他XContentBuilder类型,String json = builder.string()可以查看json
2.Index document
 //将一个json格式的文档索引到一个叫megacorp的索引中,其类型为employee,id为5
import static org.elasticsearch.common.xcontent.XContentFactory.*;
IndexResponse response = client.prepareIndex("megacorp","employee","5")
.setSource(jsonBuilder().startObject().field("sex","male").field("age",100).endObject()).get();
//如果是已经格式化好的json文档,不用给出id
IndexResponse response = client.prepareIndex("megacorp", "employee").setSource(jsonString, XContentType.JSON) .get();
// 索引名字
String _index = response.getIndex();
//类型
String _type = response.getType();
// 文档id
String _id = response.getId();
// 版本 (第一次索引文档返回1)
long _version = response.getVersion();
// 状态
RestStatus status = response.status();
六、Get API
//通过索引、类型、id进行查询
GetResponse response = client.prepareGet("megacorp", "employee", "5").get();

异步特性:当API的实际执行在同一个节点上时,可以设置线程模型来执行操作,operationThreaded设为true操作将在不同的线程下执行,false代表在调用线程
执行, GetResponse response = client.prepareGet("twitter", "tweet", "1").setOperationThreaded(false).get();
七、Delete API
//通过索引、类型、id进行删除
DeleteResponse response = client.prepareDelete("megacorp", "employee", "5").get(); 支持设置线程模型
八、Delete By Query API

//通过条件过滤来批量删除索引中的文档

BulkByScrollResponse response =DeleteByQueryAction.INSTANCE.newRequestBuilder(esClient.client)
.filter(QueryBuilders.matchQuery("age", 18)).source("megacorp").get();
long deleted = response.getDeleted();

//如果运行时间长,希望异步执行,可以使用execute代替get并且提供一个监听器

DeleteByQueryAction.INSTANCE.newRequestBuilder(client)
.filter(QueryBuilders.matchQuery("age", "99"))
.source("megacorp")
.execute(new ActionListener<BulkByScrollResponse>() {
public void onResponse(BulkByScrollResponse response) {
long deleted = response.getDeleted();
logger.info("number of deleted documents: {}",deleted);
}
public void onFailure(Exception e) {
// Handle the exception
}
});
九、Update API
(博客园的文档编辑实在太难用了,我放弃了,有想看的直接看API文档吧)
https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-docs-update.html

转载于:https://www.cnblogs.com/LittleDevil/p/7798977.html

  • 点赞
  • 收藏
  • 分享
  • 文章举报
agbl69546 发布了0 篇原创文章 · 获赞 0 · 访问量 2 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: