Elasticsearch 是一個分佈式、可擴展、實時的搜索與數據分析引擎。 它能從項目一開始就賦予你的數據以搜索、分析和探索的能力,這是一般沒有預料到的。 它存在還由於原始數據若是隻是躺在磁盤裏面根本就毫無用處。html
Elasticsearch 不只僅只是全文搜索,咱們還將介紹結構化搜索、數據分析、複雜的人類語言處理、地理位置和對象間關聯關係等。 咱們還將探討爲了充分利用 Elasticsearch 的水平伸縮性,應當如何創建數據模型,以及在生產環境中如何配置和監控你的集羣。node
Elasticsearch也使用Java開發並使用 Lucene 做爲其核心來實現全部索引和搜索的功能,可是它的目的是經過簡單的 RESTful API 來隱藏 Lucene 的複雜性,從而讓全文搜索變得簡單。
不過,Elasticsearch 不只僅是 Lucene 和全文搜索,咱們還能這樣去描述它:docker
一、搜索鏡像 docker search Elasticsearch 二、拉取鏡像 docker pull elasticsearch:7.5.2 三、查看鏡像 docker images 四、啓動容器 docker run -d --name elaseticsearch -p 9200:9200 -p 9300:9300 -e ES_JAVA_POTS="-Xms256m -Xmx256m" -e "discovery.type=single-node" [鏡像id] 五、訪問 http://localhost:9200 { "name": "ea92e317dcb0", "cluster_name": "docker-cluster", "cluster_uuid": "nN5sGE2FQuidchtltDxAhQ", "version": { "number": "7.5.2", "build_flavor": "default", "build_type": "docker", "build_hash": "8bec50e1e0ad29dad5653712cf3bb580cd1afcdf", "build_date": "2020-01-15T12:11:52.313576Z", "build_snapshot": false, "lucene_version": "8.3.0", "minimum_wire_compatibility_version": "6.8.0", "minimum_index_compatibility_version": "6.0.0-beta1" }, "tagline": "You Know, for Search" }
一、啓動失敗,docker內容器無端中止
緣由:elasticsearch初始佔用內存大,開始佔用兩G,而我給docker只分配了1G,因此形成內存不夠從而形成啓失敗,若是你電腦內存夠大,你能夠給你的docker分配大一點的內存,內存不夠的同窗,你能夠在建立容器時加參數-e ES_JAVA_POTS="-Xms256m -Xmx256m"
json
一、拉取鏡像 docker pull kibana:7.5.2 注:最好與你的elasticsearch版本一致,以避免出現問題 二、建立容器 docker run -d --name kibana -p 5601:5601 [鏡像id] 三、訪問測試 訪問地址:http://locahost:5601
在調試好久以後,終於來到我渴望來到的界面。
他裏面有一個測試:http://localhost:9200/_search
數組
一、訪問kibana出現問題:Kibana server is not ready yet
,具體問題你須要看他的日誌,使用kitematic
能夠查看容器的日誌。
出現這個問題的可能性有不少,須要注意的是:服務器
elasticsearch.hosts
參數,它裏面會有默認值爲http://elaseicsearch:9200
,注意這裏不能改成http://localhost:9200
,由於這樣他會映射到你的容器內部。ipconfig
,這裏會有不少ip,請注意,這裏只有一個才能鏈接,若是你不能確認是哪個,請在你的kibana容器內部curl一下http://ip:9200
,出現elasticsearch信息的纔是正確的。數據的操做無非就是增刪改查四種對吧,接下來演示怎麼實現這四種方法:curl
這時elasticsearch開發文檔裏的例子。elasticsearch
PUT /megacorp/employee/1 { "first_name" : "John", "last_name" : "Smith", "age" : 25, "about" : "I love to go rock climbing", "interests": [ "sports", "music" ] } PUT /megacorp/employee/2 { "first_name" : "Jane", "last_name" : "Smith", "age" : 32, "about" : "I like to collect rock albums", "interests": [ "music" ] } PUT /megacorp/employee/3 { "first_name" : "Douglas", "last_name" : "Fir", "age" : 35, "about": "I like to build cabinets", "interests": [ "forestry" ] }
以1號員工爲例:這裏使用Postman工具:
咱們將請求切換爲PUT請求,輸入Url,在請求裏面加上數據,點擊發送,就會看到響應,
注意,路徑 /megacorp/employee/1 包含了三部分的信息:分佈式
目前咱們已經在 Elasticsearch 中存儲了一些數據, 接下來就能專一於實現應用的業務需求了。第一個需求是能夠檢索到單個僱員的數據。ide
這在 Elasticsearch 中很簡單。簡單地執行 一個 HTTP GET 請求並指定文檔的地址——索引庫、類型和ID。 使用這三個信息能夠返回原始的 JSON 文檔:
一樣的,咱們只須要將索引名、類別名、id的形式以get的請求發送,就能夠實現單個數據的查詢。
GET /megacorp/employee/1
返回結果包含了文檔的一些元數據,以及 _source 屬性,內容是 John Smith 僱員的原始 JSON 文檔
一個 GET 是至關簡單的,能夠直接獲得指定的文檔。 如今嘗試點兒稍微高級的功能,好比一個簡單的搜索!
第一個嘗試的幾乎是最簡單的搜索了。咱們使用下列請求來搜索全部僱員:
GET /megacorp/employee/_search
能夠看到,咱們仍然使用索引庫 megacorp 以及類型 employee,但與指定一個文檔 ID 不一樣,此次使用 _search 。返回結果包括了全部三個文檔,放在數組 hits 中。一個搜索默認返回十條結果。
{ "took": 1, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 3, "relation": "eq" }, "max_score": 1, "hits": [ { "_index": "megacorp", "_type": "employee", "_id": "1", "_score": 1, "_source": { "first_name": "John", "last_name": "Smith", "age": 25, "about": "I love to go rock climbing", "interests": [ "sports", "music" ] } }, { "_index": "megacorp", "_type": "employee", "_id": "2", "_score": 1, "_source": { "first_name": "Jane", "last_name": "Smith", "age": 32, "about": "I like to collect rock albums", "interests": [ "music" ] } }, { "_index": "megacorp", "_type": "employee", "_id": "3", "_score": 1, "_source": { "first_name": "Douglas", "last_name": "Fir", "age": 35, "about": "I like to build cabinets", "interests": [ "forestry" ] } } ] } }
嘗試下搜索姓氏爲 Smith
的僱員。、這個方法通常涉及到一個 查詢字符串 (query-string) 搜索,由於咱們能夠經過一個URL參數來傳遞查詢信息給搜索接口:
GET /megacorp/employee/_search?q=last_name:Smith
能夠看到咱們將查詢自己賦值給參數 q= 。返回結果給出了全部的 Smith,一共兩條。
{ "took": 79, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 2, "relation": "eq" }, "max_score": 0.47000363, "hits": [ { "_index": "megacorp", "_type": "employee", "_id": "1", "_score": 0.47000363, "_source": { "first_name": "John", "last_name": "Smith", "age": 25, "about": "I love to go rock climbing", "interests": [ "sports", "music" ] } }, { "_index": "megacorp", "_type": "employee", "_id": "2", "_score": 0.47000363, "_source": { "first_name": "Jane", "last_name": "Smith", "age": 32, "about": "I like to collect rock albums", "interests": [ "music" ] } } ] } }
官方文檔介紹這是使用查詢表達式搜索。
Query-string 搜索經過命令很是方便地進行臨時性的即席搜索 ,但它有自身的侷限性(參見 輕量 搜索 )。Elasticsearch 提供一個豐富靈活的查詢語言叫作 查詢表達式 , 它支持構建更加複雜和健壯的查詢。
領域特定語言 (DSL), 使用 JSON 構造了一個請求。咱們能夠像這樣重寫以前的查詢全部名爲 Smith 的搜索 :
POST /megacorp/employee/_search { "query" : { "match" : { "last_name" : "Smith" } } }
官方文檔給出的是get請求,我實在是不知道參數加在哪裏,加在header裏,沒有任何效果,因而我改爲了POST請求,請求成功,值得注意的是只有在有條件的時候才能查詢成功。
其中與get請求的不一樣是:再也不使用 query-string 參數,而是一個請求體替代。這個請求使用 JSON 構造,並使用了一個 match 查詢(屬於查詢類型之一)
{ "took": 1, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 2, "relation": "eq" }, "max_score": 0.47000363, "hits": [ { "_index": "megacorp", "_type": "employee", "_id": "1", "_score": 0.47000363, "_source": { "first_name": "John", "last_name": "Smith", "age": 25, "about": "I love to go rock climbing", "interests": [ "sports", "music" ] } }, { "_index": "megacorp", "_type": "employee", "_id": "2", "_score": 0.47000363, "_source": { "first_name": "Jane", "last_name": "Smith", "age": 32, "about": "I like to collect rock albums", "interests": [ "music" ] } } ] } }
相對於其餘集中請求,這時一種比較少見的請求方式,若是須要查看數據是否存在,將請求方式改成head便可。
HEAD /megacorp/employee/1
發送請求後,你也許會疑問,咦,他也沒有返回信息啊,那我怎麼知道結果呢。別急,聽我慢慢道來。
根據圖,咱們能夠看出,他的確沒有返回結果,可是能夠注意到,再右上角他會有一個狀態碼,當有這個信息時,他的狀態碼就是200,沒有就返回404表示找不到。
咱們使用了GET和POST查詢數據,使用PUT新增數據,根據官方給出的是修改數據仍是用PUT,若是存在數據他就會更新數據,這樣的模式確實與咱們常見的請求使用方法略有不一樣。
PUT /megacorp/employee/1 { "first_name" : "唐", "last_name" : "菜雞", "age" : 21, "about" : "I love to go rock climbing", "interests": [ "movie", "music" ] }
發送該請求後,返回參數
{ "_index": "megacorp", "_type": "employee", "_id": "1", "_version": 2, "result": "updated", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 3, "_primary_term": 3 }
咱們對比能夠發現,主要有兩處不一樣,看圖你就會說,呀不對呀,明明有四處,那是由於以前插入第一條的時候還只有一條參數,如今有三條了,不準擡槓,不準擡槓,不準擡槓。
不一樣:他的版本加一,返回狀態爲created變爲updated。
咱們再查詢一次就會發現他的信息已經發現改變,這就是修改。
{ "_index": "megacorp", "_type": "employee", "_id": "1", "_version": 2, "_seq_no": 3, "_primary_term": 3, "found": true, "_source": { "first_name": "唐", "last_name": "菜雞", "age": 21, "about": "I love to go rock climbing", "interests": [ "movie", "music" ] } }
根據前面,不用想咱們也知道刪除數據用的就是delete請求。
DELETE /megacorp/employee/2
咱們刪除二號員工,返回以下信息,result變爲deleted。
{ "_index": "megacorp", "_type": "employee", "_id": "2", "_version": 2, "result": "deleted", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 4, "_primary_term": 3 }
固然,elasticsearch的功能不只僅是如此,這些只是他的基本功能之一,更多請看他的開發文檔。 傳送門