ElasticSearch(提高篇)

前言

Elasticsearch的簡單入門請參考之前寫的一篇文章Elasticsearch簡單入門篇,這篇簡單介紹啦Elasticsearch的基本安裝温眉、Docker安裝方法咱台、基本的概念蒲每,以及如何使用Java代碼實(shí)現(xiàn)對(duì)ElasticsearchCRUD操作等入門知識(shí)。

內(nèi)容摘要

Elastic Search分享

1.1.Elastic Stack應(yīng)用場景

  • 網(wǎng)站搜索、代碼搜索等(例如生產(chǎn)環(huán)境的日志收集 ——格式化分析——全文檢索——系統(tǒng)預(yù)警)
  • 日志管理與分析啊胶、應(yīng)用系統(tǒng)性能分析、安全指標(biāo)監(jiān)控等

1.2.Elastic Stack技術(shù)架構(gòu)

Elastic static家族產(chǎn)品

image-20190802210856808

高級(jí)架構(gòu)

Elastic的技術(shù)架構(gòu)可以簡單垛贤,也可以高級(jí)焰坪,它是很具有擴(kuò)展性的,最簡單的技術(shù)架構(gòu)就是使用Beats進(jìn)行數(shù)據(jù)的收集聘惦,Beats是一種抽象的稱呼某饰,具體的可以是使用FileBeat收集數(shù)據(jù)源為文件的數(shù)據(jù)或者使用TopBeat來收集系統(tǒng)中的監(jiān)控信息,可以說類似Linux系統(tǒng)中的TOP命令善绎,當(dāng)然還有很多的Beats的具體實(shí)現(xiàn)黔漂,再使用logstash進(jìn)行數(shù)據(jù)的轉(zhuǎn)換和導(dǎo)入到Elasticsearch中,最后使用Kibana進(jìn)行數(shù)據(jù)的操作以及數(shù)據(jù)的可視化等操作禀酱。

當(dāng)然炬守,在生產(chǎn)環(huán)境中,我們的數(shù)據(jù)可能在不同的地方剂跟,例如關(guān)系型數(shù)據(jù)庫Postgre减途,或者MQ,再或者Redis中浩聋,我們可以統(tǒng)一使用Logstash進(jìn)行數(shù)據(jù)的轉(zhuǎn)換观蜗,同時(shí)臊恋,也可以根據(jù)數(shù)據(jù)的熱度不同將ES集群架構(gòu)為一種冷溫?zé)?/strong>架構(gòu)衣洁,利用ES的多節(jié)點(diǎn),將一天以內(nèi)的數(shù)據(jù)稱謂熱數(shù)據(jù)抖仅,讀寫頻繁坊夫,就存放在ES熱節(jié)點(diǎn)中砖第,七天以內(nèi)的數(shù)據(jù)稱之為溫?cái)?shù)據(jù),就是偶爾使用的數(shù)據(jù)存放在溫節(jié)點(diǎn)中环凿,將極少數(shù)會(huì)用到的數(shù)據(jù)存放在冷節(jié)點(diǎn)中梧兼。

image-20190802212002520

1.3.ES基本概念回顧

文檔(Document)

Elasticsearch面向文檔性,文檔就是所有可搜索數(shù)據(jù)的最小單位智听。比如羽杰,一篇PDF中的內(nèi)容,一部電影的內(nèi)容到推,一首歌等考赛,文檔會(huì)被序列化成JSON格式,保存在Elasticsearch中莉测,必不可少的是每個(gè)文檔都會(huì)有自己的唯一標(biāo)識(shí)颜骤,可以自己指定,也可以由Elasticsearch幫你生成捣卤。類似數(shù)據(jù)庫的一行數(shù)據(jù)忍抽。

元數(shù)據(jù)(標(biāo)注文檔信息)

"_index" : "user",
"_type" : "_doc",
"_id" : "l0D6UmwBn8Enzbv1XLz0",
"_score" : 1.6943597,
"_source" : {
    "user" : "mj",
    "sex" : "男",
    "age" : "18"
}
  • _index:文檔所屬的索引名稱。
  • _type:文檔所屬的類型名董朝。
  • _id:文檔的唯一標(biāo)識(shí)鸠项。
  • _version:文檔的版本信息。
  • _score:文檔的相關(guān)性打分子姜。
  • _source:文檔的原始JSON內(nèi)容锈锤。

索引(index)

