【郑州校区】使用Java操作客户端(入门) Elasticsearch 的 Java 客户端非常强大;它可以建立一个嵌入式实例并在必要时运行管理任务。 运行一个 Java 应用程序和 Elasticsearch 时,有两种操作模式可供使用。该应用程序可在 Elasticsearch 集群中扮演更加主动或更加被动的角色。在更加主动的情况下(称为 Node Client),应用程序实例将从集群接收请求,确定哪个节点应处理该请求,就像正常节点所做的一样。(应用程序甚至可以托管索引和处理请求。)另一种模式称为 Transport Client,它将所有请求都转发到另一个 Elasticsearch 节点,由后者来确定最终目标。 1.1. 新建文档(自动创建索引和映射 )1、 需要新建 maven项目 2、 基于maven的pom 导入坐标依赖 [AppleScript] 纯文本查看 复制代码 <dependencies>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies> ElasticSearch2.4.0 依赖 lucene5.5.2 版本 当直接在ElasticSearch 建立文档对象时,如果索引不存在的,默认会自动创建,映射采用默认方式 l ElasticSearch 服务默认端口 9300 l Web 管理平台端口 9200 获取 Transport Client调用 对于演示应用程序,(通过 App.java 中执行的初始化)选择 Transport Client,并保持 Elasticsearch 执行最低级别的处理: 这里注意:如果连接到一个 Elasticsearch 集群,构建器可以接受多个地址。(在本课程中,您只有一个 localhost 节点。)连接到端口 9300,而不是像之前在 REST API 的 CURL 中一样连接到 9200。Java 客户端将会使用这个特殊端口,使用端口 9200将不起作用。 使用org.elasticsearch.client.Client连接服务器。所以任何操作都需要用上,我们把它的创建放置到@Before中,操作最后别忘记执行client.close()方法关闭。 [AppleScript] 纯文本查看 复制代码 private Client client;
/** 获取client */
@Before
public void getClient() throws Exception {
client = TransportClient.builder().build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
} 3、 建立文档, 自动创建索引 方式一:拼装json的字符串。 [AppleScript] 纯文本查看 复制代码 @Test
public void createIndexNoMapping() {
String json = "{" +
"\"id\":\"1\"," +
"\"title\":\"基于Lucene的搜索服务器\"," +
"\"content\":\"它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口\"" +
"}";
IndexResponse indexResponse = this.client.prepareIndex("blog", "article", "1").setSource(json).execute().actionGet();
// 结果获取
String index = indexResponse.getIndex();
String type = indexResponse.getType();
String id = indexResponse.getId();
long version = indexResponse.getVersion();
boolean created = indexResponse.isCreated();
System.out.println(index + " : " + type + ": " + id + ": " + version + ": " + created);
// 关闭连接
client.close();
} 方式二:使用Map集合 [AppleScript] 纯文本查看 复制代码 // ElasticSearch 测试程序
public class ElasticSearchTest {
/**创建索引、类型、文档*/
@Test
public void createIndexNoMapping1() {
Map<String, Object> json = new HashMap<String, Object>();
json.put("id", "2");
json.put("title", "基于Lucene的搜索服务器");
json.put("content", "它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口");
IndexResponse indexResponse = this.client.prepareIndex("blog", "article", "2").setSource(json).execute().actionGet();
// 结果获取
String index = indexResponse.getIndex();
String type = indexResponse.getType();
String id = indexResponse.getId();
long version = indexResponse.getVersion();
boolean created = indexResponse.isCreated();
System.out.println(index + " : " + type + ": " + id + ": " + version + ": " + created);
// 关闭连接
client.close();
} 方式三:使用es的帮助类,创建json对象 [AppleScript] 纯文本查看 复制代码 @Test
public void createIndexNoMapping2() throws Exception{
// 使用es的帮助类,创建一个json方式的对象
/**
* 描述json 数据
* {id:xxx, title:xxx, content:xxx}
*/
XContentBuilder sourceBuilder = XContentFactory.jsonBuilder()
.startObject()
.field("id", 3)
.field("title", "ElasticSearch是一个基于Lucene的搜索服务器")
.field("content",
"它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。")
.endObject();
// 创建索引
IndexResponse indexResponse = client.prepareIndex("blog", "article", "3").setSource(sourceBuilder).get();
// 结果获取
String index = indexResponse.getIndex();
String type = indexResponse.getType();
String id = indexResponse.getId();
long version = indexResponse.getVersion();
boolean created = indexResponse.isCreated();
System.out.println(index + " : " + type + ": " + id + ": " + version + ": " + created);
// 关闭连接
client.close();
}
} 没有映射创建,自动创建索引 和 映射 名称为blog 自动创建索引映射 文档数据 (type 文档类型 ) 1.2. 搜索文档数据(单个索引)使用GetResponse查询 [AppleScript] 纯文本查看 复制代码 /**
* get API 获取指定文档信息
*/
@Test
public void testGetData() throws Exception {
Client client = TransportClient.builder().build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
GetResponse response = client.prepareGet("blog", "article", "1")
.setOperationThreaded(false) // 线程安全
.get();
System.out.println(response.getSourceAsString());
// 关闭连接
client.close();
} 1.3. 搜索文档数据(多个索引) [AppleScript] 纯文本查看 复制代码 /**[/align] * 测试multi get
* 搜索
* 从不同的index, type, 和id中获取
*/
@Test
public void testMultiGet() {
MultiGetResponse multiGetResponse = client.prepareMultiGet()
.add("blog", "article", "1")
.add("blog", "article", "2", "3", "4")
.add("blog", "article", "2")
.get();
for (MultiGetItemResponse itemResponse : multiGetResponse) {
GetResponse response = itemResponse.getResponse();
if (response.isExists()) {
String sourceAsString = response.getSourceAsString();
System.out.println(sourceAsString);
}
}
client.close();
} 1.4. 更新文档数据【更新方式一】 [AppleScript] 纯文本查看 复制代码 /**[/align] * 测试更新 update API 使用 updateRequest 对象
*/
@Test
public void testUpdate() throws Exception {
UpdateRequest updateRequest = new UpdateRequest();
updateRequest.index("blog");
updateRequest.type("article");
updateRequest.id("1");
updateRequest.doc(XContentFactory.jsonBuilder().startObject()
// 对没有的字段添加, 对已有的字段替换
.field("title", "ElasticSearch是一个基于Lucene的搜索服务器")
.field("content",
"它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。")
.field("createDate", "2018-10-11").endObject());
UpdateResponse response = client.update(updateRequest).get();
// 打印
String index = response.getIndex();
String type = response.getType();
String id = response.getId();
long version = response.getVersion();
System.out.println(index + " : " + type + ": " + id + ": " + version);
// 关闭连接
client.close();
} 【更新方式二】 [AppleScript] 纯文本查看 复制代码 /**[/align] * 测试更新 update API 使用 updateRequest 对象
*/
@Test
public void testUpdate2() throws Exception {
// 使用updateRequest对象及documents进行更新
UpdateResponse response = client
.update(new UpdateRequest("blog", "article", "1").doc(XContentFactory.jsonBuilder().startObject()
.field("title", "什么是Elasticsearch,ElasticSearch是一个基于Lucene的搜索服务器").endObject()))
.get();
// 打印
String index = response.getIndex();
String type = response.getType();
String id = response.getId();
long version = response.getVersion();
System.out.println(index + " : " + type + ": " + id + ": " + version);
// 关闭连接
client.close();
} 【更新方式三】 [AppleScript] 纯文本查看 复制代码 /**
* 测试upsert方法
*/
@Test
public void testUpsert() throws Exception {
// 设置查询条件, 查找不到则添加
IndexRequest indexRequest = new IndexRequest("blog", "article", "1")
.source(XContentFactory.jsonBuilder()
.startObject()
.field("title", "搜索服务器")
.field("content",
"它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。")
.endObject());
// 设置更新, 查找到更新下面的设置
UpdateRequest upsert = new UpdateRequest("blog", "article", "1")
.doc(XContentFactory.jsonBuilder()
.startObject()
.field("user", "李四")
.endObject())
.upsert(indexRequest);
client.update(upsert).get();
client.close();
} 1.5. 删除文档数据[AppleScript] 纯文本查看 复制代码 /**
* 测试 delete
*/
@Test
public void testDelete() {
DeleteResponse response = client.prepareDelete("blog", "article", "1")
.get();
String index = response.getIndex();
String type = response.getType();
String id = response.getId();
long version = response.getVersion();
System.out.println(index + " : " + type + ": " + id + ": " + version);
client.close();
}
传智播客·黑马程序员郑州校区地址 河南省郑州市 高新区长椿路11号大学科技园(西区)东门8号楼三层
|