基於java的ES開發

3.1 環境配置

Jdk 1.8及以上java

Elasticsearch.client 5.5.2(與服務器版本一致)node

Log4j 2.7及如下apache

maven工程必要的jar包依賴json

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"服務器

   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">app

   <modelVersion>4.0.0</modelVersion>elasticsearch

   <groupId>com.rodge</groupId>maven

   <artifactId>elasticFirstDemo</artifactId>tcp

   <version>0.0.1-SNAPSHOT</version>工具

 

   <properties>

      <elasticSearch.version>5.5.2</elasticSearch.version>

   </properties>

 

   <dependencies>

      <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->

      <dependency>

         <groupId>org.apache.logging.log4j</groupId>

         <artifactId>log4j-core</artifactId>

         <version>2.7</version>

      </dependency>

      <!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch -->

      <dependency>

         <groupId>org.elasticsearch.client</groupId>

         <artifactId>transport</artifactId>

         <version>${elasticSearch.version}</version>

      </dependency>

   </dependencies>

</project>

 

日誌文件log4j2.properties文件內容

appender.console.type = Console

appender.console.name = console

appender.console.layout.type = PatternLayout

appender.console.layout.pattern = [%t] %-5p %c - %m%n

 

rootLogger.level = info

rootLogger.appenderRef.console.ref = console

 

3.2 簡單查詢

測試用例, 查詢book索引中novel中id爲1的文檔

package com.rodge.elasticSearch.firstDemo;

 

import java.net.InetAddress;

import java.net.UnknownHostException;

 

import org.elasticsearch.action.get.GetResponse;

import org.elasticsearch.client.transport.TransportClient;

import org.elasticsearch.common.settings.Settings;

import org.elasticsearch.common.transport.InetSocketTransportAddress;

import org.elasticsearch.transport.client.PreBuiltTransportClient;

import org.junit.Test;

 

public class ESFirstDemo {

 

      @SuppressWarnings("unchecked")

      public TransportClient client() throws UnknownHostException {

           // es地址, 地址爲192.168.253.129(此處地址不能加"http://"), 此處的端口爲es的tcp端口爲9300,

           // 而不是以前的http9200端口, 若是es有多可節點, 能夠建立多個node, 而後再client中add進去

           // 注意,這裏的端口號不是9200,而是9300。9200端口是用來讓HTTP REST

           // API來訪問ElasticSearch,而9300端口是傳輸層監聽的默認端口。

           InetSocketTransportAddress node = new InetSocketTransportAddress(

                      InetAddress.getByName("192.168.253.129"), 9300);

           // es的配置類

           Settings settings = Settings.builder().put("cluster.name", "wali").build();

           // TransportClient是es啓動的核心類, 後續的關於es的開發都是圍繞着TransportClient進行的

           TransportClient client = new PreBuiltTransportClient(settings);

           client.addTransportAddress(node);

           return client;

      }

 

      @Test

      public void get() throws UnknownHostException {

           GetResponse result = client().prepareGet("book", "novel", "1").get();

           System.out.println(result.getSource().toString());

      }

 

}

3.3 插入

3.3.1 指定id插入

// 添加文檔, 指定id插入

   @Test

   public void addWithID() throws IOException {

      String title = "一陽指";

      String author = "王重陽";

      int wordCount = 5000;

      Date publishDate = new Date();

      SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

      String format = dateFormat.format(publishDate);

     

      // 構造es文檔

      // 使用es自帶的json工具構造

      XContentBuilder xContentBuilder = XContentFactory.jsonBuilder().startObject()

            .field("title", title).field("author", author).field("word_count", wordCount)

            .field("publish_date", format).endObject();

      //將數據插入到index爲book, type爲novel的索引中, 而且指定id爲15

      IndexResponse indexResponse = client().prepareIndex("book", "novel").setId("15")

            .setSource(xContentBuilder).get();

      System.out.println(indexResponse.getId());

   }

3.3.2 es隨機生成id插入

