Elasticsearch - 索引

注:此文檔僅適用于 Elasticsearch > 5.0 版本

一個(gè) Elasticsearch 集群可以包含多個(gè)索引,相應(yīng)的每個(gè)索引可以包含多個(gè)類(lèi)型。這些不同的類(lèi)型存儲(chǔ)著多個(gè) 文檔厉碟,每個(gè)文檔又有多個(gè)字段涵妥,每一個(gè)文檔都有一個(gè)唯一的_id的屬性棠赛,因此索引挺智、 類(lèi)型 、_id 這三個(gè)屬性可以定位到一個(gè)具體的文檔。

一個(gè)索引類(lèi)似于傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)中的一個(gè)數(shù)據(jù)庫(kù)朵锣,是一個(gè)存儲(chǔ)關(guān)系型文檔的地方。但是甸私,與關(guān)系型數(shù)據(jù)庫(kù)不同诚些,Elasticsearch 一次查詢(xún)可以同時(shí)搜索多個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù)。

創(chuàng)建索引

默認(rèn)情況下皇型,我們可以通過(guò)添加一個(gè)新的文檔來(lái)創(chuàng)建一個(gè)新的索引诬烹,但是此時(shí)創(chuàng)建的索引采用的是默認(rèn)的配置,新的字段通過(guò)動(dòng)態(tài)映射的方式被添加到類(lèi)型映射弃鸦。如果需要對(duì)這個(gè)建立索引的過(guò)程做更多的控制:我們想要確保這個(gè)索引有數(shù)量適中的主分片绞吁,合適的映射關(guān)系和分析器,我們需要手動(dòng)創(chuàng)建索引唬格。

如果你想禁止自動(dòng)創(chuàng)建索引家破,你可以通過(guò)在 config/elasticsearch.yml 的每個(gè)節(jié)點(diǎn)下添加下面的配置:action.auto_create_index: false

PUT /my_index
{
    "settings": { 
        "number_of_shards" : 1,
        "number_of_replicas" : 0 
    },
    "mappings": {
        "type_one": { ... any mappings ... },
        "type_two": { ... any mappings ... },
        ...
    }
}

settings 下有下面幾個(gè)重要的設(shè)置:

number_of_shards

每個(gè)索引的主分片數(shù),默認(rèn)值是 5 购岗。這個(gè)配置在索引創(chuàng)建后不能修改汰聋,因此這個(gè)數(shù)值需要仔細(xì)考慮斟酌。分片類(lèi)似于數(shù)據(jù)庫(kù)中的分庫(kù)分表喊积,在集群中烹困,同一個(gè)索引的分片會(huì)均勻的分布在集群的節(jié)點(diǎn)中。

舉個(gè)例子乾吻,如果當(dāng)前集群中有3個(gè)節(jié)點(diǎn)髓梅,設(shè)置了 number_of_shards 為3拟蜻,則3個(gè)分片就會(huì)均勻的分布在3個(gè)節(jié)點(diǎn)上,查詢(xún)時(shí)枯饿,可以并行查詢(xún)3個(gè)節(jié)點(diǎn)酝锅。但是,如果集群增加到 6 個(gè)節(jié)點(diǎn)奢方,這時(shí)由于 number_of_shards 不能修改搔扁,就不能利用到 6 個(gè)節(jié)點(diǎn)了。因此袱巨,在設(shè)計(jì)之初就要考慮好 number_of_shards 怎么設(shè)置,考慮是否留一定余地碳抄。

number_of_replicas

每個(gè)主分片的副本數(shù)(即備份)愉老,默認(rèn)值是 1 。這個(gè)配置是可以隨時(shí)修改剖效。在開(kāi)發(fā)環(huán)境下可以將這個(gè)數(shù)值設(shè)置為0嫉入,以減少磁盤(pán)空間的消耗。生產(chǎn)環(huán)境下璧尸,根據(jù)節(jié)點(diǎn)數(shù)和看情況選擇合適的值咒林,值越大,磁盤(pán)空間消耗越大爷光。

我們可以用 update-index-settings API 動(dòng)態(tài)修改副本數(shù):

PUT /my_index/_settings
{
    "number_of_replicas": 1
}

refresh_interval

