1. 程式人生 > >全文搜尋引擎ElasticSearch

全文搜尋引擎ElasticSearch

1. 介紹

 ElasticSearch簡稱ES。
 先來看它的用途:如果只是在多個機器同步,儲存和檢索大量資料,它與資料庫的差別在哪兒,為什麼非要使用ES呢?
 ES是目前全文搜尋引擎的首選。全文檢索是指計算機索引程式通過掃描文章中的每一個詞,對每一個詞建立一個索引,指明該詞在文章中出現的次數和位置,當 使用者查詢時,檢索程式就根據事先建立的索引進行查詢,並將查詢的結果反饋給使用者的檢索方式。簡單地說它的優勢在於文字檢索。ES還可搭建成叢集,有良好的 擴充套件性。
 如果把ES和資料庫相比,ES中包含多個索引index(相當於資料庫中的庫),索引又包括多個型別type(相當於資料庫中的表)。
 Kibana是一個開源的分析與視覺化平臺,設計出來用於和Elasticsearch一起使用的。

2. ES環境搭建

(1) 安裝8以上的Java版本

$ cd /usr/lib/jvm/
$ tar xvzf jdk-8u181-linux-x64.tar.gz # 解包
$ sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_181/bin/java # 把新版java納入版本管理
$ sudo update-alternatives --config java # 選擇新版本為預設java版本

 用以上方法設定可以省去手動設定JAVA_HOME等環境變數。

(2) 安裝ES和Kibana

 安裝時,需要考慮ES和它的輔助軟體kibana的版本匹配,於是在網站

https://www.elastic.co/downloads,下載了最新版本的deb包(目前最新為6.3.2)

$ sudo dpkg -i elasticsearch-6.3.2.deb # ubuntu系統下安裝
$ sudo dpkg -i kibana-6.3.2-amd64.deb

(3) 配置ES

$ sudo vi /etc/elasticsearch/elasticsearch.yml # 編輯配置檔案,也可以通過該配置檔案,配置ES叢集(一個設成master node, 多個data node,使用同一叢集名)
此處介紹最簡單的配置,將host替換為你的地址
network.host: 127.0.0.1 # 我用的是本機地址

(4) 啟動ES

$ sudo service elasticsearch restart # 重啟ES
如果無法啟動,也可嘗試手動啟動服務,命令如下:
$ sudo /usr/share/elasticsearch/bin/elasticsearch -d
此時在瀏覽器中開啟:http://127.0.0.1:9200/,可看到埠已開啟。

(5) 配置Kibana

$ sudo vi /etc/kibana/kibana.yml # 修改配置檔案
此處介紹最簡單的配置,開啟對以下行的註釋:
server.port: 5601
server.host: "127.0.0.1"
server.name: "testme"
elasticsearch.url: "http://127.0.0.1:9200"
elasticsearch.preserveHost: true
kibana.index: ".kibana"

(6) 啟動Kibana

$ sudo service kibana restart

 此時在瀏覽器中,開啟http://127.0.0.1:5601,即可看到kibana已啟動

3. 使用curl命令訪問ES

(1) 檢視服務狀態(也可以在瀏覽器中檢視)

$ curl 'localhost:9200/_cat/health?v'

(2) 檢視當前的Node節點

$ curl 'localhost:9200/_cat/nodes?v'

(3) 新建一個index(類似於資料庫操作中的建庫)

$ curl -XPUT 'localhost:9200/test_1'

(4) 檢視當前所有index

$ curl 'localhost:9200/_cat/indices?v'

(5) 向index中新增資料

$ curl -XPOST http://localhost:9200/test_1/product/ -d '{"author" : "Jack", , "age": 32}'

 如果報錯406,請加入引數-H,如下:

$ curl -XPOST http://localhost:9200/test_1/product/ -H 'Content-Type: application/json' -d '{"author" : "Xie Yan"}'

 插入的index是test_1,type是product,此處可以看到,輸入ES資料的格式是相當靈活的,它以key-value的方式存取,不像資料庫中固定的欄位。

(6) 查詢所有資料

$ curl -XPOST 'localhost:9200/test_1/_search' -d ' { "query": { "match_all": {} } }'

(7) 條件查詢

$ curl -XGET http://localhost:9200/test_1/_search?q=age:32

4. 使用Kibana檢視ES資料

 瀏覽器訪問http://127.0.0.1:5601,在Management-> Elasticsearch中即可以檢視當前的index和type,及其它們的內容,以及進一步分析。

5. 用Python訪問ES資料

(1) 安裝python支援庫

$ sudo pip install elasticsearch

(2) 程式碼

from elasticsearch import Elasticsearch

es_host = '127.0.0.1'
es_index = 'test_1'
es = Elasticsearch(es_host)

result = es.search(index=es_index, body={}, size=10)
for item in result['hits']['hits']:
    print(item)

(3) 說明

 可以在body中加入一些用json串描述的查詢條件和需要的欄位,條件最多1024個,在size中可設定返回條目的多少,用此方法查詢最多能返回一萬條。

6. 參考

(1) ES與傳統資料庫的比較

(2) 搭建Elasticsearch 5.4分散式叢集