【大數據】Elastic Search入門,看這一篇就夠了!

前言:Elastics Search(以後全部簡稱es)入門看這一篇就夠了?是的,看這一篇就可以學習到es從入門到使用到生產的相關核心點,但Es家族龐大,如果深入學習或者去啃的話,沒個一年半載是不可能的,所以僅這一篇也是在開玩笑了,光是Elastics Search + Logstash + Kibana (以後全部簡稱ELK)技術棧就有的學了,裏面還涉及到這三大神器的很多插件及監控工具,一言難盡,不過也不必慌,我也沒打算在ELK上花太多時間,如果僅作爲上手開發和基礎的原理掌握,搞定ELK數週內即可.本篇可以作爲學習es家族的索引或是目錄,順着這條線學習,一篇即可,否則思路會過於混亂.標題下沒內容的部分不要問,問就是暫時沒寫完!


目錄

1.基礎部分

1.1什麼是es?

1.2什麼是logstash?

1.3什麼是kinaba?

1.4ELK安裝及啓動

1.4.1Es安裝及啓動

1.4.2Logstash安裝及啓動

1.4.3Kibana安裝及啓動

1.5Es常用插件

1.5.1 Elasticsearch-head

1.5.2 Marvel

1.5.3 Graph

1.5.4 IK中文分詞器

2.進階部分

2.1數據同步

2.1.1與關係型數據庫同步

2.1.2與非關係型數據庫同步

2.1.3與消息中間件同步

2.2數據檢索

2.3數據聚合

3.實戰部分

3.1Es與SpringData結合實戰

3.2Es全文搜索項目實戰

4.昇華部分

4.1Es架構設計

4.2Es性能優化

4.3Es監控

5.總結


 

1.基礎部分

 

1.1什麼是es?

Es是一款開源的搜索服務器,底層技術用的仍是Lucene,Es和Solr都是在Luncene上進一步的封裝,根據DB-Engines的排名顯示,目前市場上搜索引擎的受歡迎度Es排第一,其次是solr,lucene.Es具有開源,分佈式,Restful,Json響應等多種天然優勢,受到各大企業青睞,這也是我把es作爲主要學習的搜索引擎的原因.關於solr和lunce簡單瞭解即可.

Lucene 簡介:https://blog.csdn.net/lovexiaotaozi/article/details/103125034

Solr 簡介:https://blog.csdn.net/lovexiaotaozi/article/details/103368154

 

1.2什麼是logstash?

logstash是es家族提供的一款日誌收集管道,可以定義數據源的輸入和輸出,數據的輸入源可以是多種,支持同時從關係型數據庫及非關係型數據庫實時採集,如下圖所示,至於採集到的數據最終輸出到哪,用戶可以自己定義,一般會輸出到es進行存儲,便於檢索及分析。

 

1.3什麼是kinaba?

kinaba是爲 Elasticsearch設計的開源分析和可視化平臺,可以用來查詢,監控,分析,簡而言之就是一款數據可視化的利器。

 

1.4ELK安裝及啓動

 

1.4.1Es安裝及啓動

①下載:https://www.elastic.co/cn/downloads/elasticsearch 根據自己環境及要求選擇版本和包類型,因爲公司電腦原因,我這裏以win64爲例,所以版本均選擇一箇中間的穩定版演示:6.8.5 (下面也這個版本,不再贅述)

②安裝:其實都是綠色版,解壓即可用,將下載後的壓縮包解壓即可。

③啓動:進入解壓後的安裝目錄,按下shift+鼠標右鍵->在此處打開命令窗口->./bin/elasticsearch.bat->敲下回車:

當你看到下面這句就是成功了,可以在瀏覽器打開訪問 http://127.0.0.1:9200驗證

 

1.4.2Logstash安裝及啓動

①下載:https://www.elastic.co/cn/downloads/logstash

②安裝:解壓即可

③啓動:在解壓後的config目錄下找到logstash-sample.conf,然後把裏面的配置內容稍作修改(置空):

input { 
    stdin {} 
} 
output { 
    stdout {} 
}

然後在解壓後的目錄下shift+鼠標右鍵->在此處打開命令窗口->鍵入 ./bin/logstash.bat -f ../config/logstash-sample.conf 

啓動成功後可以在瀏覽器輸入:http://localhost:9600/ 進行驗證。(更多配置及使用我會在接下來用到時提到,這裏能啓動即可)

 

1.4.3Kibana安裝及啓動

①下載:https://www.elastic.co/cn/downloads/kibana

②安裝:解壓即可

③啓動:進入bin目錄,雙擊kibana.bat 敲幾下回車靜候即可,看到下面這句即說明已啓動:

