Elasticsearch初步學習

  上個月IT界比較熱門的感覺是Elasticsearch(後面簡稱ES)上市,最開始是在微信公衆號看到的消息,剛開始只是當成八卦新聞看,也沒有想到後面自己會使用到,因爲搜索引擎感覺自己也不可能用到。後來發現工作中確實會使用到ES,也就開始學習,真的是很巧合。

  最開始就是安裝 ES,因爲這裏使用的macOS,所以安裝也是也沒有在Windows上面麻煩,就是到官網下載壓縮包,解壓到指定的目錄,就完成安裝了。官網下載地址如下:https://www.elastic.co/downloads/elasticsearch。還有就是要注意,安裝ES要先安裝java,版本還要是1.8之後的版本。

  安裝完ES,還需要安裝一個插件,這個插件是爲了簡單的瀏覽ES服務器的一些信息,插件名字叫elasticsearch-head,安裝這個插件需要先安裝node.js。安裝也是和上面一樣,就是需要將路徑添加到配置文件中,後來發現谷歌瀏覽器也有這個插件,直接搜索名字就可以了(需要翻牆,可以看之前的博客)。

  ES安裝成功後,直接在瀏覽器輸入 localhost:9200出現下面的情況就是安裝成功。

  安裝完畢,下面開始簡單的解釋一下ES的一些基本信息。

  ElasticSearch是一個基於Lucene的搜索服務器。它提供了一個分佈式多用戶能力的全文搜索引擎,基於RESTful web接口。Elasticsearch是用Java開發的,並作爲Apache許可條款下的開放源碼發佈,是當前流行的企業級搜索引擎。設計用於雲計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便。

  上面就是百度百科對於ES的介紹,不難看出幾個重要的地方,分佈式、java、全文搜索、開源。

  介紹完了ES的大致情況,下面就開始介紹一下ES的基本概念。

  Node:節點、Cluster:集羣、Index:索引、Document:文檔、Type:類型。下面就介紹一下這些概念。節點是ES的一個實例,多個節點又形成了集羣,索引對應着關係型數據庫概念中的數據庫,一個索引下面有很多的很多的文檔,文檔就是一條記錄,類型就是將這些文檔按照一些規則分組,類型類似於關係型數據庫概念中的table。

  以上就是一些基礎的概念,這裏因爲篇幅的原因無法詳細介紹。後面會貼出一些詳細介紹的網站。

  下面開始簡單的一個小練習。

  例子也是和SpringBoot整合,因爲最近也在學習SpringBoot,所以例子就是這樣。

  開始是導入依賴:

<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>6.4.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.elasticsearch.client/transport -->
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>transport</artifactId>
    <version>6.4.2</version>
</dependency>
<dependency>
    <groupId>org.elasticsearch.plugin</groupId>
    <artifactId>transport-netty4-client</artifactId>
    <version>6.4.2</version>
</dependency>

  這裏要注意項目使用依賴的版本,添加完依賴,在添加配置文件和配置就可以了。

elasticsearch:
  ip: 192.168.22.208
  port: 9300
  pool: 1
  cluster:
    name: elasticsearch

  上面是ES的一些配置,下面就是配置文件。配置文件主要配置了一些關係連接的東西,比如連接池、集羣地址、端口之類的。配置文件如下:

package com.main.huajieenvironservice.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("${elasticsearch.ip}")
    private String hostName;

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

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

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

    /**
     * Bean name default  函數名字
     * @return
     */
    @Bean(name = "transportClient")
    public TransportClient transportClient() {
        LOGGER.info("Elasticsearch初始化開始。。。。。");
        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(poolSize))//增加線程池個數,暫時設爲5
                    .build();
            //配置信息Settings自定義
            transportClient = new PreBuiltTransportClient(esSetting);
            TransportAddress transportAddress = new TransportAddress(InetAddress.getByName(hostName), Integer.valueOf(port));
            transportClient.addTransportAddresses(transportAddress);
        } catch (Exception e) {
            LOGGER.error("elasticsearch TransportClient create error!!", e);
        }
        return transportClient;
    }
}

  因爲是簡單的測試,所以沒有寫太多的東西,就是簡單的驗證一下index是否存在。代碼如下:

@RequestMapping("/indexIsExists")
@ResponseBody
@ApiOperation(value = "驗證輸入的index是否存在", notes = "輸入index,返回該index是否存在")
public Map<String, Object> findVideoUrl(String index) {

    Map<String, Object> stringObjectMap = new HashMap<>();
    boolean result = transportClient.admin().indices().prepareExists(index).execute().actionGet().isExists();
    System.err.println(result);
    stringObjectMap.put("result", result);
    return stringObjectMap;
}

  以上就是簡單的一個ES的小測試,後面也會寫一些基本的應用。下面談談自己的一些理解。

  因爲自己目前對於這個ES理解的還是不夠明白,所以一些理解看起開都是比較短淺的。我認爲這個ES和MongoDB沒有很大的差別,但是兩者的原理和核心可能不太一樣。都說ES比MongoDB要快的多,因爲現在對於MongoDB和ES的使用都是初級階段,所以這兩者的區別暫時還不是很清楚,還是要看下一步的使用。

  ES的練習教程:https://www.sojson.com/blog/81.html

  ES的詳細介紹:https://www.sojson.com/blog/91.html

  寫完的Demo的GitHub地址:https://github.com/qq1162210866/SpringBootTrain.git

  就這樣吧,結束。

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