天天看點

【docker Elasticsearch】Rest風格的分布式開源搜尋和分析引擎Elasticsearch初體驗

【docker Elasticsearch】Rest風格的分布式開源搜尋和分析引擎Elasticsearch初體驗

概述:

Elasticsearch 是一個分布式、可擴充、實時的搜尋與資料分析引擎。 它能從項目一開始就賦予你的資料以搜尋、分析和探索的能力,這是通常沒有預料到的。 它存在還因為原始資料如果隻是躺在磁盤裡面根本就毫無用處。

Elasticsearch 不僅僅隻是全文搜尋,我們還将介紹結構化搜尋、資料分析、複雜的人類語言處理、地理位置和對象間關聯關系等。 我們還将探讨為了充分利用 Elasticsearch 的水準伸縮性,應當如何建立資料模型,以及在生産環境中如何配置和監控你的叢集。

Elasticsearch也使用Java開發并使用 Lucene 作為其核心來實作所有索引和搜尋的功能,但是它的目的是通過簡單的 RESTful API 來隐藏 Lucene 的複雜性,進而讓全文搜尋變得簡單。

不過,Elasticsearch 不僅僅是 Lucene 和全文搜尋,我們還能這樣去描述它:

分布式的實時檔案存儲,每個字段都被索引并可被搜尋

分布式的實時分析搜尋引擎

可以擴充到上百台伺服器,處理PB級結構化或非結構化資料

@

目錄

壹:安裝軟體

一:安裝elasticsearch

1、安裝

2、問題

二:安裝kibana

貳:Elastic search初體驗

一:添加資料

二:檢視資料

1、查詢單個資料

2、查詢所有的資料

3、按條件查詢

①、get

②:post請求

4、檢視資料是否存在

三、修改資料

四:删除資料

作者有話

1、搜尋鏡像

docker search Elasticsearch

2、拉取鏡像

docker pull elasticsearch:7.5.2

3、檢視鏡像

docker images

4、啟動容器

docker run -d --name elaseticsearch -p 9200:9200 -p 9300:9300 -e ES_JAVA_POTS="-Xms256m -Xmx256m" -e "discovery.type=single-node" [鏡像id]

5、通路

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"           

}

1、啟動失敗,docker内容器無故停止

原因:elasticsearch初始占用記憶體大,開始占用兩G,而我給docker隻配置設定了1G,是以造成記憶體不夠進而造成啟失敗,如果你電腦記憶體夠大,你可以給你的docker配置設定大一點的記憶體,記憶體不夠的同學,你可以在建立容器時加參數-e ES_JAVA_POTS="-Xms256m -Xmx256m"

1、拉取鏡像

docker pull kibana:7.5.2

注:最好與你的elasticsearch版本一緻,以免出現問題

2、建立容器

docker run -d --name kibana -p 5601:5601 [鏡像id]

3、通路測試

通路位址:

http://locahost:5601

在調試很久之後,終于來到我渴望來到的界面。

他裡面有一個測試:

http://localhost:9200/_search

1、通路kibana出現問題:Kibana server is not ready yet,具體問題你需要看他的日志,使用kitematic可以檢視容器的日志。

出現這個問題的可能性有很多,需要注意的是:

1、确認你的elasticsearch是否啟動,這沒什麼好說的

2、确認你的elasticsearch版本是否與你的kibana版本是否一緻,雖然我也沒有測試,版本一緻總歸沒有什麼壞處。

3、你最好把kibana與elasticsearch兩個容器之間連接配接起來

4、在進入容器後,你必須修改elasticsearch.hosts參數,它裡面會有預設值為

http://elaseicsearch:9200,

注意這裡不能改為

http://localhost:9200,

因為這樣他會映射到你的容器内部。

你需要在你的主機檢視ip,輸入ipconfig,這裡會有很多ip,請注意,這裡隻有一個才能連接配接,如果你不能确認是哪一個,請在你的kibana容器内部curl一下

http://ip:9200

,出現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 包含了三部分的資訊:

megacorp(索引名稱)

employee(類型名稱)

1(特定雇員的ID)

請求體 —— JSON 文檔 —— 包含了這位員工的所有詳細資訊,他的名字叫 John Smith ,今年 25 歲,喜歡攀岩。

目前我們已經在 Elasticsearch 中存儲了一些資料, 接下來就能專注于實作應用的業務需求了。第一個需求是可以檢索到單個雇員的資料。

這在 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,如果存在資料他就會更新資料,這樣的模式确實與我們常見的請求使用方法略有不同。

"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的功能不僅僅是如此,這些隻是他的基本功能之一,更多請看他的開發文檔。 傳送門

原文位址

https://www.cnblogs.com/lomtom/p/12584956.html