打開瀏覽器輸入該地址訪問即可完成驗證。

 

1.5Es常用插件

 

1.5.1 Elasticsearch-head

Elasticsearch-head是一款用來瀏覽、與Elastic Search簇進行交互的web前端展示插件,簡單來說,就是一款可以在瀏覽器方便你直接通過圖形化界面操作es的工具。

 下載地址:https://github.com/mobz/elasticsearch-head

下載後可以通過nodejs或者docker容器啓動,具體請參考github文檔,我不再贅述。

補充一句,如果你的插件無法與es連接,可以在你的es解壓目錄下的config文件夾中找到elasticsearch.yml 加入如下配置:

#-----------------------------------插件支持(es-head)----------------------------
# 是否支持跨域
http.cors.enabled: true

# *表示支持所有域名
http.cors.allow-origin: "*"

然後重啓es,啓動ok後重寫連接即可。 

 

1.5.2 Marvel

Marvel是Elasticsearch的管理和監控工具,作用可以類比spring-cloud的turbine.集羣中必須每個節點都安裝此插件。

公司電腦原因我暫時無法集羣,這塊先跳過,後補。

 

1.5.3 Graph

Graph插件一個新的用於 Elasticsearch 和 Kibana 的插件,通過它們您可以很方便的發現、理解和探索現有數據之間的關係。

環境原因,後補。

 

1.5.4 IK中文分詞器

學過Lucene或者solr的應該對IK中文分詞器比較熟悉了,是一款對中文分詞友好支撐的插件。

 

2.進階部分

 

2.1數據同步

 

2.1.1與關係型數據庫同步

這裏我僅以最常用的MySQL爲例,演示將MySQL作爲數據的輸入端,將es作爲數據的輸出端,通過logstash來打通數據的輸入和輸出。

①進入logstash解壓後的目錄->進入config文件夾->編輯logstash-sample.conf->輸入如下內容:

input {
	stdin{
	}
  jdbc {
  # mysql jdbc connection string to our backup databse  後面的test對應mysql中的test數據庫
  jdbc_connection_string => "jdbc:mysql://localhost:3306/costa-spider"
  # the user we wish to excute our statement as
  jdbc_user => "root"
  jdbc_password => "123456"
  # the path to our downloaded jdbc driver
  jdbc_driver_library => "../lib/mysql-connector-java-5.1.47.jar"
  # the name of the driver class for mysql
  jdbc_driver_class => "com.mysql.jdbc.Driver"
  jdbc_paging_enabled => "true"
  jdbc_page_size => "50000"
  #以下對應着要執行的sql的絕對路徑。
  statement => "SELECT * FROM main_material"
  #定時字段 各字段含義(由左至右)分、時、天、月、年,全部爲*默認含義爲每分鐘都更新(測試結果,不同的話請留言指出)
  schedule => "* * * * *"
  #設定ES索引類型

  }

}

output {
  elasticsearch {
    hosts => "127.0.0.1:9200"
    index => "main_material"
    document_id => "%{id}"
  }
  stdout {
   #以JSON格式輸出
   codec => json_lines
  }
}

tips1:jdbc_connection_string,指明你要連接的數據庫的url及端口號和庫名。

tips2:jdbc_driver_liblary,需要指明mysql的jdbc驅動文件路徑,這裏mysql-connector-java需要自己去mvn倉庫下載。

tips3: statement 這裏可以指定你要把哪張表裏的數據導入到es,以及是否實時同步跟新等,我這裏僅演示最基礎的,不觸發更新.

tips4:index 名字可以隨意取,對應的其實是es裏的庫名,在之後搜索時需要用到,我這裏保持與MySQL庫名一致.

tip5:document_id 文檔的id,我這裏與數據庫裏的id一一對應,以%{id}來表示即可.

②重啓logstash,觀察數據是否被導入,通過logstash的命令行觀察到select * from *** 以及導入的數據會被打印出來基本可以確定數據是否已被導入.

③打卡head插件頁面,通過查詢驗證一下:

可以發現數據已被成功從MySQL導入至ES中。 

 

2.1.2與非關係型數據庫同步

 

2.1.3與消息中間件同步

 

2.2數據檢索

關於Es數據檢索,有非常多的內容,我這裏不做演示,僅總結一下,以便在不同的場景下可以找到技術上的解決方案。也會在實戰部分結合Sringdata-es演示幾個最常用的檢索。

Es支持:

全文檢索:顧名思義,就是在被搜索文檔的全文(全字段)中尋找與搜索內容相匹配的內容。

DSL檢索:其實就是以Json格式的es語法進行檢索,可以對檢索結果加高亮,偏移,分頁等功能。

