1. 程式人生 > >初識elasticsearch(官網翻譯)

初識elasticsearch(官網翻譯)

目錄

基本概念

注意

叢集健康

建立索引

更新文件

刪除文件

批量執行

查詢api

執行查詢

執行過濾器

執行聚合

Elasticsearch是一個高度可擴充套件的開源的全文搜尋和分析引擎,它可以接近實時的快速的儲存、搜尋、分析大量的資料

基本概念

對es有幾個核心概念,開始學習之前理解這些概念將極大的幫助你理解後面的學習

Near Realtime(NRT)--接近實時

elasticsearch 是一個接近實時的搜尋平臺。通俗的講就是,從你索引一個文件直到這個文件可被搜尋會有一段時間的延遲(一般是1s)。個人理解就是你建立了個文件,會有將近1秒的延遲,別人才能搜尋到這個文件

Cluster--叢集

叢集就是一個或者多個節點(伺服器)的集合,承載著你的所有資料並在所有節點之間提供聯合索引和搜尋能力。一個叢集被一個唯一的名字所標識,預設是elasticsearch。這個名字很重要,因為一個節點要加入叢集,必須指定這個叢集的名字。

確保在不同的環境不要使用相同的叢集名字,否則節點將加入錯誤的叢集。

注意,一個叢集就有一個節點是合法的。除此之外,你也可以有多個相互獨立的叢集,每個用一個唯一的名字標識。

Node--節點

節點就是叢集中的一個單個伺服器,它儲存資料,參與叢集的索引和搜尋。就像一個叢集,節點也用一個名字來標識,預設是一個隨機的傳奇人物的名字,在節點啟動的時候被指定。

一個節點可以配置加入一個叢集通過叢集的名字。預設,每個節點設定為加入名字為elasticsearch 的叢集,這就意味著,如果你啟動了多個節點在你的網路-假定他們能彼此發現對方-他們將自動的組織成一個名字為elasticsearch的叢集。

在一個叢集中,你可以擁有你想要數量的節點。除此之外,如果沒有其他elastisearch節點當前執行在你的網路上,啟動一個節點將預設形成一個新的單個節點的名字為elastisearch的叢集

index--索引

一個索引就是文件的集合,這些文件有幾分相似的特性。比如,你可以有一個索引儲存客戶資料,另一個索引儲存產品分類,另一個索引儲存訂單資訊。一個索引用一個名字來標識(必須是小寫),這個名字被用來指定索引當針對其中的文件執行索引、搜尋、更新、刪除操作時。

在一個叢集中,你可以定義任意數量的索引,只要你想。

es 的index 相當於mysql 的database (個人理解)

Type--型別

在索引中,你可以定義一個或者多個型別。type是index的邏輯分類,怎麼定義完全取決於你。大體上,具有相同欄位的文件的集合被定義為一個type。打個比方,你運行了一個部落格平臺,且所有資料儲存在了一個index裡。在這個index裡,你可以給使用者資料定義一個type,給部落格資料定義一個type,給評論資料定義一個type。

type相當於mysql的 table

Document -- 文件

一個文件是可被索引的基本資訊單元。例如,你可以有一個針對顧客的文件,還可以有個針對產品的文件,還可以有一個針對訂單的文件。文件用json格式表示,此格式是普遍使用的一種資料交換格式。

在一個index/type中,你可以儲存你想要數量的文件。注意,儘管一個文件物理上存在一個index中,一個文件事實上必須被指定到一個index中的type上。

document相當於myslq 的 row

shards & replicas -- 分片與副本

一個index可能儲存大量的資料,且超過了一個節點硬體的容量限制。比如,一個index儲存了10億個文件,這將佔據1TB的硬碟,這不適合儲存在一個節點的硬碟上,或者在如此大的資料量的情況下,從單一節點請求未免太慢。

去解決這個問題,elastisearch細分index為多個碎片稱之為shards。當建立索引時,你可以定義你想要的shards數量。每個shard都是功能齊全、獨立的‘index',且可分佈在叢集的任何節點上。

