分類信息系統(tǒng)網(wǎng)站模板張家港seo建站
ElasticSearch基礎(chǔ)概念以及可視化界面安裝
文章目錄
- ElasticSearch基礎(chǔ)概念以及可視化界面安裝
- 1、引言
- 2、基本概念
- 3、倒排索引機(jī)制
- 3.1、倒排索引
- 4、使用docker安裝ElasticSearch
- 4.1、下載鏡像文件
- 4.2 、創(chuàng)建實(shí)例,啟動(dòng)es
- 5.安裝Kibana
1、引言
Elastic 的底層是開源庫 Lucene。但是,你沒法直接用 Lucene,必須自己寫代碼去調(diào)用它的 接口。Elastic 是 Lucene 的封裝,提供了 REST API 的操作接口,開箱即用。 是一種搜索引擎,依靠分詞等多種方式實(shí)現(xiàn)許多數(shù)據(jù)庫不能實(shí)現(xiàn)的搜索場景。
REST API:天然的跨平臺(tái)。
官方文檔:ES官方文檔
官方中文:官方中文版文檔
社區(qū)中文:
https://es.xiaoleilu.com/index.html
http://doc.codingdict.com/elasticsearch/0/
2、基本概念
Index
:索引,相當(dāng)于關(guān)系數(shù)據(jù)庫中的database概念,是一類數(shù)據(jù)的集合,是一個(gè)邏輯概念。Type
:類型,相當(dāng)于數(shù)據(jù)庫中的table概念,在6.0版本之前,一個(gè)Index中可以有多個(gè)type
,7.0版本后徹底廢棄多type,每個(gè)索引只能有一個(gè)type,即“ _doc”。這個(gè)概念就不用太關(guān)注了。Document
:文檔,存儲(chǔ)在ES中的主要實(shí)體叫文檔,可以理解為關(guān)系型數(shù)據(jù)庫中表的一行數(shù)據(jù)記錄。每個(gè)文檔由多個(gè)字段(field
)組成。區(qū)別于關(guān)系型數(shù)據(jù)庫的是,ES是一個(gè)非結(jié)構(gòu)化的數(shù)據(jù)庫,每個(gè)文檔可以有不同的字段,并且有一個(gè)唯一標(biāo)識(shí)。文檔是Json格式的。Field
:字段,存在于文檔中,字段是包含數(shù)據(jù)的鍵值對(duì),可以理解為Mysql一行數(shù)據(jù)的其中一列。Mapping
:映射,是對(duì)索引庫中的索引字段及其數(shù)據(jù)類型進(jìn)行定義,類似于關(guān)系型數(shù)據(jù)庫中的表結(jié)構(gòu)。ES默認(rèn)動(dòng)態(tài)創(chuàng)建索引和索引類型的Mapping。
Elasticsearch | Mysql |
---|---|
索引(Index) | 庫(Database) |
類型(Type) | 表(Table) |
文檔(Document) | 行(Row) |
字段(Field) | 列(Column) |
映射(Mappings) | 表結(jié)構(gòu)(schema) |
3、倒排索引機(jī)制
提到搜索,人們會(huì)立刻聯(lián)想到在百度、谷歌上輸入關(guān)鍵詞獲取相關(guān)的內(nèi)容的場景。但搜索不等于百度,大部分APP支持的站內(nèi)搜索更加大行其道。
數(shù)據(jù)庫是儲(chǔ)存和查詢數(shù)據(jù)的利器,那么數(shù)據(jù)庫是否適合做搜索呢?答案是不合適。第一個(gè)原因是,當(dāng)數(shù)據(jù)庫存儲(chǔ)了大量數(shù)據(jù)后,查詢效率大幅降低。
但是有些搜索場景,數(shù)據(jù)庫也是不支持的,例如在下表中,我們試圖通過“中國足球”這個(gè)關(guān)鍵詞搜索數(shù)據(jù),數(shù)據(jù)庫是無法查詢到相應(yīng)內(nèi)容的。
id | name |
---|---|
1 | 中國男子足球隊(duì) |
2 | 中國男子田徑隊(duì) |
3 | 中國女子排球隊(duì) |
4 | 中國女子跳水隊(duì) |
3.1、倒排索引
什么是倒排索引?倒排索引也叫反向索引,我們通常理解的索引是通過key尋找value,與之相反,倒排索引是通過value尋找key,故而被稱作反向索引。下面我們用一個(gè)簡單的例子描述一下倒排索引的作用過程:假如現(xiàn)在有三份數(shù)據(jù)文檔,內(nèi)容分別是:
Doc 1:Java is the best programming languageDoc 2:PHP is the best programming languageDoc 3:Javascript is the best programming language
為了創(chuàng)建索引,ES引擎通過分詞器將每個(gè)文檔的內(nèi)容拆成單獨(dú)的詞(稱之為詞條,或term),再將這些詞條創(chuàng)建成不含重復(fù)詞條的排序列表,然后列出每個(gè)詞條出現(xiàn)在哪個(gè)文檔,結(jié)果如下:
term | Doc 1 | Doc 2 | Doc 3 |
---|---|---|---|
Java | √ | ||
is | √ | √ | √ |
the | √ | √ | √ |
best | √ | √ | √ |
programming | √ | √ | √ |
language | √ | √ | √ |
PHP | √ | √ | |
Javascript | √ | √ |
這種結(jié)構(gòu)由文檔中所有不重復(fù)的詞的列表構(gòu)成,對(duì)于其中每個(gè)詞都有至少一個(gè)文檔與與之關(guān)聯(lián)。這種由屬性值來確定記錄的位置的結(jié)構(gòu)就是倒排索引,帶有倒排索引的文件被稱為倒排文件。
將上表轉(zhuǎn)為更直觀的圖片來展示倒排索引:
其中,幾個(gè)核心術(shù)語需要著重理解:
- 詞條(term):索引里面最小的存儲(chǔ)和查詢單元,對(duì)于英文來說是一個(gè)詞,對(duì)于中文來說一般指分詞后的一個(gè)詞。
- 詞典(Term Dictionary):也叫字典,是詞條的組合。搜索引擎的通常索引單位是單詞,單詞詞典是文檔集合中出現(xiàn)過的所有單詞構(gòu)成的字符串集合,單詞詞典內(nèi)每條索引項(xiàng)記載單詞本身的一些信息以及指向倒排所有的指針。
- 倒排表(Post list):一個(gè)文檔通常由多個(gè)詞組成,倒排表記錄的是某個(gè)詞在哪些文檔里出現(xiàn)過及出現(xiàn)的位置。每個(gè)記錄稱為一個(gè)倒排項(xiàng)(Posting),倒排表記錄的不單單是文檔編號(hào),還記錄了詞頻等信息。
- 倒排文件(Inverted File):所有單詞的倒排列表往往順序地存儲(chǔ)在磁盤的某個(gè)文件里,這個(gè)文件被稱之為倒排文件,倒排文件是存儲(chǔ)倒排索引的物理文件。
詞典和倒排表是 Lucene這種很重要的兩種數(shù)據(jù)結(jié)構(gòu),是實(shí)現(xiàn)快速檢索的重要基石。詞典和倒排文件是分兩部分存儲(chǔ)的,詞典在內(nèi)存中而倒排文件存儲(chǔ)在磁盤。
相關(guān)性得分:以上面的圖片為例,如果我們搜索 “Java is best”,我們會(huì)發(fā)現(xiàn)拆分的成三個(gè)單詞,在文檔一中命中(出現(xiàn))了三個(gè)單詞,文檔二和文檔三中命中了兩個(gè)單詞,那么文檔一的相關(guān)性得分就最高。根據(jù)相關(guān)性得分從高到低排序,就會(huì)檢索出相關(guān)的文檔。
4、使用docker安裝ElasticSearch
安裝docker可以參考我的另一篇文章,直接從上到下傻瓜式安裝。如下:
docker的介紹與安裝
4.1、下載鏡像文件
首先需要下載這兩個(gè)鏡像文件
docker pull elasticsearch:7.4.2 存儲(chǔ)和檢索數(shù)據(jù)引擎 docker pull kibana:7.4.2 可視化檢索數(shù)據(jù)工具
4.2 、創(chuàng)建實(shí)例,啟動(dòng)es
mkdir -p /mydata/elasticsearch/config mkdir -p /mydata/elasticsearch/data --任何一臺(tái)遠(yuǎn)程主機(jī)都可以訪問
echo "http.host: 0.0.0.0" >> /mydata/elasticsearch/config/elasticsearch.yml -- 保證權(quán)限
chmod -R 777 /mydata/elasticsearch/ -- 9200是發(fā)送http請求restful請求的,9300是es集群之間的通信端口,single-node 單節(jié)點(diǎn)運(yùn)行,并指定es啟動(dòng)占用的內(nèi)存
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx128m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.4.2
如果用docker ps 發(fā)現(xiàn)es沒啟動(dòng)成功到/mydata/elasticsearch/路徑下執(zhí)行上面的chmod -R 777 /mydata/elasticsearch/
保證賦予文件及子文件的權(quán)限為 RWX
然后重新啟動(dòng)elasticsearch。報(bào)錯(cuò)的話可以看對(duì)應(yīng)的容器啟動(dòng)日志 ,報(bào)錯(cuò)一般都是因?yàn)樯厦鎟un命令空格和換行問題
docker logs +`容器id前三位`
刪除容器
docker rm 容器id
docker ps -a 查看es的容器id
文件權(quán)限沒問題后用容器id啟動(dòng)es(比如我的容器id是 13e30b6e7c1a ),報(bào)錯(cuò)就看日志重新run啟動(dòng)
docker start 13e30b6e7c1a
postman測試訪問虛擬機(jī)9200端口的elasticSearch
5.安裝Kibana
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://172.20.10.11:9200 -p 5601:5601 \
-d kibana:7.4.2172.20.10.11為自己的虛擬機(jī)ip ifconfig命令查看
訪問虛擬機(jī)5601端口的Kibana
如下:安裝成功