elasticsearch-1-java操作

JAVA操作Elasticsearch

一、java客户端可以对Es进行的操作:

  1. 在现有的集群上执行标准的索引、获取、删除、搜索功能。

  2. 在运行的集群上执行管理任务。

二、操作步骤

  1. 创建索引库
    1. 创建一个java工程
    2. 添加jar包,添加maven
    3. 编写测试服方法实现创建索引库
      1. 创建一个Setting对象,相当于一个配置信息,主要配置集群名称。
      2. 创建一个客户端Client对象
      3. 使用client对象创建一个索引库
      4. 关闭对象

三、javaAPI学习

1.get

  1. get API允许根据id从索引中获取一个JSON文档。

    GetResponse response = client.prepareGet("twitter", "tweet", "1").get();
    
  2. 选项是在不同的线程上执行操作,或者在调用线程上执行操作(注意,API仍然是异步的)。默认情况下,operationthread设置为true,这意味着操作在不同的线程上执行。这里有一个设置为false的例子:

    GetResponse response = client.prepareGet("twitter", "tweet", "1")
            .setOperationThreaded(false)
            .get();
    

2.delete

  • delete API允许用户根据id从特定索引中删除类型化JSON文档。下面的示例从名为twitter的索引中删除JSON文档,该索引的类型为tweet, id值为1
DeleteResponse response = client.prepareDelete("twitter", "tweet", "1").get();
  • delete API允许设置线程模型,当API的实际执行在同一节点上执行时(该API在分配在同一服务器上的一个分片上执行),将执行该操作。

选项是在不同的线程上执行操作,或者在调用线程上执行操作(注意,API仍然是异步的)。默认情况下,operationthread设置为true,这意味着操作在不同的线程上执行。这里有一个设置为false的

DeleteResponse response = client.prepareDelete("twitter", "tweet", "1")
        .setOperationThreaded(false)
        .get();
  • delete by query API允许根据查询结果删除给定的一组文档:
BulkByScrollResponse response =
    DeleteByQueryAction.INSTANCE.newRequestBuilder(client)
        .filter(QueryBuilders.matchQuery("gender", "male")) 
        .source("persons")                                  
        .get();                                             

long deleted = response.getDeleted();
query
index
execute the operation
number of deleted documents
  • 因为它可以是一个长时间运行的操作,如果你希望异步地做它,你可以调用execute而不是get,并提供一个监听器,如:
DeleteByQueryAction.INSTANCE.newRequestBuilder(client)
    .filter(QueryBuilders.matchQuery("gender", "male"))                  
    .source("persons")                                                   
    .execute(new ActionListener<BulkByScrollResponse>() {           
        @Override
        public void onResponse(BulkByScrollResponse response) {
            long deleted = response.getDeleted();                        
        }
        @Override
        public void onFailure(Exception e) {
            // Handle the exception
        }
    });

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QOeRHDIk-1603810304529)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20200722100946907.png)]

3.update

  • 创建一个UpdateRequest并发送到客户端:

    UpdateRequest updateRequest = new UpdateRequest();
    updateRequest.index("index");
    updateRequest.type("type");
    updateRequest.id("1");
    updateRequest.doc(jsonBuilder()
            .startObject()
                .field("gender", "male")
            .endObject());
    client.update(updateRequest).get();
    
  • //可以使用prepareUpdate()方法  通过脚本方式实现
    client.prepareUpdate("ttl", "doc", "1")
            .setScript(new Script(
                "ctx._source.gender = \"male\"", 
                ScriptService.ScriptType.INLINE, null, null))
            .get();
    
    client.prepareUpdate("ttl", "doc", "1")
            .setDoc(jsonBuilder()               
                .startObject()
                    .field("gender", "male")
                .endObject())
            .get();
    

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9U96LQjH-1603810304536)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20200722101318232.png)]

你的脚本。它也可以是本地存储的脚本名。在这种情况下,您需要使用ScriptService.ScriptType.FILE

将合并到现有文件中的文档。