在 Elasticsearch 中垫竞,當(dāng)添加一個(gè)文檔到這個(gè)文檔可以被搜索需要一個(gè)過(guò)程,這個(gè)過(guò)程叫做需要消耗很大的資源蛀序,因此不是每次添加文檔 Elasticsearch 都會(huì)執(zhí)行寫(xiě)入這個(gè)操作欢瞪。因此 Elasticsearch 會(huì)在一定的窗口期內(nèi)集中大量文檔一起進(jìn)行 ,默認(rèn)情況下這個(gè)窗口期為 1s徐裸。

這就是為什么我們說(shuō) Elasticsearch 是近實(shí)時(shí)搜索遣鼓,文檔的變化不是立即對(duì)搜索可見(jiàn)的,但會(huì)在1秒之后變?yōu)榭梢?jiàn)重贺。

但并不是每種情況都需要每秒刷新骑祟。可能你正在使用 Elasticsearch 索引大量日志文件气笙,你可能想優(yōu)化索引速度而不是近實(shí)時(shí)搜索次企,可以通過(guò)設(shè)置 refersh_interval ,降低每個(gè)索引的刷新頻率潜圃。

PUT /my_index
{
  "settings": {
    "refresh_interval": "30s" 
  }
}

translog

translog 也稱(chēng)事務(wù)日志抒巢,在每一次對(duì) Elasticsearch 進(jìn)行操作時(shí)均進(jìn)行了日志記錄。translog 主要用于保證 Elasticsearch 的可靠性秉犹。當(dāng)服務(wù)器宕機(jī)時(shí)蛉谜,Elasticsearch 可以根據(jù)事務(wù)日志進(jìn)行恢復(fù)稚晚。

將 translog 持久化到磁盤(pán)的過(guò)程,在 Elasticsearch 稱(chēng)為 flush型诚。默認(rèn)情況下是每 5 秒或者每次寫(xiě)請(qǐng)求完成之后執(zhí)行一次 flush客燕。

在每次請(qǐng)求后都執(zhí)行 flush 會(huì)帶來(lái)一些性能損失,因此對(duì)于一些大容量的偶爾丟失幾秒數(shù)據(jù)問(wèn)題也不太嚴(yán)重的集群狰贯,可以使用異步 fsync 的方式提高性能也搓。比如,寫(xiě)入的數(shù)據(jù)被緩存到內(nèi)存中涵紊,在每 5 秒執(zhí)行一次 fsync傍妒。

這個(gè)行為可以通過(guò)設(shè)置 durability 參數(shù)為 async 來(lái)啟用:

PUT /my_index/_settings
{
    "index.translog.durability": "async",
    "index.translog.sync_interval": "5s"
}

這個(gè)選項(xiàng)可以針對(duì)索引單獨(dú)設(shè)置,也可以動(dòng)態(tài)修改摸柄。如果你決定使用異步 translog 的話(huà)颤练,你需要保證發(fā)生宕機(jī)時(shí),丟掉 sync_interval 時(shí)間段的數(shù)據(jù)也無(wú)所謂驱负。

刪除索引

# 刪除索引
DELETE /my_index

# 你也可以這樣刪除多個(gè)索引
DELETE /index_one,index_two
DELETE /index_*