分片重要主要有以下兩點:

  • 它允許你水平的拆分/擴充套件你的資料量
  • 它允許你分發和並行的跨分片操作(可能在多個節點上),從而提高效能和吞吐量。

shard是如何分佈的和文件是如何聚合回搜尋請求點是完全由elasticsearch管理的,這對於你來說是透明的。

在網路/雲環境,故障在任何時候都可能不期而至,這是非常有用和高度推薦的去部署一個故障轉移機制,以防shard/node不知何故掉線或者消失因為某種原因。為此,elasticsearch允許你去給shards 部署一個或者多個拷貝被稱為副本shards,或者副本簡而言之。

副本重要的兩點原因:

  • 支援高可用當shard/node掛掉。基於這個原因,需要明確注意的是副本永遠不要和他的shard分配到一個節點(node)上。
  • 它可以擴充套件搜尋量和吞吐量,因為搜尋可以並行的在所有副本上執行

總結,每個index可以拆分成多個shards。一個index也可以被複制0次或者多次。一旦被複制,每個index將擁有主分片(primary)和副本分片(replica)。index在建立的時候可以指定shards和replicas的數量。index建立後,副本的數量可以在任何時候動態的調整,但是主分片(primary)的數量是不能調整的。

預設,每個index在es裡被分配5個主分片和一個副本,這個的意思是如果你有至少兩個節點在你的叢集裡,你的index將有5個主分片和另五個副本分片(1 個完整的副本),總共10個分片對每個index。

注意

每個es的shard 都是一個lucene index。在每個Luene index裡,documents數量都有個上線。根據LUCENE-5843,這個限制是2,147,483,519(=integer.MAX_VALUE-128)。你可以監控shard size 使用_cat/shards api (之後會學習到)

Elasticsearch安裝

Elasticsearch的執行需要java的支援,es需要至少java 7。當寫作本節的時候,推薦使用Oracle JDK version 1.8.0_73。所以在安裝es之前需要先檢視java 的版本通過執行以下命令

  • java -version
  • echo $JAVA_HOME

es官網有很重型別的es安裝檔案,現在我們以tar檔案為例說明(linux 平臺)

下載tar 檔案:

curl-L-O https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.3.2/elasticsearch-2.3.2.tar.gz

解壓

tar-xvf elasticsearch-2.3.2.tar.gz

進入解壓後的 es目錄

cd elasticsearch-2.3.2/bin

啟動es

./elasticsearch 此時叢集名字和節點名字都是預設的 如果想開啟守護程序 可以加-d 引數

如果想啟動es的時候自己指定叢集名字和節點名字,可以加以下引數

./elasticsearch--cluster.name my_cluster_name --node.name my_node_name

其中my_cluster_name和my_node_name就是要新命名的叢集名字和 節點名字

預設 es使用埠號9200來支援REST API的請求。

Exploring Your Cluster(探索你的叢集)

我們可以使用curl或者其他任何可以進行http/rest請求的工具與es進行互動請求。

叢集健康

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

epoch      timestamp cluster       status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent 
1462841542 08:52:22  elasticsearch yellow          1         1    139 139    0    0      139             0                  -                 50.0% 

這個我自己搭建的一個cluster,可以看到我叢集elasticsearch 狀態為yellow,因為我只有一個節點,主分片和副本分片不能在一個node上,故副本分片沒有被分配,因此狀態是yellow,但是整個叢集是完全可用的。

叢集狀態有三種,green、yellow、red。green的意思就是叢集一切正常,功能完全可用。yellow的意思是所有資料可用但是一些副本沒有被分配(叢集完全可用),red的意思是一些資料是不可用的因為某種原因。注意就算一個叢集的狀態是red,它仍然是部分可用的(仍將從可用的分片上提供請求服務),但是需要儘快修復,因為已經丟失資料了。