索引是文檔的容器,是一類文檔的集合闲询,類似關(guān)系數(shù)據(jù)庫中的表久免,索引體現(xiàn)的是一種邏輯空間的概念,每個(gè)索引都應(yīng)該有自己的Mapping定義扭弧,用于定義包含文檔的字段名和字段類型阎姥。其中Shard(分片)體現(xiàn)的是物理空間的一種概念,就是索引中的數(shù)據(jù)存放在Shard上鸽捻,因?yàn)橛欣布汉舭停WC高空用,當(dāng)其中一個(gè)機(jī)器崩潰中御蒲,保存在它上的分片數(shù)據(jù)也能被正常訪問衣赶,因此,存在啦分片副本厚满。

索引中有兩個(gè)重要的概念府瞄,MappingSettingMapping定義的是文檔字段和字段類型碘箍,Setting定義的是數(shù)據(jù)的不同分布遵馆。

類型(Type)

  • 在7.0之前鲸郊,一個(gè)index可以創(chuàng)建多個(gè)Type。之后就只能一個(gè)index對(duì)應(yīng)一個(gè)Type货邓。

節(jié)點(diǎn)(Node)

一個(gè)節(jié)點(diǎn)就是一個(gè)Elaseticsearch實(shí)例秆撮,本質(zhì)就是一個(gè)JAVA進(jìn)程。每一個(gè)節(jié)點(diǎn)啟動(dòng)后换况,默認(rèn)就是一個(gè)master eligible節(jié)點(diǎn)职辨。就是具備成為master資格的節(jié)點(diǎn),你也可以狠心的指定它沒有這個(gè)資格(node.master:false)戈二,

第一個(gè)節(jié)點(diǎn)啟動(dòng)后拨匆,他就選自己成為Master節(jié)點(diǎn)類,每一個(gè)節(jié)點(diǎn)上都保存了集群狀態(tài)挽拂,但是惭每,只有Master才能修改集群狀態(tài)信息。集群狀態(tài)信息就比如:

  • 所有的節(jié)點(diǎn)信息亏栈。
  • 所有的索引信息台腥,索引對(duì)應(yīng)的mapping信息和setting信息。
  • 分片的路由信息绒北。

分片(shard)

  • 主分片:用于解決數(shù)據(jù)的水平擴(kuò)展問題黎侈,通過主分片就數(shù)據(jù)分布在集群內(nèi)的不同節(jié)點(diǎn)上,主分片在創(chuàng)建索引的時(shí)候就指定了闷游,后面就不允許修改峻汉,除非重新定義Index
  • 副本:用于解決高可用的問題脐往,分片是主分片的拷貝休吠。副本分片數(shù)可以動(dòng)態(tài)的調(diào)整,增加副本數(shù)量可以在一定的程度上提高服務(wù)的可用性业簿。關(guān)于主分片的理解可以如下圖瘤礁,看是怎樣實(shí)現(xiàn)高可用的,
image-20190802231314640
"settings" : {
    "index" : {
        // 設(shè)置主分片數(shù)
        "number_of_shards" : "1",
        "auto_expand_replicas" : "0-1",
        "provided_name" : "kibana_sample_data_logs",
        "creation_date" : "1564753951554",
        // 設(shè)置副本分片數(shù)
        "number_of_replicas" : "1",
        "uuid" : "VVMLRyw6TZeSfUvvLNYXEw",
        "version" : {
            "created" : "7010099"
        }
    }
}

1.4.倒排索引

正排索引:就是文檔ID到文檔內(nèi)容的索引梅尤,簡單講柜思,就是根據(jù)ID找文檔。

倒排索引:就是根據(jù)文檔內(nèi)容找文檔巷燥。

倒排索引包含如下信息:

  • 單詞詞典:用于記錄所有文檔的單詞赡盘,以及單詞到倒排列表的關(guān)聯(lián)關(guān)系。
  • 倒排列表:記錄的是單詞對(duì)應(yīng)的文檔集合缰揪,由倒排索引項(xiàng)組成陨享,其中包含
    • 文檔ID
    • 單詞出現(xiàn)的次數(shù),用于相關(guān)性的評(píng)分
    • 單詞出現(xiàn)的位置
    • 偏移量,用于記錄單詞的開始位置和結(jié)束位置霉咨,用于單詞的高亮顯示

舉例說明什么是正排索引倒排索引,其中正排索引如下:

文檔ID 文檔內(nèi)容
1101 Elasticsearch Study
1102 Elasticsearch Server
1103 master Elasticsearch

講上例Elasticsearch單詞修改為倒排索引拍屑,如下:

文檔ID(Doc ID) 出現(xiàn)次數(shù)(TF) 位置(Position) 偏移量(Offset)
1101 1 0 <0,13>
1102 1 0 <0,13>
1103 1 1 <7,20>

Elasticsearch中的每一個(gè)字段都有自己的倒排索引途戒,也可以指定某些字段不做索引,可以節(jié)省存儲(chǔ)空間僵驰,缺點(diǎn)就是不能被搜索到喷斋。

1.5.Analyzer分詞

Analysis:文本分析,就是將文本轉(zhuǎn)換為單詞(term或者token)的過程蒜茴,其中Analyzer就是通過Analysis實(shí)現(xiàn)的星爪,Elasticsearch給我們內(nèi)置例很多分詞器。

  • Standard Analyzer:默認(rèn)的分詞器粉私,按照詞切分顽腾,并作大寫轉(zhuǎn)小寫處理
  • Simple Analyzer:按照非字母切分(符號(hào)被過濾),并作大寫轉(zhuǎn)小寫處理
  • Stop Anayzer:停用詞(the诺核、is)切分抄肖,并作大寫轉(zhuǎn)小寫處理
  • Whitespace Anayzer:空格切分,不做大寫轉(zhuǎn)小寫處理
  • IK:中文分詞器窖杀,需要插件安裝
  • ICU:國際化的分詞器漓摩,需要插件安裝
  • jieba:時(shí)下流行的一個(gè)中文分詞器。安裝方法見附錄

PS:Elasticsearch安裝插件入客,[root@34d02ff9d16c elasticsearch]# bin/elasticsearch-plugin install analysis-icu

查看已經(jīng)安裝的插件:bin/elasticsearch-plugin list

1.6.Search API

ES中管毙,我們可以使用URL SearchRequest Body Search進(jìn)行相關(guān)的查詢操作。

URL 查詢

使用基本的查詢

GET /user/_search?q=2012&df=title&sort=year:desc&from=0&size=10
{
    ??profile??: true
}
  • 使用q指定查詢的字符串
  • 使用df指定查詢的字段
  • 使用sort進(jìn)行排序桌硫,使用fromsize指定分頁
  • 使用profile可以查詢查詢是如何進(jìn)行查詢的

指定所有字段的泛查詢

GET /user/_search?q=2012
{
    "profile":"true"
}

指定字段的查詢


GET /user/_search?q=title:2012&sort=year:desc&from=0&size=10&timeout=1s
{
    "profile":"true"
}

Term查詢

GET /user/_search?q=title:Beautiful Mind
{
    "profile":"true"
}
  • 上例中的BeautifulMind就是兩個(gè)Term夭咬,Term是查詢中最小的單位。
  • Term查詢是OR的關(guān)系铆隘,在上例中就是title字段包含Beautiful或者包含Mind都會(huì)被檢索到皱埠。

Phrase查詢

GET /user/_search?q=title:"Beautiful Mind"
{
    "profile":"true"
}
  • 使用引號(hào)表示Phrase查詢
  • Phrase查詢表示的不僅是And的關(guān)系,即Title字段中不僅要包含Beautiful Mind咖驮,而且边器。順序還要一致。

分組查詢

GET /user/_search?q=title:(Beautiful Mind)
{
    "profile":"true"
}
  • 使用中括號(hào)表示分組查詢托修,一般使用Term查詢的時(shí)候都會(huì)帶上分組查詢忘巧。

