Springboot2.x集成ElasticSearch

springboot2.x集成es

首先導入我們的pom依賴

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-test</artifactId>
     <scope>test</scope>
 </dependency>
 <!--引入ELasticSearch的依賴包-->
<dependency>
	   <groupId>org.springframework.boot</groupId>
	   <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

<!--轉json的工具包,個人愛好,也可以用別的-->
 <dependency>
       <groupId>com.google.code.gson</groupId>
       <artifactId>gson</artifactId>
       <version>2.8.5</version>
 </dependency>

然後我們把我們的es的信息配置到yml文件中

server:
  port: 80

es:
  ip: 192.168.1.9
  port: 9300
  #連接池
  pool: 5
  #集羣名字
  cluster:
    name: my-application

因爲這裏配置了集羣節點名,所以需要在我們的config配置文件中修改我們的elasticSearch.yml配置文件
在這裏插入圖片描述
讀取yml信息,根據配置文件啓動es客戶端的配置類

package com.xy.elasticsearch.config;

import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.net.InetAddress;

@Configuration
public class ElasticsearchConfig {

    private static final Logger LOGGER = LoggerFactory.getLogger(ElasticsearchConfig.class);

    /**
     * elk集羣地址
     */
    @Value("${es.ip}")
    private String ip;

    /**
     * 端口
     */
    @Value("${es.port}")
    private String port;

    /**
     * 集羣名稱
     */
    @Value("${es.cluster.name}")
    private String clusterName;

    /**
     * 連接池
     */
    @Value("${es.pool}")
    private String pool;

    /**
     * Bean name default  函數名字
     *
     * @return
     */
    @Bean(name = "transportClient")
    public TransportClient transportClient() {

        TransportClient transportClient = null;
        try {
            // 配置信息
            Settings esSetting = Settings.builder()
                    .put("cluster.name", clusterName) //集羣名字
                    .put("client.transport.sniff", true)//增加嗅探機制,找到ES集羣
                    .put("thread_pool.search.size", Integer.parseInt(pool))//增加線程池個數,暫時設爲5
                    .build();
            //配置信息Settings自定義
            transportClient = new PreBuiltTransportClient(esSetting);
            TransportAddress transportAddress = new TransportAddress(InetAddress.getByName(ip), Integer.valueOf(port));
            transportClient.addTransportAddresses(transportAddress);
        } catch (Exception e) {
            LOGGER.error("elasticsearch TransportClient create error!!", e);
        }
        return transportClient;
    }
}

ElasticSearch客戶端提供了多種方式的數據創建方式,包括json串,map,內置工具;我們正式開始一般用json格式,藉助json工具框架,比如gson ,json-lib,fastjson等等;

然後我們簡單測試一些數據,先增加一些json數據進去,然後用junit測試一下

package com.xy.elasticsearch;

import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.json.JSONArray;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
class ElasticsearchApplicationTests {


    @Autowired
    private TransportClient client;