檢視叢集列表

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

列出所有index

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

建立索引

curl -XPUT  'localhost:9200/customer?pretty'

此命令代表建立一個名為customer的index

如果返回此值就代表建立成功

{
  "acknowledged" : true
}

索引文件以及查詢

現在我們加一些資料到我們的customer索引。我們之前提到過,為了索引一個文件,我們必須告訴es這個文件需要放在這個索引的那個type下面。

讓我們索引一個簡單的customer文件進入customer索引、external type 帶一個id值1,像下面這樣

我們json格式的文件 {"name":"John Doe"}

curl -XPOST 'localhost:9200/customer/external/1?pretty' -d '{"name":"John Doe"}'

返回值

{
  "_index" : "customer",
  "_type" : "external",
  "_id" : "1",
  "_version" : 1,
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "created" : true
}

從上面我們可以看到,在索引customer、external type內我們成功建立了一個新的customer 文件。文件還有個內部id 1 ,這個是我們在索引文件的時候指定的。

有一點需要明確一下,在你索引一個文件到一個索引之前,沒必須預先建一個索引。

在之前的例子中,es會自動建立customer索引如果不存在的話。

現在讓我們取出剛才索引的文件

curl -XGET 'localhost:9200/customer/external/1?pretty'

返回值

{
  "_index" : "customer",
  "_type" : "external",
  "_id" : "1",
  "_version" : 1,
  "found" : true,
  "_source" : {
    "name" : "John Doe"
  }
}

這個返回結果沒有什麼特別的,除了一個欄位,found,宣告我們用id 1 找到了一個文件,和另外一個欄位_source,返回了整個我們之前索引的

json結構的文件。

修改你的資料

elasticsearch 提供了接近實時的資料操作和搜尋功能。預設的情況下,有一秒的延遲(重新整理間隔)從你索引、更新、刪除一個文件到這個操作的結果出現在你的搜尋結果中。

這是一個重要的區別和其他平臺像sql (當事物結束,資料立即可用)

索引或者替換文件

之前我們已經看到如何索引一個單獨的文件,讓我們重新看一下這個命令

curl -XPUT 'localhost:9200/customer/external/1?pretty'  -d '{"name":"Jone Doe"}'

上面的命令將索引一個文件在索引customer、type external中,並且id值為1。如果我們再一次執行上面的命令用不同的(或者相同的)文件,

Elasticsearch 將替換(也就是重新索引reindex)一個新的文件在原來的存在的文件之上根據id 1.(version 加1)

當索引一個文件的時候 ,id 是可選的,如果沒寫id ,es 將隨機生成一個id,下面的列子就是在未指定id的情況下索引一個文件

curl -XPOST 'localhost:9200/customer/external?pretty'-d '
{
  "name": "Jane Doe"
}'-XPOST 'localhost:9200/customer/external?pretty'-d '
{
  "name": "Jane Doe"
}'

注意,上面我們用了post 動作而不是 put

更新文件

除了索引、替換文件,我們也可以更新文件。

不過請注意,es不是在底層就地更新資料。不論何時我們進行更新操作,es一次性的刪除舊的文件資料,然後索引一個新的文件。

下面的例子是更新id為的1文件 name為Jane Doe

curl -XPOST 'localhost:9200/customer/external/1/_update?pretty' -d '

{

      "doc":{"name":"Jane Doe"}

}'

下面的例子是更新id為的1文件 name值為Jane Doe,同時增加一個age欄位

curl-XPOST'localhost:9200/customer/external/1/_update?pretty'-d'{ "doc": { "name": "Jane Doe", "age": 20 }}'

注意到,寫和更新一次只能操作一個文件,將來es 可能會提供類似mysql一樣的更新功能,就像 update where一樣

刪除文件

刪除一個文件是相當簡單的。這個例子展示瞭如何刪除之前我們建立的customer 索引  id 為2的文件。

