A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

【郑州校区】使用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号楼三层
联系电话 0371-56061160/61/62
来校路线  地铁一号线梧桐街站A口出


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马