多字段檢索 (Multi-field Search):可以針對多個指定的字段進行檢索,在這些指定字段中,如果有命中被搜索內容的,會被加入查詢結果。

Boosting提升某字段得分的檢索:可以幫助實現針對某一字段的得分權重更高,比如我想搜索文章標題中包含“頭禿”的文章排序最靠前,文章內容中包含“頭禿“的文章排序次之,就可以通過boosting查詢獲得。

Bool檢索:可以使用類似AND / OR / NOT運算符來幫助檢索,類似在Mysql中where xxx = ? and xxx != ?

Fuzzy模糊檢索:不需要精確匹配搜索內容,只需要部分匹配即可,比如用戶本來想搜索beautiful girl,但一不小心打成了beautfoful girl,這種情況仍可以通過模糊檢索給用戶返回正確的搜索內容。

Wildcard Query 通配符檢索:這個就比較熟悉了,類似於Mysql的like %..%這種搜索。

正則表達式檢索:正則表達式應該都很熟悉了,這種搜索模式可以通過正則表達式來匹配被搜索內容。

匹配短語檢索:匹配短語查詢要求查詢字符串中的所有詞都存在於文檔中,對詞組在文章中出現的順序有較高要求,默認與被搜索短語順序一致,但可以手動指定偏離值。

匹配詞組前綴檢索:相當於寬泛或自動的匹配短語檢索,對單詞的順序和位置沒有嚴格要求,但對性能消耗比較大。

字符串檢索 (Query String):可以實現上面提到的幾乎全部檢索方式,查詢語法要遵循es的查詢語法,不同的是以一個字符串參數作爲查詢入參。

簡化的字符串檢索 (Simple Query String):簡化版的字符串查檢索,更適合用於暴露給用戶的單個搜索框。

Term/Terms檢索(指定字段檢索):Term搜索是針對結構化數據的,對結構化數據的指定字段進行搜索,在其中找到完全匹配的結果並返回。

Term排序檢索-(Term Query - Sorted):Term查詢和其他查詢一樣,輕鬆的實現排序。多級排序也是允許的。

範圍檢索(Range query):也是針對結構化數據的檢索,比如我要檢索出文檔中所有創建日期處於某一指定日期之內的數據。

Function 得分:Field值因子( Function Score: Field Value Factor),可以將指定字段納入得分計算的結果中,從而實現一些特殊功能,比如:想把用戶評價最高的商品排在最前面。

Function 得分:衰減函數( Function Score: Decay Functions ):功能跟上面的Field Value Factor相反,得分是根據某一字段的值降低,比如差評的商品排後面,可以藉助此功能實現。

Function得分:腳本得分( Function Score: Script Scoring ):得分可以用指定的腳本計算,比如Groovy腳本編寫的腳本。

 

2.3數據聚合

Es提供了強大的數據聚合功能,數據聚合功能賦予了es強大的大數據統計能力,通過數據聚合,我們可以做一些分析和統計工作,這塊內容比較類似Mysql的count,group by,order by ,distinct等。這裏我依舊不演示,因爲通過crul這種方式代碼量比較重,個人還是更喜歡用Spring造好的輪子去操作,把核心放在業務上,在實戰部分會有相應演示。

 

3.實戰部分

 

3.1Es與SpringData結合實戰

這裏主要簡單演示集成方法和簡單的CRUD操作,具體的操作我甚至不太想演示,因爲springdata十分強大,足夠簡單,只要你用過JPA就可以直接上手,操作起來和JPA沒啥兩樣,而且官方文檔也很給力,只要你有一點英文基礎,參照官方文檔基本上可以輕鬆上手.

關於實戰其實是最無聊的一部分,強烈建議閱讀spring官方文檔,參照文檔,不要爲了貪圖一時之快選擇網上雜七雜八的教程,這樣是學不到東西的,Spring的東西更新極快,參照網上教程雖然簡單,但版本一換指不定你就掉哪個坑裏了.

凡是不懂不要問百度,問就問 https://spring.io

官方文檔:https://docs.spring.io/spring-data/elasticsearch/docs/3.2.5.RELEASE/reference/html/

①引入依賴:spring-boot-starter-data-elasticsearch (本篇採用截止2020-3月最新的版本:3.2.5.RELEASE)

②配置連接方式:這裏我選最新的連接配置方式,原因是據說原來的EsTemplate性能不咋滴,於是spring官方重新升級了一套高級的Rest API,看名字都可以看出來...

@Configuration
public class EsConf extends AbstractElasticsearchConfiguration {
    @Override
    public RestHighLevelClient elasticsearchClient() {
        return RestClients.create(ClientConfiguration.localhost()).rest();
    }

    // no special bean creation needed

