1. 程式人生 > >elasticsearch(一):JAVA api操作

elasticsearch(一):JAVA api操作

1.建立一個mavan專案,專案的以來配置如下。

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <modelVersion>4.0.0</
modelVersion> <groupId>com.es</groupId> <artifactId>es-test</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId
>transport</artifactId> <version>6.3.2</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency
> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.21</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.8.2</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.0</version> </dependency> </dependencies> </project>

2.建立連線elasticsearch的工具類。

package com.util;


import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Setting;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;

import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;

public class ESUtils {
public static final String INDEX_NAME="userindex";

public static String getIndexName(){
return INDEX_NAME;
}
public static final String TYPE_NAME="tweet";

public static String getTypeName(){
return TYPE_NAME;
}

public static Client getClient(){
Settings settings = Settings.builder()
//指定叢集名稱
.put("cluster.name","my-application")
//探測叢集中機器狀態
.put("client.transport.sniff",true).build();

//建立客戶端
Client client = null;
try {
client = new PreBuiltTransportClient(settings).addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"),9300));
} catch (UnknownHostException e) {
e.printStackTrace();
}
return client;
}


public static void closeClient(Client client){
if(null != client){
client.close();
}
}
}

3.建立索引

 /**
     * 建立索引
     * 如果建立的索引名稱已經存在,建立會丟擲異常,因此先查詢要建立的索引是否已存在,不存在在建立
     */
    @Test
    public void testCreate(){
        //待建立的索引名稱
        String indexName = "userindex";
        //獲取連線
        Client client = ESUtils.getClient();
        //判斷索引是否存在
        IndicesExistsRequest existsRequest = new IndicesExistsRequest(indexName);
        IndicesExistsResponse existsResponse = client.admin().indices().exists(existsRequest).actionGet();
        if(!existsResponse.isExists()){
            //建立索引
            CreateIndexRequest createIndexRequest = new CreateIndexRequest(indexName);
            CreateIndexResponse createIndexResponse = client.admin().indices().create(createIndexRequest).actionGet();
            //判斷建立是否成功
            if (createIndexResponse.isAcknowledged()){
                logger.info("建立成功");
            }else{
                logger.info("建立失敗");
            }
        }else {
            logger.info("索引已存在,無法建立");
        }
        //關閉連線
        ESUtils.closeClient(client);
    }

4.向索引新增資料

/**
     * 向索引中逐條加入資料
     */
    @Test
    public void add(){
        //獲取連線
        Client client = ESUtils.getClient();
        //待新增的json資料
        String strJson ="{\"age\":25,\"name\":\"張三\",\"weight\":76,\"married\":true}";
        XContentParser parser = null;
        try {
            //資料解析,因為不支援json和物件型別的資料,要將其轉為map
             parser = XContentFactory.xContent(XContentType.JSON).createParser(NamedXContentRegistry.EMPTY,DeprecationHandler.THROW_UNSUPPORTED_OPERATION,strJson);
             //插入資料
            IndexResponse indexResponse = client.prepareIndex().setIndex(ESUtils.getIndexName())
                    .setType(ESUtils.getTypeName())
                    .setSource(parser.map())
                    //設定資料的id,id唯一,如果id已存在則是修改
                    .setId("2")
                    .execute()
                    .actionGet();
            
            logger.info("新增成功,"+indexResponse.status());
    }
catch (IOException e) {
        e.printStackTrace();
    }
finally {
      ESUtils.closeClient(client);
  }
}

5.修改資料

  /**
     * 更新資料
     */
    @Test
    public void update(){
        Client client = ESUtils.getClient();
        Map<String,Object> map = new HashMap<String, Object>();
        map.put("age",56);
        map.put("name","李四");
        map.put("weight",69);
        map.put("married",false);
        UpdateResponse updateResponse = client.prepareUpdate()
                .setIndex(ESUtils.getIndexName())
                .setType(ESUtils.getTypeName())
                .setDoc(map)
                //要更新的資料的id
                .setId("2").execute().actionGet();

        logger.info("更新成功,"+updateResponse.status());
        ESUtils.closeClient(client);
    }

6.刪除資料

/**
     * 根據id刪除資料
     */
    @Test
    public void delete(){
        //獲取連線
        Client client = ESUtils.getClient();
        //刪除資料
        DeleteResponse deleteResponse = client.prepareDelete()
                .setIndex(ESUtils.getIndexName())
                .setType(ESUtils.getTypeName())
                //設定id
                .setId("1")
                .execute().actionGet();

        logger.info("刪除成功,"+deleteResponse.status());
        //關閉連線
        ESUtils.closeClient(client);
    }

