說明
- 最近工作需要調研數據搜索相關技術,可選的只有Elasticsearch和solr,比較發現Elasticsearch更加符合場景需要。
介紹
- Elasticsearch 基於Apache Lucene開發的開源分佈式、高擴展、高實時的搜索與數據分析引擎。基於RESTful web接口,提供一個分佈式多用戶能力的全文搜索引擎。
- Elasticsearch是用Java語言開發的,是一種流行的企業級搜索引擎,應用於搜索各種文檔,提供擴展功能,具有接近實時的搜索效率,支持多租戶。可以擴展到上百臺服務器,處理PB級別的數據,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便。
- 客戶端支持Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby等語言開發。
- 同類型產品solor(同樣基於Apache Lucene)
發展史
- Elasticsearch BV成立於2012年,主要圍繞Elasticsearch及相關軟件提供商業服務和產品。2014年6月,在成立公司18個月後,該公司宣佈通過C輪融資籌集7000萬美元。這輪融資由新企業協會(NEA)牽頭。其他投資者包括Benchmark Capital和Index Ventures。這一輪融資總計1.04億美元
- 2015年3月,Elasticsearch公司更名爲Elastic。
- 2018年6月,Elastic提交了首次公開募股申請,估值在15億到30億美元之間。公司於2018年10月5日在紐約證券交易所掛牌上市。一些組織將Elasticsearch作爲託管服務提供。這些託管服務提供託管、部署、備份和其他支持。大多數託管服務還包括對Kibana的支持。
產品應用
- 2013年初,GitHub拋棄了Solr,採取ElasticSearch 來做PB級的搜索。 “GitHub使用ElasticSearch搜索20TB的數據,包括13億文件和1300億行代碼”
- 維基百科:啓動以elasticsearch爲基礎的核心搜索架構
- SoundCloud:“SoundCloud使用ElasticSearch爲1.8億用戶提供即時而精準的音樂搜索服務”
- 百度:百度目前廣泛使用ElasticSearch作爲文本數據分析,採集百度所有服務器上的各類指標數據及用戶自定義數據,通過對各種數據進行多維分析展示,輔助定位分析實例異常或業務層面異常。目前覆蓋百度內部20多個業務線(包括casio、雲分析、網盟、預測、文庫、直達號、錢包、風控等),單集羣最大100臺機器,200個ES節點,每天導入30TB+數據
- 新浪使用ES 分析處理32億條實時日誌
- 阿里使用ES 構建挖財自己的日誌採集和分析體系
資料
官方
- Elasticsearch 官網 報價,演示版本7.10.1
- 軟件下載官方提供多種版本普通版、Elastic版(ecctl)、No Jdk版、OSS版、OSS No Jdk版
- alpha 預覽版bug較多
- Beta 修復重大bug,有少量小問題
- Legacy 遺留老版本穩定版
- Kibana 收費可視化工具,查看和管理Elasticsearch 版本與安裝包一致
- 官方安裝文檔
- 中文文檔 部分內容老舊,建議查閱官方文檔
插件
端口說明
- 9300 tcp通信端口
- 9200 http協議端口
基本概念
index索引
- index是數據管理的頂層單位,Elasticsearch會索引所有所有字段,索引、搜索、更新、刪除數據的時候,都會用到索引,索引名:必須全部是<span style="color:red;font-weight:bold">小寫</span>字母,它是單個數據庫,可類比mysql中的數據庫
type類型
- 一個索引中,你可以定義一種或多種類型。該屬性在新版本中被刪除了。一個類型是你的索引的一個邏輯上的分類/分區。通常,會爲具有一組共同字段的文檔定義一個類型。比如說,我們假設你運營一個博客平臺並且將你所有的數據存儲到一個索引中。在這個索引中,你可以爲用戶數據定義一個類型,爲博客數據定義另一個類型,可類比mysql中的表。
id
- 和type對應,字符串類型,是id的唯一標識。
mapping 定義數據結構
- mapping是限制處理數據的方式和規則,如某個字段的數據類型、默認值、分析器、是否被索引等,都是可以通過映射設置,另外處理esearch裏面數據的一些使用規則設置也叫做映射。因爲按最優規則處理數據對性能提高很大,因此才需要建立映射,並且需要思考如何建立映射才能對性能更好。相當於mysql中,設置表的主鍵外鍵等,類比表結構
filed字段
- 相當於mysql 數據表的字段,對文檔數據根據不同屬性進行的分類標識 。
document文檔
- 一個文檔是一個可被索引的基礎信息單元,文檔以JSON(Javascript Object Notation)格式來表示,在一個index/type裏面,你可以存儲任意多的文檔。插入索引庫以文檔爲單位,類比與數據庫中的一行數據
分佈式
cluster 集羣
- 一個集羣就是由一個或多個節點組織在一起,它們共同持有所有數據,並提供索引和搜索功能。一個集羣由一個唯一的名字標識默認“elasticsearch”。一個節點只能通過指定某個集 羣的名字,來加入這個集羣。
node 節點
- 節點是集羣中的一個服務器,作爲集羣的一部分,它存儲數據,參與集羣的索引和搜索功能。一個節點由一個名字來標識,默認情況下,名字是一個隨機的漫威漫畫角色的名字,這個名字會在啓動時賦予節點,該名字在集羣中唯一,以便cluster管理。默認情況下,只啓動一個節點,默認創建並加入一個叫做“elasticsearch”的集羣。
shared 分片
- 一個索引可以存儲超出單個結點硬件限制的大量數據。比如,一個具有10億文檔的索引佔據1TB的磁盤空間,而任一節點都沒有這樣大的磁盤空間;或者單個節點處理搜索請求,響應太慢。爲了解決這個問題,Elasticsearch提供了將索引劃分成多份的能力,這個過程叫做分片。當你創建一個索引的時候,你可以指定你想要的分片的數量。每個分片本身也是一個功能完善並且獨立的“索引”,這個“索引”可以被放置到集羣中的任何節點上。分片很重要,主要有兩方面的原因: *
- 允許你水平分割/擴展你的內容容量。
- 允許你在分片(潛在地,位於多個節點上)之上進行分佈式的、並行的操作,進而提高性能/吞吐量。
replicas 複製
- 在一個網絡/雲的環境裏,失敗隨時都可能發生,在某個分片/節點因未知原因處於離線狀態或消失,這種情況下,有一個故障轉移機制是非常有用並且是強烈推薦的。Elasticsearch爲此允許創建分片的一份或多份拷貝,這些拷貝叫做複製分片,原有分片爲主分片。有了複製分片既可以防止單節點故障,也可以並行計算單元增強搜索和吞吐量。
- 默認情況下,Elasticsearch中的每個索引被分片5個主分片和1個複製,這意味着,如果你的集羣中至少有兩個節點,你的索引將會有5個主分片和另外5個複製分片(1個完全拷貝),這樣的話每個索引總共就有10個分片。
使用方法
- 用戶將數據提交到Elasticsearch 數據庫中,再通過分詞控制器去將對應的語句分詞,將其權重和分詞結果一併存入數據
- 用戶搜索數據時候,再根據權重將結果排名,打分,再將返回結果呈現給用戶。
安裝步驟
下載安裝包
- 下載安裝包
安裝
- 解壓到安裝目錄即可
插件
分詞器ik
-
下載安裝包地址和安裝版本對應
-
解壓,將解壓後的elasticsearch文件夾拷貝到elasticsearch-7.10.1\plugins下,並重命名文件夾爲analysis-ik (避免重名)
-
本地詞庫:
- 分詞文件plugins\elasticsearch-analysis-ik\config*.dic
- 分詞配置文件:plugins\elasticsearch-analysis-ik\config\IKAnalyzer.cfg.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <comment>IK Analyzer 擴展配置</comment> <!--用戶可以在這裏配置自己的擴展字典 --> <entry key="ext_dict"></entry> <!--用戶可以在這裏配置自己的擴展停止詞字典--> <entry key="ext_stopwords"></entry> <!--用戶可以在這裏配置遠程擴展字典 --> <!-- <entry key="remote_ext_dict">words_location</entry> --> <!--用戶可以在這裏配置遠程擴展停止詞字典--> <!-- <entry key="remote_ext_stopwords">words_location</entry> --> </properties>
-
驗證:IK提供兩種分詞ik_smart(最粗粒度的拆分)和ik_max_word(做最細粒度的拆分)
- 請求:
http://127.0.0.1:9200/_analyze
- 請求體:
{"analyzer":"ik_smart","text":"我是程序員"
- 請求體:
{"analyzer":"ik_max_word","text":"我是程序員"
- 請求:
kibana
- 下載 與elasticSearch版本一致,node開發實現
- 安裝
- 解壓到安裝目錄
- config/kibana.yml 設置服務啓動端口和esearch地址
- 啓動
- bin/kibana.bat 啓動即可
- 驗證
配置
- 指定jdk,修改bin/elasticsearch-env.bat文件,指定安裝包自帶jdk
set JAVA_HOME=D:\test\elasticsearch-7.8.0\jdk
,路徑不要有中文 - 修改jvm,conf\jvm.option
- 修改conf\elasticsearch.yml文件末尾添加,目的是使ES支持跨域請求
http.cors.enabled: true
http.cors.allow-origin: "*"
network.host: 127.0.0.1
啓動
- 解壓即可安裝使用,bin目錄運行elasticsearch.bat文件即可
驗證
- 啓動後本地驗證http://localhost:9200/
Elasticsearch和solr對比
對比項 | ElasticSearch | solr |
---|---|---|
分佈式管理 | 自帶分佈式管理功能 | zookeeper |
數據格式 | 僅支持json | 多種數據格式 |
官方功能 | 注重核心功能,高級功能第三方插件提供 | 官方提供功能多 |
搜索應用 | 實時搜索應用 | 傳統搜索應用 |
總結
- Elasticsearch本質上還是數據庫,相比普通的關係型數據,功能更加靈活,數據量更大,支持比sql更復雜的規則查詢,在搜索引擎或實時數據處理分析方面有很好的應用場景。