    // use the ElasticsearchEntityMapper
    @Bean
    @Override
    public EntityMapper entityMapper() {
        ElasticsearchEntityMapper entityMapper = new ElasticsearchEntityMapper(elasticsearchMappingContext(),
                new DefaultConversionService());
        entityMapper.setConversions(elasticsearchCustomConversions());

        return entityMapper;
    }

}

 ③創建實體對象,可以理解爲傳統關係型數據庫中的Model:

@Data
@Document(indexName = "item", type = "docs")
public class Item {
    @Id
    private Long id;
    @Field(type = FieldType.Text, analyzer = "ik_max_word")
    private String title;// 標題
    
    @Field(type = FieldType.Keyword)
    private String brand; // 品牌

    @Field(type = FieldType.Double)
    private Double price; // 價格
}

 ④創建Repository接口,可以理解爲傳統數據庫中的DAO層:

只要命名遵循spring提供的namespace命名規範,就可以直接使用spring封裝好的語句,無需自己再去寫查詢語句,非常方便了,和JPA一毛一樣:

public interface ItemRepository extends Repository<Item, Long> {
    List<Item> findByTitleAndPrice(String title, Double price);
    List<Item> findAllByPrice(Double price);
    Boolean deleteItemByTitle(String title);
}

⑤測試CRUD

@RunWith(SpringRunner.class)
@SpringBootTest(classes = EsSpringBootApplication.class)
public class CrudTest {
    @Resource
    ElasticsearchOperations operations;
    @Resource
    private ItemRepository repository;

    @Test
    public void crud(){
        //新增
        IndexQuery query = new IndexQueryBuilder()
                .withId(item.getId().toString())
                .withObject(item)
                .build();
        String documentId = operations.index(query);
        System.out.println("新增成功,Id是:" + documentId);
        //查詢
        List<Item> items = repository.findByTitleAndPrice("aa", 6.64);
        System.out.println(items);
        //刪除
        boolean deleted = repository.deleteItemByTitle("bb");
        System.out.println("刪除狀態:"+deleted);
        //更新
        UpdateRequest request = new UpdateRequest();
        //...
        UpdateQuery updateQuery = new UpdateQueryBuilder()
               .withId(item.getId().toString())
               .withIndexName("item")
               .withType("docs")
               .withUpdateRequest(request)
               .build();
        operations.update(updateQuery);
}

其中增刪查都比較簡單,直接利用Repository提供的namespace方法匹配就可以輕鬆實現,更新稍微複雜一點,需要用到ElasticsearchOperations,在老版本里是ElasticsearchTemplate,因爲性能問題已經不建議使用了.

這個類的使用在官方的文檔裏並沒詳細教程,所以值得注意一下.

 

3.2Es全文搜索項目實戰

目前暫時沒有項目,所以這塊暫時跳過不寫。

 

4.昇華部分

 

4.1Es架構設計

Es採用了經典的分佈式架構,採用主從模式進行數據的讀寫,跟zookeeper類似,在對臨界數據的讀寫上,採用樂觀鎖機制防止數據被誤修改,詳情可以參閱這篇,個人覺得寫得不錯:

https://www.jianshu.com/p/5b1e8d610fea

 

4.2Es性能優化

性能測試工具:esrally

①分片大小:官方建議20-40G,並沒有固定值,具體還得看業務場景和硬件條件.

②如果是基於時間的數據流,比如通過網絡爬蟲實時爬取的數據,可以在建索引時基於時間建立,方便維護.

③可以調整分片數,參照此公式:所需做大節點數=分片數*(副本數+1)https://www.elastic.co/guide/en/elasticsearch/reference/master/tune-for-search-speed.html

完整優化可參考:https://blog.csdn.net/laoyang360/article/details/97695931

 

4.3Es監控

Es監控可以用X-Pack,可以提供登陸安全防控,實時監控,可視化報告等功能。

 

5.總結

Es應該是目前市場上最主流的開源搜索引擎,對比完lucene,solr發現確實如此,而且es的生態也更加豐富,在大數據方向,elk幾乎是必學必會的技能,國內外大廠也都有基於es的應用,所以沒啥好說的,就兩個字:牛逼!持續學就完了。


最後:如果你要深入學習Es,特別推薦一篇包羅萬象的博客:https://blog.csdn.net/laoyang360/article/details/52244917

GitHub:https://github.com/elastic/elasticsearch

ES中文網,Es下載,中文文檔等:https://www.elastic.co/cn/

有問題可以上Es中文社區:https://elasticsearch.cn/

如果本篇有幫助到你別忘了點個贊,文中若有任何不正之處也歡迎留言斧正,謝謝~

 

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