7.根據id查詢資料

/**
     * 根據id查詢資料
     */
    @Test
    public void select(){
        //獲取連線
        Client client = ESUtils.getClient();
        //查詢資料
        GetResponse getResponse = client.prepareGet()
                .setIndex(ESUtils.getIndexName())
                .setType(ESUtils.getTypeName())
                .setId("1")
                .execute().actionGet();
        //資料
        logger.info("data:="+getResponse.getSourceAsString());
        //關閉連線
        ESUtils.closeClient(client);
    }

8.全文查詢

 /**
     * 全文檢索資料
     */
    @Test
    public void search(){
        //獲取連線
        Client client = ESUtils.getClient();
        //設定查詢條件
        QueryBuilder queryBuilder = QueryBuilders.queryStringQuery("ipad");
        //查詢
        SearchResponse response = client.prepareSearch(ESUtils.getIndexName())
                .setQuery(queryBuilder)
                //設定分頁
                .setFrom(0).setSize(60)
                .execute().actionGet();
        //獲取查詢結果
        SearchHits shs = response.getHits();
        logger.info("查詢資料條數:"+shs.getTotalHits());
        for (SearchHit hit:shs.getHits()) {
            logger.info(hit.getSourceAsString());
        }
        //關閉連線
        ESUtils.closeClient(client);
    }

9.批量插入資料

   //批量插入資料
    @Test
    public void testBulk(){
        //獲取連線
        Client client = ESUtils.getClient();
        //批量介面
        BulkRequestBuilder bulkRequestBuilder = client.prepareBulk();
        User user = new User();
        //設定物件的屬性
        for (int i=3;i<40002;i++){
            user.setName("user_"+UUID.randomUUID().toString().replace("-","").substring(0,6));
            SecureRandom random = new SecureRandom();
            long l = Math.abs(random.nextLong());
            user.setWeight(l);
            user.setMarried(l%3==0?true:false);
            user.setAge(l%2==0?28:82);
            //將物件轉為json字串
            Gson gson = new Gson();
            String json = gson.toJson(user);
            XContentParser parser = null;
            //資料轉換
            try {
                parser = XContentFactory.xContent(XContentType.JSON).createParser(NamedXContentRegistry.EMPTY, DeprecationHandler.THROW_UNSUPPORTED_OPERATION, json);
            } catch (IOException e) {
                e.printStackTrace();
            }
            IndexRequestBuilder ir = null;
            //預插入資料
            try {
                ir = client.prepareIndex("userindex","tweet",String.valueOf(i)).setSource(parser.map());
            } catch (IOException e) {
                e.printStackTrace();
            }
            bulkRequestBuilder.add(ir);
        }
       //批量插入
        BulkResponse bulkResponse  = bulkRequestBuilder.execute().actionGet();

        //判斷插入是否失敗
        if(bulkResponse.hasFailures()){
            //失敗原因
            logger.info(bulkResponse.buildFailureMessage());
            logger.info("失敗");
        }
    }

10.按指定條件查詢

   /**
     * 按指定屬性查詢
     */
    @Test
    public void testSearchByFiled(){
        //獲取連線
        Client client = ESUtils.getClient();
        //查詢過濾器
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        //查詢條件  查詢欄位名稱  和 值
        boolQueryBuilder.must(QueryBuilders.termQuery("age",28));
        boolQueryBuilder.must(QueryBuilders.termQuery("married",true));
        //知道要查詢的索引和type
        SearchRequestBuilder searchRequestBuilder = client.prepareSearch(ESUtils.getIndexName()).setTypes(ESUtils.getTypeName());
        //設定查詢的分頁
        searchRequestBuilder.setQuery(boolQueryBuilder).setFrom(0).setSize(10000);
        //執行查詢
        SearchResponse response = searchRequestBuilder.execute().actionGet();
        //查詢結果數
        logger.info("資料總數:"+response.getHits().totalHits);
        //變數查詢結果集
        for (SearchHit hit:response.getHits()) {
            logger.info(hit.getSourceAsString());
        }
        //關閉連線
        ESUtils.closeClient(client);
    }