布爾查詢

  • 使用 ANDOR睦刃、NOT或者||砚嘴、&&!
  • 還可以使用+(表示must),使用-(表示must_not
  • 需要注意的是必須大寫
GET /user/_search?q=title:(Beautiful NOT Mind)
{
    "profile":"true"
}
GET /user/_search?q=title:(Beautiful %2BMind)
{
    "profile":"true"
}

PS:%2B表示的就是+,上例子表示的就是title字段中既要包含Beautiful际长,也要包含Mind字段

范圍查詢

GET /user/_search?q=title:beautiful AND age:[2002 TO 2018%7D
{
    "profile":"true"
}
  • 使用[ ]表示閉區(qū)間耸采,使用{ }表示開區(qū)間,例如age :[* TO 56]
  • 使用算術(shù)符表示范圍工育,例如year :>=2019 && <=1970

PS:URL Search還有很多查詢方式虾宇。例如通配符查詢,正則插敘如绸,模糊匹配嘱朽,相似查詢,其中通配符查詢不建議使用怔接。

Request Body 查詢

將查詢的條件參數(shù)放在Request Body中搪泳,調(diào)用查詢接口,就是Request Body查詢扼脐,

基本 的查詢

POST /movies,404_idx/_search?ignore_unavailable=true
{
  "profile": true,
    "query": {
        "match_all": {}
    }
}
  • 使用gnore_unavailable=true可以避免索引404_idx不存在導(dǎo)致的報(bào)錯(cuò)
  • profileURL Search查詢一樣岸军,可以看到查詢的執(zhí)行方式

分頁查詢

POST /movies/_search
{
  "from":10,
  "size":20,
  "query":{
    "match_all": {}
  }
}

排序查詢

POST /movies/_search
{
  "sort":[{"order_date":"desc"}],
  "query":{
    "match_all": {}
  }
}

過濾要查詢的字段

POST /movies/_search
{
  "_source":["order_date"],
  "query":{
    "match_all": {}
  }
}
  • 如果一個(gè)文檔中的字段太多,我們不需全部字段顯示瓦侮,就可以使用_source指定字段凛膏。可以使用通配符脏榆。

使用腳本查詢

  • ES中的文檔字段進(jìn)行一定的處理后猖毫,再根據(jù)這個(gè)新的字段進(jìn)行排序,
GET /movies/_search
{
  "script_fields": {
    "new_field": {
      "script": {
        "lang": "painless",
        "source": "doc['name'].value+'是大佬'"
      }
    }
  },
  "query": {
    "match_all": {}
  }
}

Term查詢

POST /movies/_search
{
  "query": {
    "match": {
      "title": "last christmas"
    }
  }
}

POST movies/_search
{
  "query": {
    "match": {
      "title": {
        "query": "last christmas",
        "operator": "and"
      }
    }
  }
}
  • 使用match须喂,表示的就是OR的關(guān)系
  • 使用operator吁断,表示查詢方式

Math_phrase查詢

POST movies/_search
{
  "query": {
    "match_phrase": {
      "title":{
        "query": "one love",
         "slop": 4
      }
    }
  }
}
  • slop指定查詢的字符中允許出現(xiàn)的字符

1.7.Dynamic Mapping

Mapping可以簡單的理解為數(shù)據(jù)庫中的Schema定義,用于定義索引中的字段的名稱坞生,定義字段的類型仔役,字段的倒排索引指定字段使用何種分詞器等是己。Dynamic Mapping意思就是在我們創(chuàng)建文檔的時(shí)候又兵,如果索引不存在,就會(huì)自動(dòng)的創(chuàng)建索引卒废,同時(shí)自動(dòng)的創(chuàng)建Mapping沛厨,ElasticSearch會(huì)自動(dòng)的幫我們推算出字段的類型,當(dāng)然摔认,也會(huì)存在推算不準(zhǔn)確的時(shí)候逆皮,就需要我們手動(dòng)的設(shè)置。常用的字段類型如下:

  • 簡單類型:Text参袱、Date电谣、Integer秽梅、Boolean
  • 復(fù)雜類型:對(duì)象類型和嵌套類型。

我們可以使用GET /shgx/_mapping查詢索引的Mapping的設(shè)置剿牺,需要注意的是以下幾點(diǎn):

  • 當(dāng)我們對(duì)索引中的文檔新增字段時(shí)候企垦,希望可以更新索引的Mapping就可以可以設(shè)置Dynamic:true
  • 對(duì)于已經(jīng)有數(shù)據(jù)的字段晒来,就不再允許修改其Mapping钞诡,因?yàn)?code>Lucene生成的倒排索引后就不允許修改。

Dynamic Mapping可以設(shè)置三個(gè)值潜索,分別是:

  • true:文檔可被索引臭增,新增字段也可被索引懂酱,Mapping也會(huì)被更新竹习。
  • false:文檔可被索引,新增字段不能被索引列牺,Mapping不會(huì)被更新整陌。
  • strict:新增字段寫入,直接報(bào)錯(cuò)瞎领。

如何寫Mapping

第一種方式是參考官方API泌辫,純手工寫,也可以先創(chuàng)建一個(gè)臨時(shí)的IndexElasticSearch自動(dòng)當(dāng)我們推斷出基本的Mapping九默,然后自己在改吧改吧震放,最后把臨時(shí)索引刪掉就是啦。下面列舉一些常用的Mapping設(shè)置屬性:

  • index:可以設(shè)置改字段是否需要被索引到驼修。設(shè)置為false就不會(huì)生成倒排索引殿遂,節(jié)省啦磁盤開銷
  • null_value:可以控制NULL是否可以被索引
  • cope_to:將字段值放在一個(gè)新的字段中,可以使用新的字段search乙各,但這個(gè)字段不會(huì)出現(xiàn)在_source中墨礁。
  • anaylzer:指定字段的分詞器
  • search_anaylzer:指定索引使用的分詞器
  • index_options:控制倒排索引的生成結(jié)構(gòu),有四種情況
    • docs:倒排索引只記錄文檔ID
    • freqs:記錄文檔IDTerm
    • positions:記錄文檔ID耳峦、TermTerm Position
    • offsets:記錄文檔ID恩静、TermTerm Positionoffsets

PS:Text類型的字段默認(rèn)的是Position蹲坷,其它類型默認(rèn)的是docs驶乾,記錄的越多,占用的存儲(chǔ)空間就越大循签。

1.8.Aggregation聚合分析

ElasticSearch不僅僅是搜索強(qiáng)大轻掩,他的統(tǒng)計(jì)功能也是相當(dāng)?shù)膹?qiáng)大的,聚合分析就是統(tǒng)計(jì)整個(gè)數(shù)據(jù)的一個(gè)分類數(shù)量等懦底,例如武侯區(qū)有多少新樓盤唇牧。天府新區(qū)有多少新樓盤罕扎,通過聚合分析我們只需要寫一條語句就可以得到。在加上Kibana的可視化分析丐重,簡直就是清晰腔召,高效。常用的集合有以下幾種:

  • Bucket Aggregation:滿足特定條件的一些集合扮惦,使用關(guān)鍵字terms
  • Metric Aggregation:簡單的數(shù)學(xué)運(yùn)算臀蛛,對(duì)字段進(jìn)行統(tǒng)計(jì)分析,使用關(guān)鍵字min崖蜜、max浊仆、sumavg等豫领,使用關(guān)鍵字aggs
  • Pipeline Aggregation:二次聚合
  • Matrix Aggregation:對(duì)多個(gè)字段進(jìn)行操作抡柿,提供一個(gè)結(jié)果矩陣

