Elasticsearch學習筆記

歡迎訪問本人博客:http://wangnan.tech

Elasticsearch是一個可伸縮的開源全文搜索和分析引擎,它使你可以快速且接近實時的去保存巷怜,查詢和分析海量的數(shù)據(jù),他的潛在應(yīng)用場景是作為一些有復(fù)雜搜索功能和需求的應(yīng)用的搜索引擎

簡介

Elasticsearch是一個基于Apache Lucene(TM)的開源搜索引擎挑辆。無論在開源還是專有領(lǐng)域笨触,Lucene可以被認為是迄今為止最先進、性能最好的丙笋、功能最全的搜索引擎庫谢澈。
但是,Lucene只是一個庫御板。想要使用它锥忿,你必須使用Java來作為開發(fā)語言并將其直接集成到你的應(yīng)用中,更糟糕的是怠肋,Lucene非常復(fù)雜敬鬓,你需要深入了解檢索的相關(guān)知識來理解它是如何工作的。Elasticsearch也使用Java開發(fā)并使用Lucene作為其核心來實現(xiàn)所有索引和搜索的功能笙各,但是它的目的是通過簡單的RESTful API來隱藏Lucene的復(fù)雜性钉答,從而讓全文搜索變得簡單。

與關(guān)系型數(shù)據(jù)庫對比

Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields

Elasticsearch集群可以包含多個索引(indices)(數(shù)據(jù)庫)杈抢,每一個索引可以包含多個類型(types)(表)数尿,每一個類型包含多個文檔(documents)(行),然后每個文檔包含多個字段(Fields)(列)

基礎(chǔ)概念

near realtime(NRT)
es是一個接近實時的搜索平臺惶楼,這意味著你查詢一個文檔的時候有一個延時右蹦。大約一秒

cluster

集群是一個或多個節(jié)點(服務(wù)器)的集合在一起诊杆,保存所有的數(shù)據(jù),聯(lián)合所有節(jié)點一起提供查詢能力何陆。
一個集群有一個唯一的名字晨汹,默認是“elasticsearch",集群名很重要,因為集群節(jié)點加入集群的唯一方式是根據(jù)這個名字贷盲。

node

節(jié)點的默認名字是漫威的一個角色淘这,默認加入集群elasticsearch

index

索引是一系列具有相似特點文檔的集合
實際上,索引只是一個用來指向一個或多個分片(shards)的“邏輯命名空間(logical namespace)

「索引」含義的區(qū)分
你可能已經(jīng)注意到索引(index)這個詞在Elasticsearch中有著不同的含義巩剖,所以有必要在此做一下區(qū)分:
索引(名詞) :如上文所述慨灭,一個索引(index)就像是傳統(tǒng)關(guān)系數(shù)據(jù)庫中的數(shù)據(jù)庫,它是相關(guān)文檔存儲的地方球及,index的復(fù)數(shù)是indices 或indexes氧骤。
索引(動詞) :「索引一個文檔」表示把一個文檔存儲到索引(名詞)里,以便它可以被檢索或者查詢吃引。這很像SQL中的INSERT關(guān)鍵字筹陵,差別是,如果文檔已經(jīng)存在镊尺,新的文檔將覆蓋舊的文檔朦佩。

倒排索引 傳統(tǒng)數(shù)據(jù)庫為特定列增加一個索引,例如B-Tree索引來加速檢索庐氮。Elasticsearch和Lucene使用一種叫做倒排索引(inverted index)的數(shù)據(jù)結(jié)構(gòu)來達到相同目的语稠。

Type

索引中,類型是一種邏輯的分類弄砍,它的意義由使用者來賦予

mapping

每個類型(type)都有自己的映射(mapping)或者結(jié)構(gòu)定義仙畦,就像傳統(tǒng)數(shù)據(jù)庫表中的列一樣。所有類型下的文檔被存儲在同一個索引下音婶,但是類型的映射(mapping)會告訴Elasticsearch不同的文檔如何被索引
Elasticsearch支持以下簡單字段類型:
類型 表示的數(shù)據(jù)類型
String string
Whole number byte, short, integer, long
Floating point float, double
Boolean boolean
Date date