curl -XDELETE 'localhost:9200/customer/external/1?pretty'-XDELETE 'localhost:9200/customer/external/1?pretty'

delete-by-query 外掛可以刪除所有滿足條件的文件。

批量執行

除了能夠索引、更新、刪除一個文件,Elasticsearch 也提供了同時包含以上操作的批量操作功能通過使用_bulk api.

這個功能是非常重要的,它提供了一種有效的機制去儘可能快的執行多個操作以儘可能小的網路開銷。

作為一個快速開始的例子,下面的呼叫索引了兩個文件(ID 1 - John Doe 和 ID 2 - Jane Doe) 在一個批量操作中

curl -XPOST 'localhost:9200/customer/external/_bulk?pretty'-d '
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }
'-XPOST 'localhost:9200/customer/external/_bulk?pretty'-d '
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }
'

這個例子更新第一個文件(id 1),然後刪除第二個文件(id 2) 在一個批量操作中

curl -XPOST 'localhost:9200/customer/external/_bulk?pretty'-d '
{"update":{"_id":"1"}}
{"doc": { "name": "John Doe becomes Jane Doe" } }
{"delete":{"_id":"2"}}
'-XPOST 'localhost:9200/customer/external/_bulk?pretty'-d '
{"update":{"_id":"1"}}
{"doc": { "name": "John Doe becomes Jane Doe" } }
{"delete":{"_id":"2"}}
'

注意上面的delete 操作,它沒有明確的指出source doc,因為刪除只需要知道id就可以了。

bulk api 執行所有操作連續的並且是按順序執行的。如果一個操作以某種原因失敗了,es 將會繼續執行它之後的其他操作,

當bulk api 結束了,它會提供每個操作的狀態(按照執行的順序),你可以檢查每個操作的執行是否成功。

搜尋你的資料

查詢api

讓我們以一些簡單的查詢開始。有兩個基本路徑去執行查詢:一個傳送請求引數通過rest request uri,另一個是傳送請求引數通過rest request body。request body方式讓你可以定義可讀性更強的 json 格式查詢。

下面這個例子返回bank index下的所有文件

curl -X GET "localhost:9200/bank/_search?q=*&sort=account_number:asc&pretty"
讓我們首先仔細分析這個查詢。我們正在搜尋bank 索引,引數q=*命令es 去匹配index裡的所有文件。sort=account_number:asc引數指示結果按照欄位account_number升序排序。pretty引數告訴es返回美觀的json格式結果。

響應結果 (部分):

{
  "took" : 63,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1000,
    "max_score" : null,
    "hits" : [ {
      "_index" : "bank",
      "_type" : "_doc",
      "_id" : "0",
      "sort": [0],
      "_score" : null,
      "_source" : {"account_number":0,"balance":16623,"firstname":"Bradshaw","lastname":"Mckenzie","age":29,"gender":"F","address":"244 Columbus Place","employer":"Euron","email":"[email protected]","city":"Hobucken","state":"CO"}
    }, {
      "_index" : "bank",
      "_type" : "_doc",
      "_id" : "1",
      "sort": [1],
      "_score" : null,
      "_source" : {"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke","age":32,"gender":"M","address":"880 Holmes Lane","employer":"Pyrami","email":"[email protected]","city":"Brogan","state":"IL"}
    }, ...
    ]
  }
}

關於響應結果,我們看到以下部分:

  • took - elasticsearch執行查詢所耗費的毫秒數
  • timed_out - 告訴我們查詢是否超時
  • _shards - 告訴我們多少分片被查詢,以及成功或者失敗的被查詢的分片
  • hits - 搜尋的結果
  • hits.total - 滿足條件的結果總數
  • hits.hits - 真實的資料集(預設十條)

下面是用request body形式的查詢

curl -X GET "localhost:9200/bank/_search" -H 'Content-Type: application/json' -d'
{
  "query": { "match_all": {} },
  "sort": [
    { "account_number": "asc" }
  ]
}
'

介紹查詢語言