Bucket分析示例

GET kibana_sample_data_flights/_search
{
    "size": 0,
    "aggs":{
        "flight_dest":{
            "terms":{
                "field":"DestCountry"
            }
        }
    }
}

Metric分析示例

GET kibana_sample_data_flights/_search
{
    "size": 0,
    "aggs":{
        "flight_dest":{
            "terms":{
                "field":"DestCountry"
            },
            "aggs":{
                "avg_price":{
                    "avg":{
                        "field":"AvgTicketPrice"
                    }
                },
                "max_price":{
                    "max":{
                        "field":"AvgTicketPrice"
                    }
                },
                "min_price":{
                    "min":{
                        "field":"AvgTicketPrice"
                    }
                }
            }
        }
    }
}

附錄一

相關(guān)閱讀

更多文章等恐,更好的閱讀體驗(yàn)洲劣,請前往個(gè)人網(wǎng)站查看 碼醬博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市课蔬,隨后出現(xiàn)的幾起案子囱稽,更是在濱河造成了極大的恐慌,老刑警劉巖二跋,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件战惊,死亡現(xiàn)場離奇詭異,居然都是意外死亡扎即,警方通過查閱死者的電腦和手機(jī)吞获,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铺遂,“玉大人衫哥,你說我怎么就攤上這事〗笕瘢” “怎么了撤逢?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長粮坞。 經(jīng)常有香客問我蚊荣,道長,這世上最難降的妖魔是什么莫杈? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任互例,我火速辦了婚禮,結(jié)果婚禮上筝闹,老公的妹妹穿的比我還像新娘媳叨。我一直安慰自己腥光,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布糊秆。 她就那樣靜靜地躺著武福,像睡著了一般。 火紅的嫁衣襯著肌膚如雪痘番。 梳的紋絲不亂的頭發(fā)上捉片,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音汞舱,去河邊找鬼伍纫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛昂芜,可吹牛的內(nèi)容都是我干的莹规。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼说铃,長吁一口氣:“原來是場噩夢啊……” “哼访惜!你這毒婦竟也來了嘹履?” 一聲冷哼從身側(cè)響起腻扇,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎砾嫉,沒想到半個(gè)月后幼苛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡焕刮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年舶沿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片配并。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡括荡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出溉旋,到底是詐尸還是另有隱情畸冲,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布观腊,位于F島的核電站邑闲,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏梧油。R本人自食惡果不足惜苫耸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望儡陨。 院中可真熱鬧褪子,春花似錦量淌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至渔扎,卻和暖如春硫狞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背晃痴。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來泰國打工残吩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人倘核。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓泣侮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親紧唱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子活尊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

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