document

文檔是搜索信息的基本單元慨畸,用json表達,文檔必須被包含于一個type中

文檔 ID文檔唯一標識由四個元數(shù)據(jù)字段組成:
_id:文檔的字符串 ID
_type:文檔的類型名
_index:文檔所在的索引
_uid:_type 和 _id 連接成的 type#id

默認情況下衣式,_uid 是被保存(可取回)和索引(可搜索)的寸士。_type 字段被索引但是沒有保存,_id 和_index 字段則既沒有索引也沒有儲存碴卧,它們并不是真實存在的弱卡。

shards&replicas

es提供能力,讓你把index分成好幾個部分住册,叫做分片婶博,當你創(chuàng)建索引的時候,你可以簡單的定義分片的個數(shù)界弧,每個分片本身是一個獨立的功能齊全的“索引”凡蜻,可以被放到任何的集群節(jié)點中

分片的意義:
1.可以水平分割和擴展數(shù)據(jù)
2.可以把操作分配給多個分區(qū)搭综,提高性能

es允許你制作一個或多個分片的副本垢箕。叫做復(fù)制分片
復(fù)制分片的意義:
1划栓、他提供了高可用性,副本和原始分區(qū)不處于一個節(jié)點中条获。
2.他提高了性能忠荞,因為搜索可以在任何分區(qū)上允許。
每一個分片是一個lucene索引帅掘,每個Lucene實例有一個最大的存放文檔的數(shù)量委煤。這個數(shù)量是2417483519

analysis

分析也稱分詞
Elasticsearch中的數(shù)據(jù)可以大致分為兩種類型:
確切值 及 全文文本。
確切值是確定的修档,正如它的名字一樣碧绞。比如一個date或用戶ID,也可以包含更多的字符串比如username或email地址吱窝。
全文文本常常被稱為非結(jié)構(gòu)化數(shù)據(jù)讥邻,而對于全文數(shù)據(jù)的查詢來說,卻有些微妙院峡。我們不會去詢問這篇文檔是否匹配查詢要求兴使?。 但是照激,我們會詢問這篇文檔和查詢的匹配程度如何发魄?。換句話說俩垃,對于查詢條件励幼,這篇文檔的相關(guān)性有多高?

為了方便在全文文本字段中進行這些類型的查詢口柳,Elasticsearch首先對文本分析(analyzes)赏淌,然后使用結(jié)果建立一個倒排索引。

分析(analysis)機制用于進行全文文本(Full Text)的分詞啄清,以建立供搜索用的反向索引六水。

分析(analysis)是這樣一個過程:
首先,標記化一個文本塊為適用于倒排索引單獨的詞(term)
然后標準化這些詞為標準形式辣卒,提高它們的“可搜索性”或“查全率”

這個工作是分析器(analyzer)完成的掷贾。一個分析器(analyzer)只是一個包裝用于將三個功能放到一個包里:
字符過濾器
1.首先字符串經(jīng)過字符過濾器(character filter),它們的工作是在標記化前處理字符串荣茫。字符過濾器能夠去除HTML標記想帅,或者轉(zhuǎn)換"&"為"and"。
分詞器
2.下一步啡莉,分詞器(tokenizer)被標記化成獨立的詞港准。一個簡單的分詞器(tokenizer)可以根據(jù)空格或逗號將單詞分開(譯者注:這個在中文中不適用)
標記過濾
3.最后旨剥,每個詞都通過所有標記過濾(token filters),它可以修改詞(例如將"Quick"轉(zhuǎn)為小寫)浅缸,去掉詞(例如停用詞像"a"轨帜、"and"、"the"等等)衩椒,或者增加詞(例如同義詞像"jump"和"leap")

