zoukankan      html  css  js  c++  java
  • java操作ElasticSearch(es)进行增删查改操作

     

    有时间是要了解一下ES这个东西的~

    -------------------------------------------------------------------------------------------------

    在开始讲解之前,还是先做个铺垫,为了能够有一个可以索引的模型,我们自定义了一个模型,暂时起个名称叫LogModel吧,这个模型有各种数据类型,int,long,String,list,但千万不要认为这是跟记录日志有关的一个模型。作为索引的一个最简单模型。代码如下:

    Java代码  收藏代码
    1. import java.util.ArrayList;  
    2. import java.util.List;  
    3. import java.util.Random;  
    4. import java.util.UUID;  
    5. /** 
    6.  * 瞎编的一个模型,跟日志基本没有关系 
    7.  * @author donlian 
    8.  */  
    9. public class LogModel {  
    10.     //主ID  
    11.     private long id;  
    12.     //次ID  
    13.     private int subId;  
    14.     /** 
    15.      * 系统名称 
    16.      */  
    17.     private String systemName;  
    18.     private String host;  
    19.       
    20.     //日志描述  
    21.     private String desc;  
    22.     private List<Integer> catIds;  
    23.     public LogModel(){  
    24.         Random random = new Random();  
    25.         this.id = Math.abs(random.nextLong());  
    26.         int subId = Math.abs(random.nextInt());  
    27.         this.subId = subId;  
    28.         List<Integer> list = new ArrayList<Integer>(5);  
    29.         for(int i=0;i<5;i++){  
    30.             list.add(Math.abs(random.nextInt()));  
    31.         }  
    32.         this.catIds = list;  
    33.         this.systemName = subId%1 == 0?"oa":"cms";  
    34.         this.host = subId%1 == 0?"10.0.0.1":"10.2.0.1";  
    35.         this.desc = "中文" + UUID.randomUUID().toString();  
    36.     }  
    37.     public LogModel(long id,int subId,String sysName,String host,String desc,List<Integer> catIds){  
    38.         this.id = id;  
    39.         this.subId = subId;  
    40.         this.systemName = sysName;  
    41.         this.host = host;  
    42.         this.desc = desc;  
    43.         this.catIds = catIds;  
    44.     }  
    45. ...//省去get,set方法  
    46. }  

     同时,因为ES在索引的时候,一般都用json格式,因此,使用jackson定义了一个将对象转化成json的工具类,也很简单,代码:

    Java代码  收藏代码
    1. public class ESUtils {  
    2.     private static ObjectMapper objectMapper = new ObjectMapper();  
    3.     public static String toJson(Object o){  
    4.         try {  
    5.             return objectMapper.writeValueAsString(o);  
    6.         } catch (JsonProcessingException e) {  
    7.             e.printStackTrace();  
    8.         }  
    9.         return "";  
    10.     }  
    11. }  

     在开始进行操作ES服务器之前,我们必须得获得ES的API,简单介绍一下ES操作服务器的两种方式,一种是使用Node方式,即本机也启动一个ES,然后跟服务器的ES进行通信,这个node甚至还能存储(奇怪,一般需要这样的方式吗?),另一种,就是下面我介绍的这一种,通过一个对象使用http协议跟服务器进行交互。

    获得一个ES客户端API的代码如下:

    Java代码  收藏代码
    1. Settings settings = ImmutableSettings.settingsBuilder()  
    2.                 //指定集群名称  
    3.                 .put("cluster.name", "elasticsearch")  
    4.                 //探测集群中机器状态  
    5.                 .put("client.transport.sniff", true).build();  
    6.         /* 
    7.          * 创建客户端,所有的操作都由客户端开始,这个就好像是JDBC的Connection对象 
    8.          * 用完记得要关闭 
    9.          */  
    10.         Client client = new TransportClient(settings)  
    11.         .addTransportAddress(new InetSocketTransportAddress("192.168.1.106", 9300));  

     Client对象,可以理解为数据库的Connection对象。好了,准备工作完成,下面就开始增删改查。

     Index(增加)

    ES里面的增加对象不叫什么add,save等,叫index。但无论叫什么名称,反正就是向ES服务器里面加数据。上面说过一个对象转json的工具类,其实ES的API中,是自带构建json的工具类的。

    Java代码  收藏代码
    1. import org.elasticsearch.action.index.IndexResponse;  
    2. import org.elasticsearch.client.Client;  
    3. import org.elasticsearch.client.transport.TransportClient;  
    4. import org.elasticsearch.common.settings.ImmutableSettings;  
    5. import org.elasticsearch.common.settings.Settings;  
    6. import org.elasticsearch.common.transport.InetSocketTransportAddress;  
    7.   
    8. import com.donlianli.es.ESUtils;  
    9. import com.donlianli.es.model.LogModel;  
    10. /** 
    11.  * 向ES添加索引对象 
    12.  * @author donlian 
    13.  */  
    14. public class IndexTest {  
    15.     public static void main(String[] argv){  
    16.         Settings settings = ImmutableSettings.settingsBuilder()  
    17.                 //指定集群名称  
    18.                 .put("cluster.name", "elasticsearch")  
    19.                 //探测集群中机器状态  
    20.                 .put("client.transport.sniff", true).build();  
    21.         /* 
    22.          * 创建客户端,所有的操作都由客户端开始,这个就好像是JDBC的Connection对象 
    23.          * 用完记得要关闭 
    24.          */  
    25.         Client client = new TransportClient(settings)  
    26.         .addTransportAddress(new InetSocketTransportAddress("192.168.1.106", 9300));  
    27.         String json = ESUtils.toJson(new LogModel());  
    28.         //在这里创建我们要索引的对象  
    29.         IndexResponse response = client.prepareIndex("twitter", "tweet")  
    30.                 //必须为对象单独指定ID  
    31.                 .setId("1")  
    32.                 .setSource(json)  
    33.                 .execute()  
    34.                 .actionGet();  
    35.         //多次index这个版本号会变  
    36.         System.out.println("response.version():"+response.version());  
    37.         client.close();  
    38.     }  
    39. }  

     运行这个代码,就向ES插入了一条数据,你运行两遍,还是一条。ES根据你设置的ID来设置对象,如果没有则插入,有则更新。每更新一次,对应的version加1.

    好了,在次,使用以下命令,应该能够查询到一条记录了。

    Java代码  收藏代码
    1. curl -XGET 'http://localhost:9200/twitter/tweet/1'  

     delete(删除)

    有了增加的例子,删除的例子也就好写了。增加是prepareIndex,删除是prepareDelete,查询就是PrepareGet。

    代码如下:

    Java代码  收藏代码
    1. import org.elasticsearch.action.delete.DeleteResponse;  
    2. import org.elasticsearch.client.Client;  
    3. import org.elasticsearch.client.transport.TransportClient;  
    4. import org.elasticsearch.common.settings.ImmutableSettings;  
    5. import org.elasticsearch.common.settings.Settings;  
    6. import org.elasticsearch.common.transport.InetSocketTransportAddress;  
    7.   
    8. import com.donlianli.es.ESUtils;  
    9.   
    10. public class DeleteTest {  
    11.     public static void main(String[] argv){  
    12.         Settings settings = ImmutableSettings.settingsBuilder()  
    13.                 //指定集群名称  
    14.                 .put("cluster.name", "elasticsearch")  
    15.                 //探测集群中机器状态  
    16.                 .put("client.transport.sniff", true).build();  
    17.         /* 
    18.          * 创建客户端,所有的操作都由客户端开始,这个就好像是JDBC的Connection对象 
    19.          * 用完记得要关闭 
    20.          */  
    21.         Client client = new TransportClient(settings)  
    22.         .addTransportAddress(new InetSocketTransportAddress("192.168.1.106", 9300));  
    23.         //在这里创建我们要索引的对象  
    24.         DeleteResponse response = client.prepareDelete("twitter", "tweet", "1")  
    25.                 .execute().actionGet();  
    26.         System.out.println(response.getId());  
    27.         System.out.println(ESUtils.toJson(response.getHeaders()));  
    28.     }  
    29. }  

    GET(查询)

    Java代码  收藏代码
    1. import org.elasticsearch.action.get.GetResponse;  
    2. import org.elasticsearch.client.Client;  
    3. import org.elasticsearch.client.transport.TransportClient;  
    4. import org.elasticsearch.common.settings.ImmutableSettings;  
    5. import org.elasticsearch.common.settings.Settings;  
    6. import org.elasticsearch.common.transport.InetSocketTransportAddress;  
    7.   
    8. public class GetTest {  
    9.     public static void main(String[] argv){  
    10.         Settings settings = ImmutableSettings.settingsBuilder()  
    11.                 //指定集群名称  
    12.                 .put("cluster.name", "elasticsearch")  
    13.                 //探测集群中机器状态  
    14.                 .put("client.transport.sniff", true).build();  
    15.         /* 
    16.          * 创建客户端,所有的操作都由客户端开始,这个就好像是JDBC的Connection对象 
    17.          * 用完记得要关闭 
    18.          */  
    19.         Client client = new TransportClient(settings)  
    20.         .addTransportAddress(new InetSocketTransportAddress("192.168.1.106", 9300));  
    21.         //在这里创建我们要索引的对象  
    22.         GetResponse response = client.prepareGet("twitter", "tweet", "1")  
    23.                 .execute().actionGet();  
    24.         System.out.println("response.getId():"+response.getId());  
    25.         System.out.println("response.getSourceAsString():"+response.getSourceAsString());  
    26.     }  
    27. }  

     好了,增删改查的代码写完。至于搜索,那是一个比较深入的话题,我也在慢慢探索。我时间我会继续写下去。

  • 相关阅读:
    联想 Vibe Shot(Z90-3) 免recovery 获取ROOT权限 救砖 VIBEUI V3.1_1625
    联想 Z5S(L78071)免解锁BL 免rec 保留数据 ROOT Magisk Xposed 救砖 ZUI 10.5.370
    联想 Z5(L78011) 免解锁BL 免rec 保留数据 ROOT Magisk Xposed 救砖 ZUI 10.5.254
    联想 S5 Pro(L78041)免解锁BL 免rec 保留数据 ROOT Magisk Xposed 救砖 ZUI 5.0.123
    第二阶段 冲刺八
    第二阶段 冲刺七
    第二阶段 冲刺六
    第二阶段 冲刺五
    代码大全阅读笔记03
    学习进度十二
  • 原文地址:https://www.cnblogs.com/shoshana-kong/p/9826397.html
Copyright © 2011-2022 走看看