# 刪除全部索引:
DELETE /_all
DELETE /*

查詢(xún)索引信息

GET /twitter

Mappings

類(lèi)型在 Elasticsearch 中表示一類(lèi)相似的文檔嗦玖,類(lèi)似于數(shù)據(jù)庫(kù)中的表。類(lèi)型由名稱(chēng)和映射組成跃脊。

映射宇挫,就像數(shù)據(jù)庫(kù)中的 schema ,描述了文檔可能具有的字段或?qū)傩?酪术、 每個(gè)字段的數(shù)據(jù)類(lèi)型以及 Lucene 是如何索引和存儲(chǔ)這些字段的器瘪。

映射的最高一層被稱(chēng)為根對(duì)象 ,它可能包含下面幾項(xiàng):

  • 一個(gè) properties 節(jié)點(diǎn)绘雁,列出了文檔中可能包含的每個(gè)字段的映射
  • 各種元數(shù)據(jù)字段娱局,它們都以一個(gè)下劃線(xiàn)開(kāi)頭,例如 _type 咧七、 _id_source
  • 設(shè)置項(xiàng)衰齐,控制如何動(dòng)態(tài)處理新的字段,例如 analyzer 继阻、 dynamic_date_formatsdynamic_templates
  • 其他設(shè)置耻涛,可以同時(shí)應(yīng)用在根對(duì)象和其他 object 類(lèi)型的字段上,例如 enabled 瘟檩、 dynamicinclude_in_all

使用 PUT 添加或更新 mappings抹缕,GET 方法獲取 mappings。

PUT my_index
{
  "mappings": {
    "_source": { "enabled":  false },
    "_all": { "enabled": false },
    "my_type": {
      "properties": {
        "tags": { "type":  "keyword" }
      }
    }
  }
}

# 獲取指定 type 的 mapping
GET /twitter/_mapping/tweet
# 獲取所有的 mapping
GET /_mapping

元數(shù)據(jù)字段

每一個(gè)文檔都有與之關(guān)聯(lián)的元數(shù)據(jù)墨辛,例如 _type 卓研、 _id_source。在創(chuàng)建映射的時(shí)候,可以自定義這些元數(shù)據(jù)的行為奏赘。

(1)文檔標(biāo)識(shí):

文檔標(biāo)識(shí)與四個(gè)元數(shù)據(jù)字段相關(guān):

_id:文檔的 ID 字符串

_type:文檔的類(lèi)型

_index:文檔的索引

_uid_type_id 連接在一起構(gòu)造成 type#id

(2)原數(shù)據(jù)

_source:默認(rèn)地寥闪,Elasticsearch 在 _source 字段存儲(chǔ)代表文檔體的JSON字符串。然而磨淌,存儲(chǔ) _source 字段的確要使用磁盤(pán)空間疲憋。因此可以使用下面的方法禁用 _source 字段。

PUT /my_index
{
    "mappings": {
        "my_type": {
            "_source": { "enabled":  false }
        }
    }
}

(3)索引

_field_names_field_names 字段包含了文檔中所有除 null 之外的字段名稱(chēng)梁只,主要用于 exists 查詢(xún)缚柳。使用 _field_names 會(huì)增加創(chuàng)建索引的時(shí)間,如果你不需要使用 exists 查詢(xún)搪锣,可以禁用 _field_names秋忙。

PUT /my_index
{
  "mappings": {
    "_doc": {
      "_field_names": { "enabled": false }
    }
  }
}

_all:一個(gè)把其它字段值當(dāng)作一個(gè)大字符串來(lái)索引的特殊字段(在最新的 6.0 版本中,_all 已經(jīng)取消构舟,因此不建議使用)灰追。 如果你不再需要 _all 字段,你可以通過(guò)下面的映射來(lái)禁用:

PUT /my_index/_mapping/my_type
{
    "my_type": {
        "_all": { "enabled": false }
    }
}

字段類(lèi)型

核心類(lèi)型

text:字符串類(lèi)型旁壮,用于全文索引的字段监嗜,例如一篇文章或評(píng)論谐檀。

keyword:keyword 用于結(jié)構(gòu)化查詢(xún)的字段抡谐。

long, integer, short, byte, double, float, half_float, scaled_float:數(shù)字類(lèi)型

date:時(shí)間類(lèi)型

常用的時(shí)間類(lèi)型 format 有:epoch_millis(時(shí)間戳,精確到毫秒)桐猬、epoch_second(時(shí)間戳麦撵,精確到秒)

boolean:布爾類(lèi)型

binary:二進(jìn)制類(lèi)型

復(fù)雜類(lèi)型

array:json 中的數(shù)組,里面可以包含 string溃肪、integers免胃、arrayobjects惫撰,如果是 array object羔沙,里面包含的對(duì)象或數(shù)組不會(huì)被索引。

object:對(duì)象

nested:array 對(duì)象厨钻,里面的包含的對(duì)象字段會(huì)被索引扼雏。

其它具體的字段類(lèi)型,可以查看官方文檔:https://www.elastic.co/guide/en/elasticsearch/reference/5.0/mapping-types.html

dynamic

當(dāng) Elasticsearch 遇到文檔中以前未遇到的字段夯膀,它用動(dòng)態(tài)映射來(lái)確定字段的數(shù)據(jù)類(lèi)型并自動(dòng)把新的字段添加到類(lèi)型映射诗充。

有時(shí)這是想要的行為有時(shí)又不希望這樣。通常沒(méi)有人知道以后會(huì)有什么新字段加到文檔诱建,但是又希望這些字段被自動(dòng)的索引蝴蜓。也許你只想忽略它們。如果Elasticsearch是作為重要的數(shù)據(jù)存儲(chǔ),可能就會(huì)期望遇到新字段就會(huì)拋出異常茎匠,這樣能及時(shí)發(fā)現(xiàn)問(wèn)題格仲。

可以用 dynamic 配置來(lái)控制這種行為 ,可接受的選項(xiàng)如下:

  • true: 動(dòng)態(tài)添加新的字段--缺省
  • false: 忽略新的字段
  • strict: 如果遇到新字段拋出異常

例如下面這個(gè)例子:如果遇到新字段汽抚,對(duì)象 my_type 就會(huì)拋出異常抓狭。而內(nèi)部對(duì)象 stash 遇到新字段就會(huì)動(dòng)態(tài)創(chuàng)建新字段。

PUT /my_index
{
    "mappings": {
        "my_type": {
            "dynamic":      "strict", 
            "properties": {
                "title":  { "type": "string"},
                "stash":  {
                    "type":     "object",
                    "dynamic":  true 
                }
            }
        }
    }
}

dynamic 設(shè)置為 false 時(shí)造烁,不會(huì)改變 _source 的字段內(nèi)容否过。 _source 仍然包含被索引的整個(gè)文檔。只是新的字段不會(huì)被加到映射中也不可搜索惭蟋。

缺省映射

通常苗桂,一個(gè)索引中的所有類(lèi)型共享相同的字段和設(shè)置。 _default_ 映射更加方便地指定通用設(shè)置告组,而不是每次創(chuàng)建新類(lèi)型時(shí)都要重復(fù)設(shè)置煤伟。 _default_ 映射是新類(lèi)型的模板。在設(shè)置 _default_ 映射之后創(chuàng)建的所有類(lèi)型都將應(yīng)用這些缺省的設(shè)置木缝,除非類(lèi)型在自己的映射中明確覆蓋這些設(shè)置便锨。

例如,我們可以使用 _default_ 映射為所有的類(lèi)型禁用 _all 字段我碟, 而只在 blog 類(lèi)型啟用:

PUT /my_index
{
    "mappings": {
        "_default_": {
            "_all": { "enabled":  false }
        },
        "blog": {
            "_all": { "enabled":  true  }
        }
    }
}

更新 mapping

當(dāng)需要新增類(lèi)型或新增字段時(shí)放案,只需要重新 PUT 新的索引信息即可。但是當(dāng)我們需要添加新的分析器或?qū)σ延凶侄涡薷臅r(shí)矫俺,Elasticsearch 是不允許這樣做的吱殉,如果你那么做的話(huà),結(jié)果就是那些已經(jīng)被索引的數(shù)據(jù)就不正確厘托, 搜索也不能正常工作友雳。

這個(gè)時(shí)候就需要?jiǎng)?chuàng)建新的索引,然后數(shù)據(jù)重新導(dǎo)入铅匹。如果你的索引開(kāi)啟了 _source 字段押赊,則可以使用 reindex 功能快速進(jìn)行這個(gè)過(guò)程。

POST _reindex
{
  "source": {
    "index": "twitter"
  },
  "dest": {
    "index": "new_twitter"
  }
}

索引別名

索引別名就像一個(gè)快捷方式或軟連接包斑,可以指向一個(gè)或多個(gè)索引流礁,也可以給任何一個(gè)需要索引名的API來(lái)使用。別名 帶給我們極大的靈活性舰始,允許我們做下面這些:

  • 在運(yùn)行的集群中可以無(wú)縫的從一個(gè)索引切換到另一個(gè)索引
  • 給多個(gè)索引分組 (例如崇棠, last_three_months)
  • 給索引的一個(gè)子集創(chuàng)建 視圖

下面例子展示如何創(chuàng)建索引別名和刪除索引別名。

POST /_aliases
{
    "actions": [
        { "remove": { "index": "my_index_v1", "alias": "my_index" }},
        { "add":    { "index": "my_index_v2", "alias": "my_index" }}
    ]
}

通過(guò)下面的操作可以查看已經(jīng)創(chuàng)建的別名信息丸卷。

# 查看這個(gè)別名指向哪個(gè)索引
GET /*/_alias/my_index
# 哪些別名指向這個(gè)索引
GET /my_index_v1/_alias/*

索引模板

在日志類(lèi)應(yīng)用中枕稀,通常會(huì)根據(jù)日志的時(shí)間分配到不同的索引中。例如:2017-01-02 的日志分配到 log-20170102 的索引中。這樣做有幾個(gè)好處萎坷,(1)按照時(shí)間劃分凹联,按天查詢(xún)或統(tǒng)計(jì)的速度會(huì)比較快(2)如果2018年的日志比2017年的日志多,可以調(diào)整2018年日志的分片數(shù)哆档,以提高效率蔽挠。

在日志類(lèi)應(yīng)用中,如果每次都手動(dòng)創(chuàng)建索引會(huì)比較麻煩瓜浸,這時(shí)就可以使用索引模板功能讓 Elasticsearch 根據(jù)模板自動(dòng)創(chuàng)建索引澳淑。

下面例子創(chuàng)建了一個(gè) my_logs 的索引模板,此模板適用于所有以 logs- 開(kāi)頭的索引插佛,新創(chuàng)建的索引會(huì)被自動(dòng)添加到 last_3_months 這個(gè)別名中杠巡。多個(gè)模板同時(shí)匹配,以 order 順序倒排雇寇,order 越大氢拥,優(yōu)先級(jí)越高。

PUT /_template/my_logs 
{
  "template": "logs-*", 
  "order": 0,
  "settings": {
    "number_of_shards": 1 
  },
  "mappings": {
    "_default_": { 
      "_all": {
        "enabled": false
      }
    }
  },
  "aliases": {
    "last_3_months": {} 
  }
}

在運(yùn)行過(guò)程中锨侯,如果需要修改模板則可以運(yùn)行上面的例子嫩海,修改里面的參數(shù)。完成之后囚痴,創(chuàng)建新索引的配置項(xiàng)會(huì)跟著發(fā)生變化叁怪,已經(jīng)創(chuàng)建了的索引不會(huì)發(fā)生變化。

查看模板和刪除模板的方法如下:

# 刪除模板
DELETE /_template/template_1

# 查看所有模板
GET /_template
# 查看指定名稱(chēng)的模板
GET /_template/template_1

參考資料:

  1. Elasticsearch mapping 設(shè)計(jì)總結(jié)
  2. Elasticsearch: 權(quán)威指南
  3. Elasticsearch 官方文檔
  4. elasticsearch中 refresh 和flush區(qū)別
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末渡讼,一起剝皮案震驚了整個(gè)濱河市骂束,隨后出現(xiàn)的幾起案子耳璧,更是在濱河造成了極大的恐慌成箫,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旨枯,死亡現(xiàn)場(chǎng)離奇詭異蹬昌,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)攀隔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)皂贩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人昆汹,你說(shuō)我怎么就攤上這事明刷。” “怎么了满粗?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵辈末,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)挤聘,這世上最難降的妖魔是什么轰枝? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮组去,結(jié)果婚禮上鞍陨,老公的妹妹穿的比我還像新娘。我一直安慰自己从隆,他們只是感情好诚撵,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著键闺,像睡著了一般砾脑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上艾杏,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天韧衣,我揣著相機(jī)與錄音,去河邊找鬼购桑。 笑死畅铭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的勃蜘。 我是一名探鬼主播硕噩,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼缭贡!你這毒婦竟也來(lái)了炉擅?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤阳惹,失蹤者是張志新(化名)和其女友劉穎谍失,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體莹汤,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡快鱼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纲岭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抹竹。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖止潮,靈堂內(nèi)的尸體忽然破棺而出窃判,到底是詐尸還是另有隱情,我是刑警寧澤喇闸,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布袄琳,位于F島的核電站窿凤,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏跨蟹。R本人自食惡果不足惜雳殊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窗轩。 院中可真熱鬧夯秃,春花似錦、人聲如沸痢艺。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)堤舒。三九已至色建,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間舌缤,已是汗流浹背箕戳。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留国撵,地道東北人陵吸。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像介牙,于是被迫代替她去往敵國(guó)和親壮虫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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