Elasticsearch提供一種json形式的、特定領域的語言以供你使用去執行查詢。這稱為查詢dsl 。這個查詢語言非常全面,乍一看可能令人生畏,最好的學習方式是以幾個例子開始。

curl -X GET "localhost:9200/bank/_search" -H 'Content-Type: application/json' -d'
{
  "query": { "match_all": {} }
}
'
仔細分析這個語句,query部分告訴我們我們的query定義成什麼樣子,match_all部分僅僅是我們期望執行的查詢型別。match_all query 僅僅是查詢索引中的所有文件。

除了query引數,我們也可以傳遞其他引數去影響查詢結果,我們傳遞size引數:

curl -X GET "localhost:9200/bank/_search" -H 'Content-Type: application/json' -d'
{
  "query": { "match_all": {} },
  "size": 1
}
'
注意如果size 沒有傳遞,預設10

下面這個查詢執行match_all查詢 返回 10-19行記錄

curl -X GET "localhost:9200/bank/_search" -H 'Content-Type: application/json' -d'
{
  "query": { "match_all": {} },
  "from": 10,
  "size": 10
}
'
from引數(從0開始)指定開始的位置,size引數指定返回的結果集大小。這個在分頁查詢很有用,注意如果from未指定,預設0.

下面這個例子執行match_all查詢,按照balance倒序排序,返回10條件記錄(預設)

curl -X GET "localhost:9200/bank/_search" -H 'Content-Type: application/json' -d'
{
  "query": { "match_all": {} },
  "sort": { "balance": { "order": "desc" } }
}
'
 

執行查詢

我們已經看了幾個基本的查詢引數,讓我們去深入研究下dsl。讓我們先看看返回的欄位。預設所有欄位都返回。如果我們不想返回所有的欄位,我們有能力請求想要返回的欄位。

下面這個例子展示瞭如何返回兩個欄位,account_number 和balance

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": { "match_all": {} },
  "_source": ["account_number", "balance"]
}'

之前我們看到match_all的用法,下面我們看看match的匹配用法

下面這個例子,匹配account_number=20的記錄

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": { "match": { "account_number": 20 } }
}'

下面這個例子返回address欄位包含mill 的所有記錄

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": { "match": { "address": "mill" } }
}'

下面這個例子返回address包含mill或者lane的所有記錄

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": { "match": { "address": "mill lane" } }
}'

現在我們介紹布林查詢,布林查詢允許我們用布林邏輯把小的查詢組合成大的查詢。

下面這個查詢返回address既包含mill又包含lane 的所有記錄

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": {
    "bool": {
      "must": [
        { "match": { "address": "mill" } },
        { "match": { "address": "lane" } }
      ]
    }
  }
}'

下面這個查詢返回address 包含mill或者lane的所有記錄

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": {
    "bool": {
      "should": [
        { "match": { "address": "mill" } },
        { "match": { "address": "lane" } }
      ]
    }
  }
}'

下面這個查詢返回address既不包含mill又包含lane的所有記錄

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": {
    "bool": {
      "must_not": [
        { "match": { "address": "mill" } },
        { "match": { "address": "lane" } }
      ]
    }
  }
}'

我們可以同時在一個布林查詢中結合must should must_not 。

下面這個查詢返回年齡等於40但是state不包含ID 的所有記錄

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": {
    "bool": {
      "must": [
        { "match": { "age": "40" } }
      ],
      "must_not": [
        { "match": { "state": "ID" } }
      ]
    }
  }
}'

執行過濾器

在上一節,我們跳過了一個概念score(_score在查詢結果中)。score是一個數字,相對的衡量記錄和查詢匹配度。score分數值越大,說明記錄相關度越大,score分數越小,說明記錄相關度越小。

下面這個例子用布林查詢返回 20000<= balance <= 30000 的所有記錄

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": {
    "bool": {
      "must": { "match_all": {} },
      "filter": {
        "range": {
          "balance": {
            "gte": 20000,
            "lte": 30000
          }
        }
      }
    }
  }
}'

