如今有一個需求,創建一個知識庫,可以對 PDF、doc、excel 類型的資料進行全文搜索。知識庫實際上是一個信息檢索系統(以下圖所示),好比搜索引擎,要經過爬蟲採集信息、根據規則索引信息、根據用戶的查詢請求返回信息。html
經常使用的全文搜索引擎有 Elasticsearch 和 Solr 兩種,它們都是基於 Apache Lucene 開發而成的。Lucene 則是一個 Java 庫,直接使用 Lucene 有一些弊端,好比 Lucene 的使用比較複雜,須要將 Lucene 直接集成到應用程序中等。node
Elasticsearch 和 Solr 都是基於 Lucene 開發的,它們隱藏了 Lucene 的複雜性,並具備更優秀的特性。至於選擇 Elasticsearch 仍是 Solr 能夠看這篇文章:全文搜索引擎 ElasticSearch 仍是 Solr?。git
索引是構成搜索引擎的核心技術之一,信息檢索系統使用倒排索引的方式來存儲數據。github
索引就像是一本書的目錄,目錄中包含章節名和頁碼。經過目錄咱們能夠快速定位到文章內容。倒排索引就像是書後面的術語列表,它會列出一個術語在書中的哪些地方出現過。shell
再舉一個例子,有下面這樣一個文檔。咱們但願輸入關鍵字以後,信息檢索系統可以告訴咱們哪幾個文檔包含了輸入的關鍵字。數據庫
系統會先將文檔進行分詞,就像書後面的術語表同樣,剔除一些助詞,好比:的、得、地,剔除一些沒有意義的組合,好比:人工智能這個四個字中,「人工」是一個詞,「智能」是一個詞,「工智」就不是一個詞。這個咱們能夠經過開源的分詞器來完成。apache
經過分詞器,咱們能夠把文檔中的內容劃分紅一個個詞項,並統計詞項在文檔中出現的頻率。好比 Elasticsearch 這個詞分別在文檔 一、文檔 二、文檔 3 中出現了 3 次。因此它的詞頻是 3,倒排記錄表爲1:1->2:0->3:0
,詞頻同時也是倒排記錄表的長度。json
Elasticsearch 中的倒排列表(Posting List)記錄了單詞對應的文檔結合,由倒排索引項(Posting)組成 ,它包括如下 4 項內容:安全
倒排索引是存儲信息的一種方式,講到索引咱們也很容易想到 MySQL、Oracle 數據庫,那麼爲何不用關係型數據庫來存儲文檔,並對其進行檢索,而用倒排索引呢?緣由有如下幾點:服務器
Elasticsearch 是一個分佈式的開源搜索和分析引擎,適用於全部類型的數據,包括文本、數字、地理空間、結構化和非結構化數據。Elasticsearch 在 Apache Lucene 的基礎上開發而成,由 Elasticsearch N.V.(即如今的 Elastic)於 2010 年首次發佈。Elasticsearch 以其簡單的 REST 風格 API、分佈式特性、速度和可擴展性而聞名,是 Elastic Stack 的核心組件;Elastic Stack 是適用於數據採集、充實、存儲、分析和可視化的一組開源工具。人們一般將 Elastic Stack 稱爲 ELK Stack(代指 Elasticsearch、Logstash 和 Kibana),目前 Elastic Stack 包括一系列豐富的輕量型數據採集代理,這些代理統稱爲 Beats,可用來向 Elasticsearch 發送數據。
Elasticsearch 在速度和可擴展性方面都表現出色,並且還可以索引多種類型的內容,這意味着其可用於多種用例:應用程序搜索、網站搜索、企業搜索、日誌處理和分析、基礎設施指標和容器監測、應用程序性能監測、地理空間數據分析和可視化、安全分析、業務分析。
原始數據會從多個來源(包括日誌、系統指標和網絡應用程序)輸入到 Elasticsearch 中。數據採集指在 Elasticsearch 中進行索引以前解析、標準化並充實這些原始數據的過程。這些數據在 Elasticsearch 中索引完成以後,用戶即可針對他們的數據運行復雜的查詢,並使用聚合來檢索自身數據的複雜彙總。在 Kibana 中,用戶能夠基於本身的數據建立強大的可視化,分享儀表板,並對 Elastic Stack 進行管理。
以上內容摘自官網:什麼是 Elasticsearch?
5.X 新特性:Elasticsearch 的版本從 2.x 直接跳到 5.x 是爲了使 ELK 套件的版本統一,從 5.x 以後 ELK 都推薦使用統一的版本。5.x 基於 Lucene 6.x,默認打分機制從 TF-IDF 改成 BM 25。支持 Ingest 節點 / Painless Scripting / Comletion suggested 支持 / 原生 Java REST 客戶端。
6.x 新特性基於 Lucene 7.x,支持跨集羣複製(CCR) 、索引生命週期管理 、SQL 的支持,全新的基於操做的數據複製框架,可加快恢復數據。
7.x 新特性基於 Lucene 8.0,正式廢除單個索引下多 Type 的支持,7.1 開始,Security 功能免費使用。同時提供了 ECK(Elasticsearch Operator on Kubernetes )、New Cluster coordiantion 、Feature-Complete High level REST Client 、Scpipt Score Query 等新特性。
目前(2019年12月1日)最新版本是7.4.2,7.x 作了很大的升級,推薦直接使用 7.x 版本。
ELK」是三個開源項目的首字母縮寫,這三個項目分別是:Elasticsearch、Logstash 和 Kibana。Elasticsearch 是一個搜索和分析引擎。Logstash 是服務器端數據處理管道,可以同時從多個來源採集數據,轉換數據,而後將數據發送到諸如 Elasticsearch 等「存儲庫」中。Kibana 則可讓用戶在 Elasticsearch 中使用圖形和圖表對數據進行可視化。
什麼是 ELK Stack?——很簡單,指的就是 Elastic Stack。
ELK 使用場景
Elasticsearch 支持大部系統,具體能夠在 Support Matrix 中查看。Elasticsearch 的安裝能夠查看 Installing Elasticsearch,我用的是當前(2019年12月1日)最新的版本 7.4.2。安裝完成以後的目錄結構,以下圖所示:
啓動 Elasticsearch 可使用 bin/elasticsearch
命令,再經過 http://localhost:9200/
訪問,看到下面這樣的信息就表示啓動成功。
{ "name" : "shuiyujiedeMacBook-Pro.local", "cluster_name" : "elasticsearch", "cluster_uuid" : "zBcJ9WboQ9e96xXNMxEHwg", "version" : { "number" : "7.4.2", "build_flavor" : "default", "build_type" : "tar", "build_hash" : "2f90bbf7b93631e52bafb59b3b049cb44ec25e96", "build_date" : "2019-10-28T20:40:44.881551Z", "build_snapshot" : false, "lucene_version" : "8.2.0", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search" }
ELK 都支持插件,使用 bin/elasticsearch-plugin list
查看本機安裝了哪些插件,也可使用 http://localhost:9200/_cat/plugins
來查看插件。安裝插件則使用 install 命令,如:bin/elasticsearch-plugin install analysis-icu
。
若是想要啓動多個實例,則可使用以下的方式:
# 啓動單節點 bin/elasticsearch -E node.name=node0 -E cluster.name=geektime -E path.data=node0_data # 多實例 bin/elasticsearch -E node.name=node1 -E cluster.name=geektime -E path.data=node1_data bin/elasticsearch -E node.name=node2 -E cluster.name=geektime -E path.data=node2_data bin/elasticsearch -E node.name=node3 -E cluster.name=geektime -E path.data=node3_data # 刪除進程 ps grep | elasticsearch | kill pid
Kibana 則可讓用戶在 Elasticsearch 中使用圖形和圖表對數據進行可視化。咱們能夠在這裏下載Kibana。跟隨文檔提供的 Installation steps 能夠啓動 Kibana。
Kibana 的使用步驟能夠查看這個文檔:Set up Kibana。這裏提兩點,第一點關於插件,ELK 都支持插件對功能進行擴展。可使用bin/kibana-plugin list
查看插件。更多插件相關內容能夠查閱 Know Plugins。
第二點關於漢化,須要在配置文件 kibana.yml
中加入i18n.locale: "zh-CN"
。
Logstash 是服務器端數據處理管道,可以同時從多個來源採集數據,轉換數據,而後將數據發送到諸如 Elasticsearch 等「存儲庫」中。
Logstash 的使用也是大同小異,下載 Logstash 的安裝包,具體能夠查看 Logstash Reference。咱們能夠下載 MovieLens 這個數據集,接着在 movielens/logstash.conf
文件中配置 csv 文件的地址,經過 Logstash 將數據導入到 Elasticsearch。