index參數(shù)控制字符串以何種方式被索引蚌父。它包含以下三個值當中的一個:
analyzed首先分析這個字符串,然后索引毛萌。換言之苟弛,以全文形式索引此字段。not_analyzed索引這個字段阁将,使之可以被搜索膏秫,但是索引內(nèi)容和指定值一樣。不分析此字段做盅。no不索引這個字段缤削。這個字段不能為搜索到。
string類型字段默認值是analyzed言蛇。如果我們想映射字段為確切值僻他,我們需要設(shè)置它為not_analyzed:
{
"tag": {
"type": "string",
"index": "not_analyzed"
}
}其他簡單類型(long、double腊尚、date等等)也接受index參數(shù)吨拗,但相應(yīng)的值只能是no和not_analyzed,它們的值不能被分析婿斥。

Elasticsearch提供很多開箱即用的字符過濾器劝篷,分詞器和標記過濾器。這些可以組合來創(chuàng)建自定義的分析器以應(yīng)對不同的需求民宿。

string類型的字段娇妓,默認的,考慮到包含全文本活鹰,它們的值在索引前要經(jīng)過分析器分析弱匪,并且在全文搜索此字段前要把查詢語句做分析處理馋吗。
對于string字段,兩個最重要的映射參數(shù)是index和analyer。

highlight

很多應(yīng)用喜歡從每個搜索結(jié)果中高亮(highlight)匹配到的關(guān)鍵字镀裤,這樣用戶可以知道為什么這些文檔和查詢相匹配拯辙。

score

每個節(jié)點都有一個_score字段坡椒,這是相關(guān)性得分(relevance score)褂乍,它衡量了文檔與查詢的匹配程度。默認的,返回的結(jié)果中關(guān)聯(lián)性最大的文檔排在首位彬向;這意味著兼贡,它是按照_score降序排列的。這種情況下娃胆,我們沒有指定任何查詢遍希,所以所有文檔的相關(guān)性是一樣的,因此所有結(jié)果的_score都是取得一個中間值1
max_score指的是所有文檔匹配查詢中_score的最大值缕棵。

refresh

默認情況下孵班,每個分片每秒自動刷新一次涉兽。這就是為什么說Elasticsearch是近實時的搜索了:文檔的改動不會立即被搜索招驴,但是會在一秒內(nèi)可見。

sort

排序
默認情況下枷畏,結(jié)果集會按照相關(guān)性進行排序 -- 相關(guān)性越高别厘,排名越靠前
字段值排序:
按時間排序

GET /_search
{
 "query" : {
     "filtered" : {
        "filter" : { "term" : { "user_id" : 1 }}
    }
},
"sort": { "date": { "order": "desc" }}
}

返回:

"hits" : {
    "total" :           6,
"max_score" :       null, <1>
"hits" : [ {
    "_index" :      "us",
    "_type" :       "tweet",
    "_id" :         "14",
    "_score" :      null, <1>
    "_source" :     {
         "date":    "2014-09-24",
         ...
    },
    "sort" :        [ 1411516800000 ] <2>
},
...
}

_score 是比較消耗性能的, 而且通常主要用作排序 -- 我們不是用相關(guān)性進行排序的時候,就不需要統(tǒng)計其相關(guān)性
字段值默認以順序排列(從小到大 )拥诡,而 _score 默認以倒序排列触趴。

緩存

過濾器是怎么計算的。它們的核心是一個字節(jié)集來表示哪些文檔符合這個過濾器渴肉。Elasticsearch 主動緩存了這些字節(jié)集留作以后使用冗懦。一旦緩存后,當遇到相同的過濾時仇祭,這些字節(jié)集就可以被重用披蕉,而不需要重新運算整個過濾。
集很“聰明”:他們會增量更新乌奇。你索引中添加了新的文檔没讲,只有這些新文檔需要被添加到已存的字節(jié)集中,而不是一遍遍重新計算整個緩存的過濾器礁苗。過濾器和整個系統(tǒng)的其他部分一樣是實時的爬凑,你不需要關(guān)心緩存的過期時間。

安裝

  1. 首先需要依賴java7以上版本
  2. curl -L -O https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.3.3/elasticsearch-2.3.3.tar.gz
    tar -xvf elasticsearch-2.3.3.tar.gz
    cd elasticsearch-2.3.3/bin
    ./elasticsearch
  3. 可以在啟動的時候重寫集群和節(jié)點的名字
    ./elasticsearch --cluster.name my_cluster_name --node.name my_node_name
  4. 默認试伙,es使用9200端口提供 restapi訪問

安裝配置:

config/elasticsearch.yml

network : host : 10.0.0.4
path: logs: /var/log/elasticsearch 
data: /var/data/elasticsearch
cluster: name: <NAME OF YOUR CLUSTER>
node: name: <NAME OF YOUR NODE>

瀏覽你的集群

es提供了豐富的restapi用于和集群直接通信包括:
1.檢查集群嘁信,節(jié)點,索引疏叨,狀態(tài)和統(tǒng)計
2.管理集群潘靖,節(jié)點,索引數(shù)據(jù)和與元數(shù)據(jù)
3.對索引curd
4.使用高級搜索功能考廉,比如分頁秘豹,排序,過濾昌粤,腳本既绕,聚合和其他很多

集群健康:

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

返回
epoch timestamp cluster status node.total node.data shards pri relo init unassign
1394735289 14:28:09 elasticsearch green 1 1 0 0 0 0 0

顏色 意義
green 所有主要分片和復(fù)制分片都可用
yellow 所有主要分片可用啄刹,但不是所有復(fù)制分片都可用
red 不是所有的主要分片都可用

列舉出所有索引:

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

創(chuàng)建一個索引:

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

創(chuàng)建一個文檔:

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

刪除一個索引:

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

修改你的數(shù)據(jù)

替代你的文檔:
curl -XPUT 'localhost:9200/customer/external/1?pretty'-d '
{ "name": "John Doe" }'

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

如果指定了id,去創(chuàng)建凄贩,之前的那個會被覆蓋
如果沒有指定id誓军,es會隨機的生成一個id

更新文檔:

es并不會真正的更新文檔,當我們進行更新操作的時候疲扎,es刪除原來的文檔昵时,
然后添加一個新的文檔。

更新文檔也可以使用腳本椒丧,動態(tài)腳本在1.4.3版本默認被禁用
curl -XPOST 'localhost:9200/customer/external/1/_update?pretty'-d '
{ "script" : "ctx._source.age += 5" }'

ctx._source指向要被修改的文檔

es后續(xù)將會提供能力壹甥,類似sql中的 UPDATE-WHERE statement

刪除文檔

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

delete-by-query 插件可以刪除滿足要求的一類文檔

批量操作:

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

瀏覽你的數(shù)據(jù)

查詢API

took: es搜索使用了多少毫秒
timed_out 是否超時
_shards 告訴我們多少個分片被搜索,和被成功和失敗搜索的分片的數(shù)量
hits 搜索結(jié)果
hits.total 結(jié)果數(shù)量
hits.hits 搜索結(jié)果的列表(默認給出前10個)
_score 評分

查詢語句:

Query DSL
{"query":{"match_all":{}}}

規(guī)定數(shù)目

curl -XPOST 'localhost:9200/bank/_search?pretty'-d ' 
{ "query": { "match_all": {} }, "size": 1 }'

分頁

curl -XPOST 'localhost:9200/bank/_search?pretty'-d '
{
"query": { "match_all": {} }, 
"from": 10, 
"size": 10 
}'

規(guī)定返回指定的field

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

match:

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

bool: 加入布爾邏輯

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

filter

使用filter壶熏,es不再計算相關(guān)性得分句柠,只是嚴格的按照條件過濾
比如:range

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

Aggregations

提供能力是分組和提煉你的數(shù)據(jù) 就像sql里面的GROUP BY
es里你可以查詢返回hit和hit的聚合,在一次查詢中
而且可以進行多重聚合

安裝state分類棒假,然后返回10個狀態(tài)溯职,按照數(shù)量排序
設(shè)置size=0,不展示hits帽哑,因為我們只關(guān)心聚合結(jié)果

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

平局值 聚合每一種balance的平均值

suggest

lasticsearch 0.9.0.3終于基于AnalyzingSuggester加上了prefix suggestions 谜酒,可直接做搜索提示功能,在0.9.0.1之前版本都是使用外部插件實現(xiàn)的
參考文章
http://www.nosqldb.cn/1376024289369.html
http://www.cnblogs.com/jiuyuehe/p/3840821.html

總結(jié)

es是一個簡單又復(fù)雜的產(chǎn)品妻枕,還有很多高級的功能僻族。

拓展

官方文檔:

https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html

elasticSearch中文社區(qū):

http://elasticsearch.cn/

elasticsearch 索引優(yōu)化:

http://itindex.net/detail/52316-elasticsearch-%E7%B4%A2%E5%BC%95-%E4%BC%98%E5%8C%96

與其他相似功能產(chǎn)品對比:

http://www.cnblogs.com/chowmin/articles/4629220.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市佳头,隨后出現(xiàn)的幾起案子鹰贵,更是在濱河造成了極大的恐慌,老刑警劉巖康嘉,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碉输,死亡現(xiàn)場離奇詭異,居然都是意外死亡亭珍,警方通過查閱死者的電腦和手機敷钾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肄梨,“玉大人阻荒,你說我怎么就攤上這事≈谙郏” “怎么了侨赡?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我羊壹,道長蓖宦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任油猫,我火速辦了婚禮稠茂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘情妖。我一直安慰自己睬关,他們只是感情好,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布毡证。 她就那樣靜靜地躺著电爹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪情竹。 梳的紋絲不亂的頭發(fā)上藐不,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天匀哄,我揣著相機與錄音秦效,去河邊找鬼。 笑死涎嚼,一個胖子當著我的面吹牛阱州,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播法梯,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼苔货,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了立哑?” 一聲冷哼從身側(cè)響起夜惭,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎铛绰,沒想到半個月后诈茧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡捂掰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年敢会,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片这嚣。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡鸥昏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出姐帚,到底是詐尸還是另有隱情吏垮,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站膳汪,受9級特大地震影響像樊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜旅敷,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一生棍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧媳谁,春花似錦涂滴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至锤躁,卻和暖如春搁料,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背系羞。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工郭计, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人椒振。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓昭伸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親澎迎。 傳聞我的和親對象是個殘疾皇子庐杨,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • es 的來源 問題拆解 如果用數(shù)據(jù)庫來實現(xiàn)會怎么樣? 什么是全文檢索夹供? 什么是 Lucene灵份? 數(shù)據(jù)庫實現(xiàn) 先看第...
    小聰明李良才閱讀 781評論 0 0
  • Solr&ElasticSearch原理及應(yīng)用 一、綜述 搜索 http://baike.baidu.com/it...
    樓外樓V閱讀 7,285評論 1 17
  • 博客原文一博客原文二 翻譯作品哮洽,水平有限填渠,如有錯誤,煩請留言指正袁铐。原文請見 官網(wǎng)英文文檔 起步 Elasticse...
    rabbitGYK閱讀 3,250評論 0 68
  • “呦揭蜒,最近過的不錯嘛,聽說有新cp了?”二師兄瞇著眼看著以前的人剔桨。 “沒有沒有屉更,都是社團的人鬧得。...
    阿吉不惑閱讀 134評論 0 0
  • 雖然一直在學習時間管理和精力管理洒缀,但崩盤(失敼迕铡)也是常有的事欺冀。明知道要將失敗體驗當作成長的洗禮,并從中吸取教訓萨脑,總...
    汪盼盼Julie閱讀 867評論 0 2