11.聚合資料

  /**
     * 按指定條件聚合資料(分類統計)
     */
    @Test
    public void testFacets(){
        //獲取連線
        Client client = ESUtils.getClient();
        //設定待查詢的索引和型別
        SearchRequestBuilder searchRequestBuilder = client.prepareSearch(ESUtils
        .getIndexName()).setTypes(ESUtils.getTypeName());
        //設定查詢條件
        TermsAggregationBuilder builder = AggregationBuilders
                //查詢結果集名稱
                .terms("marry")
                //要查詢的屬性名稱
                .field("age");
        searchRequestBuilder.addAggregation(builder);
        //執行查詢
        SearchResponse response = searchRequestBuilder.execute().actionGet();
        //根據設定的名字獲取查詢結果
        Terms terms = response.getAggregations().get("marry");
        List<? extends Terms.Bucket> buckets = terms.getBuckets();
        Map<String,String> map = new HashMap<String, String>();
        //聚合統計數量
        for (Terms.Bucket bucket :buckets){
            String key = bucket.getKeyAsString();
            map.put(key,bucket.getDocCount()+"");
        }
        //輸出查詢數量
        for (Map.Entry<String,String> entry : map.entrySet()){
            logger.info(entry.getKey()+":"+entry.getValue());
        }
        //關閉連線
        ESUtils.closeClient(client);
    }

12.刪除索引

/**
     * 刪除索引
     */
    @Test
    public void testDelete(){
        //獲取連線
        Client client = ESUtils.getClient();
        //判斷索引是否存在
        IndicesExistsRequest existsRequest = new IndicesExistsRequest(ESUtils.getIndexName());
        IndicesExistsResponse existsResponse = client.admin().indices().exists(existsRequest).actionGet();
        if(existsResponse.isExists()){
            //刪除
            DeleteIndexResponse deleteIndexResponse = client.admin().indices().prepareDelete(ESUtils.getIndexName()).execute().actionGet();
            if(deleteIndexResponse.isAcknowledged()){
                logger.info("刪除成功");
            }else{
                logger.info("刪除失敗");
            }
        }else {
            logger.info("索引 "+ESUtils.getIndexName()+" 不存在");
        }
        //關閉連線
        ESUtils.closeClient(client);
    }

相關推薦

elasticsearchJAVA api操作

1.建立一個mavan專案,專案的以來配置如下。 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www

ElasticSearchJava操作ElasticSearch索引之CRUD

transport delete end std testin python網絡 search ava socket 1 package com.gxy.ESChap01; 2 3 import java.net.InetAddress; 4 impor

WEB API系列WEB API的適用場景、第一個實例

區分 ltr 支持 new 序列 第一個 icontrol ada efault 在我前一篇博客中已經給各位簡單介紹了HTTP協議與RestFul API的關系,以及一些基本的HTTP協議知識,在這些知識的鋪墊下,今天,我們一起來討論一下WEB API的適用場

Redis筆記整理Java API使用與Redis分布式集群環境搭建

數據庫 NoSQL Redis [TOC] Redis筆記整理(二):Java API使用與Redis分布式集群環境搭建 Redis Java API使用(一):單機版本Redis API使用 Redis的Java API通過Jedis來進行操作,因此首先需要Jedis的第三方庫,因為使用的是M

Java併發volatile的實現原理 Java併發Java記憶體模型乾貨總結

synchronized是一個重量級的鎖,volatile通常被比喻成輕量級的synchronized volatile是一個變數修飾符,只能用來修飾變數。 volatile寫:當寫一個volatile變數時,JMM會把該執行緒對應的本地記憶體中的共享變數重新整理到主記憶體。 volatile讀:當讀一

Core JavaJava程式設計概述

Java “白皮書”的關鍵術語 簡單性 面向物件 分散式 健壯性 安全性 體系結構中立 可移植性 解釋型 高效能 多執行緒 動態性 簡單性 Java語法是C++語法的一個“純淨”版本。這裡沒有標頭檔案、

Phoenix6JAVA api 連線phoenix

1.功能作用 使用java 程式碼,連線phoenix,從而實現hbase資料庫的增刪改查。 2.配置 (1)新增mysql的maven倉庫 <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -

Spring AOP 前篇Java代理之JDK靜態代理、JDK動態代理、CGLIB動態代理