// 添加文檔, id爲es隨機生成

   @Test

   public void add() throws IOException {

      String title = "落英劍法";

      String author = "黃藥師";

      int wordCount = 3000;

      Date publishDate = new Date();

      SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

      String format = dateFormat.format(publishDate);

 

      // 構造es文檔

      // 使用es自帶的json工具構造

      XContentBuilder xContentBuilder = XContentFactory.jsonBuilder().startObject()

            .field("title", title).field("author", author).field("word_count", wordCount)

            .field("publish_date", format).endObject();

      //將數據插入到index爲book, type爲novel中的索引中, id有es隨機生成, 並獲取返回信息

      IndexResponse indexResponse = client().prepareIndex("book", "novel")

            .setSource(xContentBuilder).get();

      System.out.println(indexResponse.toString());

   }

3.3.4 批量插入

@Test

   public void dbImportEs() {

      Long count = 10000L;// 每次採集條數

      String index = "rodge";// es索引名稱

      String type = "user";// es中類型名稱

      BulkRequestBuilder prepareBulk = transportClient.prepareBulk();

      long startTime = System.currentTimeMillis();

      System.out.println("startTime: " + startTime);

      for (int i = 1; i <= count; i++) {

         Map<String, Object> ret = new HashMap<String, Object>();

         ret.put("recordtime", System.currentTimeMillis());

         ret.put("area", "北京" + i);

         ret.put("usertype", 33 + i);

         ret.put("count",  i);

         prepareBulk.add(transportClient.prepareIndex(index, type).setSource(ret));

         // 每10000條提交一次

         if (i % 1000 == 0) {

            BulkResponse actionGet = prepareBulk.execute().actionGet();

            System.out.println(actionGet.toString());

            long endTime = System.currentTimeMillis();

            System.out.println("endTime: " + endTime);

            System.out.println("消耗的時間: " + (endTime - startTime) / 1000);

         }

      }

   }

3.4 刪除

3.4.1 刪除指定id的文檔

// 刪除 -- 刪除指定id的文檔

   @Test

   public void deleteById() throws UnknownHostException {

      DeleteResponse deleteResponse = client()

            .prepareDelete("book", "novel", "AV8aBzNyHGrPjnHoRYlK").get();

      System.out.println(deleteResponse.getVersion());

   }

 

3.4.2 刪除索引

刪除索引是不可逆的, 慎用!

// 刪除 -- 刪除索引

   @Test

   public void deleteIndex() throws UnknownHostException {

      DeleteIndexResponse deleteIndexResponse = client().admin().indices().prepareDelete("people")

            .get();

      System.out.println(deleteIndexResponse.toString());

   }

 

3.5 修改

3.5.1 根據id更新指定的文檔

// 更新 -- 根據id更新文檔

   @Test

   public void updateById() throws IOException, InterruptedException, ExecutionException {

      UpdateRequest updateRequest = new UpdateRequest("book", "novel", "1");

      XContentBuilder contentBuilder = XContentFactory.jsonBuilder().startObject();

      contentBuilder.field("author", "張三_update");

      contentBuilder.field("title", "移魂大法_update");

      contentBuilder.field("word_count", 200);

      contentBuilder.field("publish_date", "2017-10-16");

      contentBuilder.endObject();

      updateRequest.doc(contentBuilder);

     

      UpdateResponse updateResponse = client().update(updateRequest).get();

      System.out.println(updateResponse.toString());

   }

 

3.6 複合查詢接口開發

// 複合查詢

   @Test

   public void complexQuery() throws UnknownHostException {

      // 匹配查詢

      BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

      boolQueryBuilder.must(QueryBuilders.matchQuery("author", "瓦力"));

      boolQueryBuilder.must(QueryBuilders.matchQuery("title", "elasticsearch精通"));

      //boolQueryBuilder.must(QueryBuilders.matchQuery("publish_date", ""));

 

      // 範圍查詢

      RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("word_count");

      rangeQueryBuilder.from(200);

      rangeQueryBuilder.to(3000);

      boolQueryBuilder.filter(rangeQueryBuilder);

 

      SearchRequestBuilder requestBuilder = client().

            prepareSearch("book").setTypes("novel")

            .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)

            .setQuery(boolQueryBuilder)

            .setFrom(0)

            .setSize(10);

      System.out.println("requestBuilder " + requestBuilder);

     

      SearchResponse searchResponse = requestBuilder.get();

      List<Map<String, Object>> resultList = new ArrayList<Map<String,Object>>();

      for (SearchHit hit : searchResponse.getHits()) {

         resultList.add(hit.getSource());

      }

      System.out.println("resultList: " + resultList);

     

   }

相關文章
相關標籤/搜索