執行聚合

下面這個例子已state欄位分組,返回top 10 (預設)states 按照count 倒序(預設)。

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state"
      }
    }
  }
}'

類似sql  

SELECT state, COUNT(*) FROM bank GROUP BY state ORDER BY COUNT(*) DESC

響應結果

"hits" : {
    "total" : 1000,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "group_by_state" : {
      "buckets" : [ {
        "key" : "al",
        "doc_count" : 21
      }, {
        "key" : "tx",
        "doc_count" : 17
      }, {
        "key" : "id",
        "doc_count" : 15
      }, {
        "key" : "ma",
        "doc_count" : 15
      }, {
        "key" : "md",
        "doc_count" : 15
      }, {
        "key" : "pa",
        "doc_count" : 15
      }, {
        "key" : "dc",
        "doc_count" : 14
      }, {
        "key" : "me",
        "doc_count" : 14
      }, {
        "key" : "mo",
        "doc_count" : 14
      }, {
        "key" : "nd",
        "doc_count" : 14
      } ]
    }
  }
}

注意,我們設定了size=0 為了不展示search結果,因為我們只想看聚合結果。

在上面聚合的基礎上,下面這個例子計算balance的平均值通過state

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state"
      },
      "aggs": {
        "average_balance": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}'

在上面dsl 聚合的基礎上,讓我們按照balance的平均值倒序排列

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state",
        "order": {
          "average_balance": "desc"
        }
      },
      "aggs": {
        "average_balance": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}'

下面這個例子論證了 按照age年齡段分組,然後按照性別分組,最後獲取balance的平均值

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "size": 0,
  "aggs": {
    "group_by_age": {
      "range": {
        "field": "age",
        "ranges": [
          {
            "from": 20,
            "to": 30
          },
          {
            "from": 30,
            "to": 40
          },
          {
            "from": 40,
            "to": 50
          }
        ]
      },
      "aggs": {
        "group_by_gender": {
          "terms": {
            "field": "gender"
          },
          "aggs": {
            "average_balance": {
              "avg": {
                "field": "balance"
              }
            }
          }
        }
      }
    }
  }
}'

相關推薦