    /**
     * 創建索引 添加文檔
     * @throws Exception
     */
    @Test
    public void testIndex() {

        JsonArray jsonArray=new JsonArray();

        JsonObject jsonObject=new JsonObject();
        jsonObject.addProperty("title", "哪吒之魔童降世");
        jsonObject.addProperty("publishDate", "2019-07-26");
        jsonObject.addProperty("content", "天地靈氣孕育出一顆能量巨大的混元珠,元始天尊將混元珠提煉成靈珠和魔丸,靈珠投胎爲人,助周伐紂時可堪大用;而魔丸則會誕出魔王,爲禍人間。元始天尊啓動了天劫咒語,3年後天雷將會降臨,摧毀魔丸。太乙受命將靈珠託生於陳塘關李靖家的兒子哪吒身上。然而陰差陽錯,靈珠和魔丸竟然被掉包。本應是靈珠英雄的哪吒卻成了混世大魔王。調皮搗蛋頑劣不堪的哪吒卻徒有一顆做英雄的心。然而面對衆人對魔丸的誤解和即將來臨的天雷的降臨,哪吒是否命中註定會立地成魔?他將何去何從?");
        jsonObject.addProperty("director", "餃子");
        jsonObject.addProperty("price", "35");
        jsonArray.add(jsonObject);


        JsonObject jsonObject2=new JsonObject();
        jsonObject2.addProperty("title", "寄生蟲");
        jsonObject2.addProperty("publishDate", "2019-10-11");
        jsonObject2.addProperty("content", "《寄生蟲》講述一家四口全是無業遊民的爸爸基澤(宋康昊飾)成天遊手好閒,直到積極向上的長子基宇(崔宇植飾)靠着僞造的文憑來到富豪樸社長(李善均飾)的家應徵家教,兩個天差地遠的家庭因而被捲入一連串意外事件中");
        jsonObject2.addProperty("director", "奉俊昊");
        jsonObject2.addProperty("price", "45");
        jsonArray.add(jsonObject2);

        JsonObject jsonObject3=new JsonObject();
        jsonObject3.addProperty("title", "送我上青雲");
        jsonObject3.addProperty("publishDate", "2019-08-16");
        jsonObject3.addProperty("content", "《女記者盛男(姚晨飾),心高氣傲,個性剛硬,渴望真愛仍孑然一身,懷抱理想卻屢屢在現實中碰壁。盛男意外地患上了卵巢癌,爲了籌得手術費,她不得不接受一份自己不喜歡的工作,爲一位企業家的父親寫自傳,也因此踏上一段尋求愛慾亦是尋找自我的旅程。");
        jsonObject3.addProperty("director", "滕叢叢");
        jsonObject3.addProperty("price", "55");
        jsonArray.add(jsonObject3);

        JsonObject jsonObject4=new JsonObject();
        jsonObject4.addProperty("title", "復仇者聯盟4");
        jsonObject4.addProperty("publishDate", "2019-04-14");
        jsonObject4.addProperty("content", "來自泰坦星的滅霸(喬什·布洛林飾)爲了解決宇宙資源匱乏、人口暴增的問題,集齊6顆無限寶石,一個響指讓全宇宙生命公平隨機的減半。宇宙由於瘋狂的泰坦滅霸的行動而變得滿目瘡痍,在泰坦星與滅霸決戰失敗的鋼鐵俠(小羅伯特·唐尼飾)孤身一人漂流宇宙,迷失在量子領域的蟻人(保羅·路德飾)意外回到現實世界,他的出現爲倖存的復仇者們點燃了希望。無論前方將遭遇怎樣的後果,倖存的超級英雄們都必須在剩餘盟友的幫助下再一次集結,以逆轉滅霸的所作所爲,徹底恢復宇宙的秩序。");
        jsonObject4.addProperty("director", "喬·羅素安東尼·羅素");
        jsonObject4.addProperty("price", "35");
        jsonArray.add(jsonObject4);

        JsonObject jsonObject5=new JsonObject();
        jsonObject5.addProperty("title", "蜘蛛俠:英雄遠征");
        jsonObject5.addProperty("publishDate", "2019-06-28");
        jsonObject5.addProperty("content", "在復仇者聯盟衆英雄的努力下,於滅霸無限手套事件中化作爲灰燼的人們,重新回到了人世間,曾經消失的蜘蛛俠 彼得帕克 也迴歸到了普通的生活之中,數月後,蜘蛛俠彼得帕克所在的學校舉行了歐洲旅遊,帕克也在其中, 在歐州威尼斯旅行時,一個巨大無比的水怪襲擊了威尼斯,不敵敵人的蜘蛛俠幸得一位自稱神祕客的男子搭救才擊退敵人,之後 神盾局局長找上正在旅遊的彼得帕克並要求其加入神盾局,並安排神祕客協助帕克,神祕客自稱來自其他宇宙,並告知一羣名爲元素衆的邪惡勢力已經入侵這個宇宙了,爲了守護來之不易的和平,蜘蛛俠決定與神祕客聯手,然而在神祕客那頭罩之中,似乎隱藏着什麼不爲人知的真相……");
        jsonObject5.addProperty("director", "喬·沃茨");
        jsonObject5.addProperty("price", "38");
        jsonArray.add(jsonObject5);

        JsonObject jsonObject6=new JsonObject();
        jsonObject6.addProperty("title", "羅小黑戰記");
        jsonObject6.addProperty("publishDate", "2019-09-07");
        jsonObject6.addProperty("content", "在熙攘的人類世界裏,很多妖精隱匿其中,他們與人類相安無事地生活着。貓妖羅小黑因爲家園被破壞,開始了它的流浪之旅。這場旅途中惺惺相惜的妖精同類與和諧包容的人類夥伴相繼出現,讓小黑陷入了兩難抉擇,究竟何處纔是真正的歸屬 [3]  ?");
        jsonObject6.addProperty("director", "MTJJ");
        jsonObject6.addProperty("price", "38");
        jsonArray.add(jsonObject6);

        for(int i=0;i<jsonArray.size();i++){
            JsonObject jo=jsonArray.get(i).getAsJsonObject();
            IndexResponse response=client.prepareIndex("film", "new")
                    .setSource(jo.toString(), XContentType.JSON).get();
            System.out.println("索引名稱:"+response.getIndex());
            System.out.println("類型:"+response.getType());
            System.out.println("文檔ID:"+response.getId());
            System.out.println("當前實例狀態:"+response.status());
        }
    }

    /**
     * 查詢所有
     * @throws Exception
     */
    @Test
    public void searchAll()throws Exception{
        SearchRequestBuilder srb=client.prepareSearch("film").setTypes("new");
        SearchResponse sr=srb.setQuery(QueryBuilders.matchAllQuery()).execute().actionGet(); // 查詢所有
        SearchHits hits=sr.getHits();
        for(SearchHit hit:hits){
            System.out.println(hit.getSourceAsString());
        }
    }
}

然後我們可以在header插件中看到我們剛剛插入的數據
在這裏插入圖片描述
然後運行我們的查詢方法,也能查詢到我們的數據
在這裏插入圖片描述
後面我會專門整理一篇博客來記錄es的其他常用操作

end…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章