注意,您不能同时提供脚本和文档。

  • 
    //更新API允许根据提供的脚本更新文档:
    UpdateRequest updateRequest = new UpdateRequest("ttl", "doc", "1")
            .script(new Script("ctx._source.gender = \"male\""));
    client.update(updateRequest).get();
    
  • update API还支持传递部分文档,将其合并到现有文档中(简单的递归合并、对象的内部合并、替换核心“键/值”和数组)。例如:

    • UpdateRequest updateRequest = new UpdateRequest("index", "type", "1")
              .doc(jsonBuilder()
                  .startObject()
                      .field("gender", "male")
                  .endObject());
      client.update(updateRequest).get();
      
  • 还支持upsert。如果文档不存在,upsert元素的内容将用于索引新文档:

    • IndexRequest indexRequest = new IndexRequest("index", "type", "1")
              .source(jsonBuilder()
                  .startObject()
                      .field("name", "Joe Smith")
                      .field("gender", "male")
                  .endObject());
      UpdateRequest updateRequest = new UpdateRequest("index", "type", "1")
              .doc(jsonBuilder()
                  .startObject()
                      .field("gender", "male")
                  .endObject())
              .upsert(indexRequest); //如果文档不存在,则会添加indexRequest中的文档             
      client.update(updateRequest).get();
      

4. multiGet

multi get API允许根据文档的索引、类型和id获取文档列表

MultiGetResponse multiGetItemResponses = client.prepareMultiGet()
    .add("twitter", "tweet", "1")    //通过id       
    .add("twitter", "tweet", "2", "3", "4") //或者相同索引/类型的id列表
    .add("another", "type", "foo")   //从另一个索引获取       
    .get();

for (MultiGetItemResponse itemResponse : multiGetItemResponses) { //遍历结果集
    GetResponse response = itemResponse.getResponse();
    if (response.isExists()) {  //检测是否存在                    
        String json = response.getSourceAsString(); // 获取_resource数据
    }
}

5.Bulk delete

批量API允许在一个请求中索引和删除多个文档。下面是一个示例用法

import static org.elasticsearch.common.xcontent.XContentFactory.*;

BulkRequestBuilder bulkRequest = client.prepareBulk();

// either use client#prepare, or use Requests# to directly build index/delete requests
bulkRequest.add(client.prepareIndex("twitter", "tweet", "1")
        .setSource(jsonBuilder()
                    .startObject()
                        .field("user", "kimchy")
                        .field("postDate", new Date())
                        .field("message", "trying out Elasticsearch")
                    .endObject()
                  )
        );

bulkRequest.add(client.prepareIndex("twitter", "tweet", "2")
        .setSource(jsonBuilder()
                    .startObject()
                        .field("user", "kimchy")
                        .field("postDate", new Date())
                        .field("message", "another post")
                    .endObject()
                  )
        );

BulkResponse bulkResponse = bulkRequest.get();
if (bulkResponse.hasFailures()) {
    // process failures by iterating through each bulk response item
}

6. search

搜索API允许执行搜索查询并返回与查询匹配的搜索结果。它可以跨一个或多个索引以及跨一个或多个类型执行。可以使用查询Java API提供查询。搜索请求的主体是使用SearchSourceBuilder构建的。

SearchResponse response = client.prepareSearch("index1", "index2")
        .setTypes("type1", "type2")
        .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
        .setQuery(QueryBuilders.termQuery("multi", "test"))                 // Query
        .setPostFilter(QueryBuilders.rangeQuery("age").from(12).to(18))     // Filter
        .setFrom(0).setSize(60).setExplain(true)
        .get();

注意,所有参数都是可选的。这是你能写的最小的搜索调用

SearchResponse response = client.prepareSearch().get();

尽管Java API定义了额外的搜索类型QUERY_AND_FETCH和DFS_QUERY_AND_FETCH,但是这些模式是内部优化,不应该由API的用户显式地指定。

  • 全文查询

高级全文查询通常用于在全文字段(如电子邮件正文)上运行全文查询。它们理解被查询的字段是如何分析的,并在执行之前将每个字段的分析器(或search_analyzer)应用到查询字符串。

ava
SearchResponse response = client.prepareSearch().get();


尽管Java API定义了额外的搜索类型QUERY_AND_FETCH和DFS_QUERY_AND_FETCH,但是这些模式是内部优化,不应该由API的用户显式地指定。

- 全文查询

高级全文查询通常用于在全文字段(如电子邮件正文)上运行全文查询。它们理解被查询的字段是如何分析的,并在执行之前将每个字段的分析器(或search_analyzer)应用到查询字符串。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值