初識elasticsearch(翻譯

目錄 基本概念 注意 叢集健康 建立索引 更新文件 刪除文件 批量執行 查詢api 執行查詢 執行過濾器 執行聚合 Elasticsearch是一個高度可擴充套件的開源的全文搜尋和分析引擎,它

openCV人臉識別三種演算法實現(翻譯

 怎樣使用OpenCV進行人臉識別 友情提示,要看懂程式碼前,你得先知道OpenCV的安裝和配置,會用C++,用過一些OpenCV函式。基本的影象處理和矩陣知識也是需要的。[gm:我是簫鳴的註釋]由於我僅僅是翻譯,對於六級才過的我,肯定有一些翻譯錯的或

Elasticsearch使用場景翻譯: getting started

Elasticsearch is a highly scalable open-source full-text search and analytics engine. ElasticSearch 是一個高可用的,可伸縮的,開源的,全文檢索與分析的引擎

翻譯】效能篇(十效能提示

前言        本文翻譯自Android開發者官網的一篇文件,主要用於介紹app開發中效能優化的一實踐要點。        中國版官網原文地址為:https://developer.android.google.cn/tr

Python自學筆記-map和reduce函數(來自廖雪峰的Python3

求和 rabl style 序列 list port lambda char att 感覺廖雪峰的官網http://www.liaoxuefeng.com/裏面的教程不錯,所以學習一下,把需要復習的摘抄一下。 以下內容主要為了自己復習用,詳細內容請登錄廖雪峰的官網查看。

Leaflet_創建地圖(示例

位置 custom phone world! -c setview art locate ipa 官網:http://leafletjs.com/examples.html 快速啟動指南 http://leafletjs.com/examples/quick-start/e

springmvc系列一 之配置介紹(包含doc

不同 oca handle bsp cut targe sevlet 繼承 流程 1.springmvc 官網參考地址:   https://docs.spring.io/spring/docs/current/spring-framework-reference/web.

ZooKeeper Administrator's Guide A Guide to Deployment and Administration(吃別人嚼過的饃沒意思,直接看資料

section pla dconf trace log content dir exc everyone efi Deployment System Requirements Supported Platforms Required Software Clus

Apache Hadoop YARN (文章

yarn的根本目標是為了分散資源管理還有任務排程以及監視功能到分離的守護程序。這個目的是擁有一個全域性ResourceManager 和每個應用程式。 應用程式可以是單個作業,也可以是作業的DAG。 resource manager和node manager 構成了資料計算框架。 reso

Docker概述與安裝(

額外 latest ups syslog alt mirrors lan systems roo 1、Docker概述 原文地址:https://docs.docker-cn.com/engine/docker-overview/#docker-engine Docke

Retrofit翻譯

Retrofit Android和Java平臺下型別安全的HTTP客戶端 寫在前面:1.如果發現問題歡迎Issue;2.有些不知道對不對的地方給出了原文;3.如果你有更好的建議歡迎Issue; Retrofit 翻譯之前 簡介

C ++ list 用法整理(例子

因為最近一直在用 C++ 的 list,搜到的那個最高訪問的 CSDN 博文寫的不夠簡潔。而官網上的一些例子有些細節沒涉及到,得自己再複製下來跑一遍才能搞明白。於是便萌生了寫這篇博文的念頭,方便自己以後查閱。 本文的例子都來自官網的介紹:http://www.cplusplus.co

翻譯之RDD Programming Guide-Scala

Overview(概述) At a high level, every Spark application consists of a driver program that runs the user’s main function and executes

訓練DCGAN(pytorch版本

將pytorch官網的python程式碼當下來,然後下載好celeba資料集(百度網盤),在程式碼旁新建celeba資料夾,將解壓後的img_align_celeba資料夾放進去,就可以執行程式碼了。 輸出如下 視訊記憶體佔用如下 與目標檢測模型動不動就視訊記憶體不夠比,簡直好太多了。 那最後

uWSGI的安裝與配置(摘錄

■ 安裝uwsgi: 作為一個嚴謹(其實就是有強迫症)的程式,為了確保正確安裝這個東西,費了我好長時間。首先,查詢包裡的readme,發現沒有安裝提示。各種被牆,輾轉良久,才檢視到uwsgi的官方文件說明: http://uwsgi-docs.readthedocs.or

Kotlin 協程翻譯

你的第一個協程 fun main(args: Array<String>) { launch { //在後臺啟動新的協程並繼續 delay(1000L) //非阻塞延遲1秒(預設時間單位為ms) prin

bootstrap4 使用及常用樣式詳細整理 (依照翻譯)

bootstrap4使用及常用樣式整理 簡介 Bootstrap 是全球最受歡迎的前端元件庫,用於開發響應式佈局、移動裝置優先的 WEB 專案。Bootstrap4 目前是 Bootstrap 的最新版本,是一套用於 HTML、CSS 和 JS 開發的

hive翻譯之總體概述

Apache Hive hive官網原文地址 https://cwiki.apache.org/confluence/display/Hive/Home;jsessionid=91AF539FA31786D88F9DCAA009B31ED9       hive 資料倉庫使

翻譯 xa分散式事務的限制點( Restrictions on XA Transactions )

原文: http://dev.mysql.com/doc/refman/5.1/en/xa-restrictions.html D.5 Restrictions on XA Transactions  綜述:   external XA的概念.  介紹了mysql 內部XA

二維陣列排序:array_orderby(php評論

<?php $data[] = array('volume' => 67, 'edition' => 2); $data[] = array('volume' => 86, 'edition' => 1); $data[] = array('volume' => 85, '