Java之Elasticsearch 增删改查

Posted SessionBest

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java之Elasticsearch 增删改查相关的知识,希望对你有一定的参考价值。

<!--ELK  -->
<dependency>
   <groupId>org.elasticsearch.client</groupId>
   <artifactId>transport</artifactId>
   <version>5.1.1</version>
   <exclusions>
      <!--<exclusion>
         <artifactId>transport-netty4-client</artifactId>
         <groupId>org.elasticsearch.plugin</groupId>
      </exclusion>-->
   </exclusions>
</dependency>
<dependency>
   <groupId>org.apache.logging.log4j</groupId>
   <artifactId>log4j-core</artifactId>
   <version>2.6.2</version>
</dependency>

<!-- springmvc json -->
<dependency>
   <groupId>com.fasterxml.jackson.core</groupId>
   <artifactId>jackson-databind</artifactId>
   <version>2.8.8</version>
</dependency>
<dependency>
   <groupId>org.codehaus.jackson</groupId>
   <artifactId>jackson-mapper-asl</artifactId>
   <version>1.9.13</version>
</dependency>
<dependency>
   <groupId>com.fasterxml.jackson.core</groupId>
   <artifactId>jackson-core</artifactId>
   <version>2.8.8</version>
</dependency>
<dependency>
   <groupId>com.fasterxml.jackson.core</groupId>
   <artifactId>jackson-annotations</artifactId>
   <version>2.8.5</version>
</dependency>



package com.sxis.util;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutionException;

import org.elasticsearch.ElasticsearchException;
import org.elasticsearch.action.admin.cluster.state.ClusterStateResponse;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.sort.SortOrder;
import org.elasticsearch.transport.client.PreBuiltTransportClient;

/**
  * 【描述】:  ELK java API 接口 ,包括查询,删除,插入等待
  * 【步骤】:     
  * @param
* @return    
* @throws       
* @author    Allen
  * @date      2017/7/4 9:47
  */
public class ElasticsearchUtil {
   private static TransportClient client;
   private static String elasticIp = "192.168.211.50";
   private static int elasticPort = 9300;


   /**
     * 【描述】:  初始化ElasticSearch对象
     * 【步骤】:
     * @param
* @return
* @throws
* @author    Allen
     * @date      2017/7/4 15:19
     */
public static void init() throws UnknownHostException, InterruptedException, ExecutionException {
      //设置ES实例的名称.put("client.transport.sniff", true) //自动嗅探整个集群的状态,把集群中其他ES节点的ip添加到本地的客户端列表中
      Settings esSettings = Settings.builder().put("cluster.name", "elasticsearch").build();
      client = new PreBuiltTransportClient(esSettings);//初始化client较老版本发生了变化,此方法有几个重载方法,初始化插件等。
      //此步骤添加IP,至少一个,其实一个就够了,因为添加了自动嗅探配置
      client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(elasticIp), elasticPort));
      System.out.println("连接建立成功");
   }


   /**
     * 【描述】:  创建index,把其中的文档转化为json的格式存储
     * 【步骤】:
     * @param       <Node>:节点ip <port>:节点端口号,默认9200 <Index>:索引名 <Type>:索引类型 <ID>:操作对象的ID号
    * @return
* @throws
* @author    Allen
     * @date      2017/7/5 9:42
     */