Spring AOP 前篇:Java代理之JDK靜態代理、JDK動態代理、CGLIB動態代理 該文章參考多篇文章的基礎上進行了簡化並做少許修改,方便理解。原文章地址如下: Java之代理(jdk靜態代理,jdk動態代理,cglib動態代理,aop,aspectj

bigdata資料分析Java環境配置

Java環境 1.下載jdk(用FileZilla工具連線伺服器後上傳到需要安裝的目錄) 在 /opt/deploy 下新建 java 資料夾:  # mkdir / opt/deploy /java   解壓命令:tar zxvf 壓縮包名稱 (例如:tar zxvf jdk-8u191-

Java虛擬機器Java編譯器和類載入機制

目錄 編譯時 載入 連線 初始化 類載入器 類的載入 參考: 什麼是Java虛擬機器 從Java虛擬機器所做的事情上去理解,可以分為兩個階段,編譯時和執行時。編譯時主要是一個由編譯器將原始碼譯為虛擬機器指令集的一個過程;而執行

面試題Java基礎知識

Java 基礎知識01. 面向物件的特性有哪些?答:封裝、繼承和多型。02. Java 中覆蓋和過載是什麼意思?解析:覆蓋和過載是比較重要的基礎知識點,並且容易混淆,所以面試中常見。答:覆蓋(Overr

JAVA學習JAVA開發環境的搭建

對於一門程式語言,首先要有開發環境,在這個環境之下,才能利用這門語言順利進行開發。 而一般,JAVA的開發環境我們用JDK來代表。 所以開發環境的搭建也就包含三個過程:下載,安裝和配置JDK。 1.下載JDK(java軟體開發工具包:編譯+執行),通過SUN官方網站

Java核心Java平臺的理解

從事 Java 至今已有6年有餘,再次做一次溫習並記錄於此,記得對 Java 最直觀的印象就是它宣傳的 “Write once, run anywhere”,還是目前看已經有些過於形式主義的語法呢?你對於 Java 平臺到底瞭解到什麼程度?請你先停下來總結思考一

java基礎java語法基礎

前言 上個月本來打算跳槽去帝都,面了幾家公司,已經拿到offer,但是因為畢業設計的事情沒有離職成功,在面試過程中發現了自身的許多不足,尤其是java基礎這方面,所以打算把最近整理的一些java基礎知識(大部分來自畢向東老師的總結),放到部落格中,方便以後查閱

elasticsearch安裝與配置

一、elastic search的安裝與配置 1、安裝Java 並且配置JAVA_HOME環境變數。 2、下載elasticsearch,下載地址:https://www.elastic.co/downloads/elasticsearch。博主下載時最新版為6.3.2,下面所有都是基於6.3.2進行的測

JavaEE 從入門到放棄Java EE 是個什麼東西

為什麼選擇 Java 想必有很多初學者會像我一樣,不知選擇什麼語言入門。在嘗試了 C、C++、C#、Python、PHP 後,我決定把 Java作 為第一門深入學習的程式語言。這個路著實有點長… 不過放心,你可以大膽地選擇 Java。如果說 C++ 是程式設計界

雲平臺程式設計與開發Java雲平臺服務商一覽

因為Java語言的跨平臺性和高度靈活性,成為目前雲端計算平臺的主流開發語言;所以,這裡重點討論一下Java 雲平臺的比較情況。尤其是討論X5Cloud雲平臺與現有幾個Java雲平臺的聯絡和區別:      * App Engine (http://code.google.com/appengine/)    

重拾後端之Spring BootREST API的搭建可以這樣簡單

Spring Boot 話說我當年接觸Spring的時候著實興奮了好一陣,IoC的概念當初第一次聽說,感覺有種開天眼的感覺。記得當時的web框架和如今的前端框架的局面差不多啊,都是群雄紛爭。但一晃好多年沒寫過後端,程式碼這東西最怕手生,所以當作重新學習了,順便寫個學習筆記。 Spring Boot是什麼?

深入理解java虛擬機器java記憶體區域記憶體結構劃分

圖一:java記憶體結構劃分 由上圖可知,java記憶體主要分為6部分,分別是程式計數器,虛擬機器棧,本地方法棧,堆,方法區和直接記憶體,下面將逐一詳細描述。 1、程式計數器 執行緒私有,即每個執行緒都會有一個,執行緒之間互不影響,獨立儲存。 代表著當前執行緒所執行

深入理解java虛擬機器系列java記憶體區域與記憶體溢位異常

文章主要是閱讀《深入理解java虛擬機器:JVM高階特性與最佳實踐》第二章:Java記憶體區域與記憶體溢位異常 的一些筆記以及概括。 好了開始。如果有什麼錯誤或者遺漏,歡迎指出。 一、概述 先上一張圖 這張圖主要列出了Java虛擬機器管理的記憶體的幾個區域。 常有人