public static void createIndex() throws ElasticsearchException,IOException {
      for (int i=300; i<=50000000;i++){
         User user = new User();
         user.setId(1);
         user.setName("huang fox " + i);
         user.setAge(i % 100);
         IndexResponse indexResponse = null;
         indexResponse = client.prepareIndex("users", "user",i+"").setSource(generateJson(user)).execute().actionGet();
         System.out.println("responseIsCreated: "+indexResponse);
      }
      System.out.println("it is ok !");
   }

   public static void query() throws Exception {
      //term查询
      //QueryBuilder queryBuilder = QueryBuilders.termQuery("age", 50) ;  //年龄等于50
      //range查询
      QueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").gt(50); //年龄大于50
      SearchResponse searchResponse = client.prepareSearch("users")
            .setTypes("user")
            .setQuery(rangeQueryBuilder)     //query
            .setPostFilter(QueryBuilders.rangeQuery( "age" ).from( 70 ).to( 80 )) // Filter
            .addSort("age", SortOrder.DESC)
            .setSize(120)   // 不设置的话,默认取10条数据
            .execute().actionGet();
      SearchHits hits = searchResponse.getHits();
      System.out.println("查到记录数:"+hits.getTotalHits());
      SearchHit[] searchHists = hits.getHits();
      if(searchHists.length>0){
         for(SearchHit hit:searchHists){
            String name =  (String) hit.getSource().get("name");
            Integer age = Integer.parseInt( hit.getSource().get("age").toString() );
            System.out.format("name:%s ,age :%d 
",name ,age);
         }
      }
   }


   /**
    * 转换成json对象
    *
    * @param user
* @return
*/
private static String generateJson(User user) {
      String json = "";
      try {
         XContentBuilder contentBuilder = XContentFactory.jsonBuilder().startObject();
         contentBuilder.field("id", user.getId());
         contentBuilder.field("name", user.getName());
         contentBuilder.field("age", user.getAge());
         json = contentBuilder.endObject().string();
      } catch (IOException e) {
         e.printStackTrace();
      }
      return json;
   }


   /*
    * Get index 获取文档相当于读取数据库的一行数据
    */
   public static void getIndex(){
      GetResponse getresponse = client.prepareGet("users", "user", "402").execute().actionGet();
      System.out.println(getresponse.getSourceAsString());
   }

   /*
    *Delete index 相当于删除一行数据
    */
   public static void delete(){
      DeleteResponse deleteresponse = client.prepareDelete("users", "user","1").execute().actionGet();
      System.out.println(deleteresponse.getVersion());
   }

   /*
    *Delete index 删除索引及该索引所管辖的记录
    */
   public static void deleteIndex(){
      //删除所有记录
      DeleteIndexResponse deleteIndexResponse = client.admin().indices().prepareDelete("logs").execute().actionGet();
      System.out.println(deleteIndexResponse.isAcknowledged());
   }

   /**
     * 【描述】:     获取到所有的索引
     * 【步骤】:
     * @param
* @return
* @throws
* @author    Allen
     * @date      2017/7/4 16:27
     */
public static void getAllIndex(){
      ClusterStateResponse response = client.admin().cluster().prepareState().execute().actionGet();
      //获取所有索引
      String[] indexs=response.getState().getMetaData().getConcreteAllIndices();
      for (String index : indexs) {
         System.out.println( index + " delete" );//
      }
   }



   public void close(){
      //on shutdown 断开集群
      client.close();
   }

   public static void main( String[] args ) {
      try {
         init();
         //createIndex();
         //getIndex();
         //delete();
         //deleteIndex();
         //getAllIndex();
         query();
      } catch( Exception e ) {
         e.printStackTrace();
      }
   }

}


class User{

   private static final long serialVersionUID = 5290251719938640641L;

   private Integer id;
   private String name;
   private int age;

   public Integer getId() {
      return id;
   }

   public void setId( Integer id ) {
      this.id = id;
   }

   public String getName() {
      return name;
   }

   public void setName( String name ) {
      this.name = name;
   }

   public int getAge() {
      return age;
   }

   public void setAge( int age ) {
      this.age = age;
   }
}
 

以上是关于Java之Elasticsearch 增删改查的主要内容,如果未能解决你的问题,请参考以下文章

java操作elasticsearch实现基本的增删改查操作

(07)ElasticSearch 使用Kibana实现基增删改查

Elasticsearch数据增删改

Elasticsearch增删改查

ElasticSearch 7.3 结合Spring boot进行增删改查和批量(bulk)详解

04-springboot整合elasticsearch初识-简单增删改查及复杂排序,分页,聚合操作