ElasticSearch

ElasticSearch

1.什么是ElasticSearch

Elasticsearch是用Java語言開發的基于Lucene的搜索服務器。它提供了一個分布式多用戶能力的全文搜索引擎,基于RESTful web接口。ElasticSearch用于云計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便。

2.為什么實用ElashSearch?

1).ElashSearch擴展性好:分布式,無需人工搭建集群(solr就需要人為配置,使用Zookeeper作為注冊中心)。

2).ElashSearch近實時的去索引數據、搜索數據。

3.ElashSearch的原理?

下圖是ElasticSearch的索引結構,右邊黑藍色色部分是原始文檔,左邊黃色部分是邏輯結構,邏輯結構也是為了更好的去描述ElasticSearch的工作原理及去使用物理結構中的索引文件。

3.1 索引

3.1.1 倒排索引(Inverted

index):也常被稱為反向索引,倒排索引是從關鍵字到文檔的映射(已知關鍵字求文檔)。

1)、將搜索的文檔最終以Document方式存儲起來。(如下圖Doc_1,Doc_2)

2)、將要搜索的文檔內容分詞,所有不重復的詞組成分詞列表。(如下圖Term)

3)、每個詞和docment都有關聯。

現在,如果我們想搜索?包含quick brown詞條的文檔:

兩個文檔都匹配,但是第一個文檔比第二個匹配度更高。如果我們使用僅計算匹配詞條數量的簡單?相似性算法?,那么,我們可以說,對于我們查詢的相關性來講,第一個文檔比第二個文檔更佳。

3.2 RESTful應用方法

Elasticsearch提供 RESTful Api接口進行索引、搜索,并且支持多種客戶端。

下圖是es在項目中的應用方式:

1)用戶在前端搜索關鍵字

2)項目前端通過http方式請求項目服務端

3)項目服務端通過Http RESTful方式請求ES集群進行搜索

4)ES集群從索引庫檢索數據。

4 .ElasticSearch 安裝

4.1 Windows安裝ElasticSearch

4.1.1 安裝條件:

1)、jdk必須是jdk1.8.0_131以上版本。

2)、支持tar、zip、rpm等多種安裝方式。

3)在windows下開發建議使用ZIP安裝方式。

4.1.2下載 ES:

ElasticSearch官網:https://www.elastic.co/cn/

4.1.3 ES是Java開發的應用,解壓即安裝:

tar -zxvf elasticsearch-6.2.3.tar.gz

4.1.4?ES目錄結構

bin 目錄:可執行文件包

config 目錄:配置相關目錄

lib 目錄:ES 需要依賴的 jar 包,ES 自開發的 jar 包

modules 目錄:功能模塊的存放目錄,如aggs、reindex、geoip、xpack、eval

plugins 目錄:插件目錄包,三方插件或自主開發插件

logs 目錄:日志文件相關目錄

data 目錄:在 ES 啟動后,會自動創建的目錄,內部保存 ES 運行過程中需要保存的數據。

4.1.5?配置文件

ES安裝目錄config中配置文件如下:

elasticsearch.yml:用于配置Elasticsearch運行參數? ? ? ? ?

jvm.options:用于配置Elasticsearch JVM設置? ? ? ? ??

log4j2.properties:用于配置Elasticsearch日志

4.1.5.1? elasticsearch.yml

cluster.name: sxt

node.name: sxt_node_1

network.host: 0.0.0.0

http.port: 9200

transport.tcp.port: 9300

node.master: true

node.data: true

discovery.zen.ping.unicast.hosts:

["0.0.0.0:9300", "0.0.0.0:9301"]

discovery.zen.minimum_master_nodes: 1

bootstrap.memory_lock: false

path.data: D:\ElasticSearch-1\data

path.logs: D:\ElasticSearch-1\logs

http.cors.enabled: true

http.cors.allow-origin:/.*/

常用的配置項如下:

cluster.name:

配置elasticsearch的集群名稱,默認是elasticsearch。建議修改成一個有意義的名稱。

node.name:

節點名,通常一臺物理服務器就是一個節點,es會默認隨機指定一個名字,建議指定一個有意義的名稱,方便管理

一個或多個節點組成一個cluster集群,集群是一個邏輯的概念,節點是物理概念,后邊章節會詳細介紹。

path.data:

設置索引數據的存儲路徑,默認是es根目錄下的data文件夾,可以設置多個存儲路徑,用逗號隔開。

path.logs:

?設置日志文件的存儲路徑,默認是es根目錄下的logs文件夾

bootstrap.memory_lock: true

設置為true可以鎖住ES使用的內存,避免內存與swap分區交換數據。

network.host:

設置綁定主機的ip地址,設置為0.0.0.0表示綁定任何ip,允許外網訪問,生產環境建議設置為具體的ip。

http.port: 9200

設置對外服務的http端口,默認為9200。

transport.tcp.port: 9300

?集群結點之間通信端口

node.master:

?指定該節點是否有資格被選舉成為master結點,默認是true,如果原來的master宕機會重新選舉新的master。

node.data:

指定該節點是否存儲索引數據,默認為true。

discovery.zen.ping.unicast.hosts:

[“host1:port”, “host2:port”, “…”]

設置集群中master節點的初始列表。

discovery.zen.ping.timeout: 3s

設置ES自動發現節點連接超時的時間,默認為3秒,如果網絡延遲高可設置大些。

discovery.zen.minimum_master_nodes:

主結點數量的最少值 ,此值的公式為:(master_eligible_nodes / 2)+ 1 ,比如:有3個符合要求的主結點,那么這里要設置為2。

node.max_local_storage_nodes:

單機允許的最大存儲結點數,通常單機啟動一個結點建議設置為1,開發環境如果單機啟動多個節點可設置大于1.

4.1.5.2?jvm.options

設置最小及最大的JVM堆內存大小:

在jvm.options中設置 -Xms和-Xmx:

1)兩個值設置為相等

2)將Xmx?設置為不超過物理內存的一半。

4.1.5.3? properties

日志文件設置,ES使用log4j,注意日志級別的配置。

4.1.6 啟動?

進入bin目錄,在cmd下運行:elasticsearch.bat

4.1.7 測試:?

?ES 中,只要啟動了任意一個 ES 應用,就是啟動了一個 ES 的 cluster 集群。默認的 ES集群命名為 elasticsearch。如果啟動了多個應用(可以在多個節點或單一節點上啟動多個應用),默認的 ES 會自動找集群做加入集群的過程。

瀏覽器訪問:http://127.0.0.1:9200

顯示結果:

4.2?head插件安裝

head插件是ES的一個可視化管理插件,用來監視ES的狀態,并通過head客戶端和ES服務進行交互,比如創建映射、創建索引等,?從ES6.0開始,head插件支持使得node.js運行。

1)head插件下載:下載地址:?https://github.com/mobz/elasticsearch-head

2) 安裝

npm install -g cnpm --registry=https://registry.npm.taobao.org

cnpm? install

npm -v

3) 測試?

瀏覽器訪問:http://127.0.0.1:9100/

若打開瀏覽器調試工具發現報錯:? Originnull is not allowed by Access-Control-Allow-Origin.

原因是:head插件作為客戶端要連接ES服務(localhost:9200),此時存在跨域問題,elasticsearch默認不允許跨域訪問。

解決方案:

在config/elasticsearch.yml后面增加以下參數:

#開啟cors跨域訪問支持,默認為false

http.cors.enabled: true

#跨域訪問允許的域名地址,(允許所有域名)以上使用正則

http.cors.allow-origin: /.*/

4.3安裝Kibana

?Kibana是ES提供的一個基于 WEB 的管理控制臺, 可以很容易實現高級的數據分析和可視化,以圖標的形式展現出來。

?kibana可以用來編輯請求語句的,方便學習操作es的語法。有時在進行編寫程序,寫到查詢語句時,往往我會使用kibana進行書寫,然后再粘貼到程序中。(不容易出錯)

4.3.1 下載

ElasticSearch官網:https://www.elastic.co/cn/

4.3.2 安裝?

在window中安裝Kibana很方便,解壓即安裝

4.3.3?修改配置

vim config/kibana.yml

把以下注釋放開,使配置起作用:

?????? server.port:5601

?????? server.host:"0.0.0.0" #允許來自遠程用戶的連接

?????? elasticsearch.url:http://127.0.0.1:9200#?Elasticsearch實例的URL?

?????? kibana.index:".kibana"#如果沒有索引,Kibana 會創建一個新的索引來存儲保存的檢索,可視化控件以及儀表板

4.3.4 啟動

雙擊bin目錄下 kibana.bat

4.3.5 測試

5. Elasticsearch相關操作

5.1?index庫管理

5.1.1 創建index庫

number_of_shards - 是表示一個索引庫將拆分成多片分別存儲不同的結點,提高了ES的處理能力和高可用性

number_of_replicas- 是為每個 primary shard分配的replica shard數,如果只有一臺機器,設置為0

效果:

5.1.2?修改index

注意:索引一旦創建,primary shard 數量不可變化,可以改變replica shard 數量。

ES 中對 shard 的分布是有要求的,有其內置的特殊算法:

?????? 1、ES 盡可能保證 primary shard平均分布在多個節點上;

?????? 2、Replica shard 會保證不和他的那個 primary shard 分配在同一個節點上;

如過只有一個節點,則此案例執行后索引的狀態一定是yellow。

5.1.3刪除index

5.1.4 為什么primary shard數量不可變

原因:假如我們的集群在初始化的時候有5個primaryshard,我們往里邊加入一個document??? id=5,假如hash(5)=23,這時該document 將被加入 (shard=23%5=3)P3這個分片上。如果隨后我們給es集群添加一個primaryshard ,此時就有6個primary shard,當我們GET id=5 ,這條數據的時候,es會計算該請求的路由信息找到存儲他的 primary shard(shard=23%6=5) ,根據計算結果定位到P5分片上。而我們的數據在P3上。所以es集群無法添加primary shard,但是可以擴展replicas shard。

5.2mapping管理?

?映射,創建映射就是向索引庫中創建field(類型、是否索引、是否存儲等特性)的過程,下邊是document和field與關系數據庫的概念的類比: ???? 索引庫(indices)--------------------------------Databases數據庫????????????? 類型(type)-----------------------------Table數據表??? ????????????? 文檔(Document)----------------Row 行??????????????????????????? 字段(Field)-------------------Columns 列注意:6.0之前的版本有type(類型)概念,type相當于關系數據庫的表,ES6.x 版本之后,type概念被弱化ES官方將?????? ?? 在ES7.0版本中徹底刪除type。

5.2.1 創建mapping


5.2.2 查詢mappin

5.2.3?刪除mapping

通過刪除索引來刪除映射。

5.3 document管理

ES中的文檔相當于MySQL數據庫表中的記錄。

5.3.1 PUT語法

語法:PUT? ? ?/index_name/type_name/id{field_name:field_value}

結果:

? "_index": "test_index",新增的 document 在什么 index 中,

? "_type": "my_type",新增的 document 在 index 中的哪一個 type 中。

? "_id": "1",指定的 id 是多少

? "_version": 1, document的版本是多少,版本從 1 開始遞增,每次寫操作都會+1

? "result": "created",本次操作的結果,created 創建,updated 修改,deleted 刪除

? "_shards": {分片信息

????? "total": 2,分片數量只提示primary shard

????? "successful": 1,數據 document 一定只存放在 index 中的某一個 primary shard 中

????? "failed": 0

? },

? "_seq_no": 0,

? "_primary_term": 1

5.3.2 POST語法

此操作為ES 自動生成 id 的新增 Document 方式。

語法:POST? ?/index_name/type_name{fieldname:fieldvalue}


5..4 查詢document

語法:

?????? GET/index_name/type_name/id

?????? GET/index_name/type_name/_search?q=field_name:field_value


查詢結果:

{

? "took": 1, #執行的時長。單位毫秒

? "timed_out": false, #是否超時

? "_shards": { # shard相關數據

??? "total": 2, #總計多少個shard

??? "successful": 2, # 成功返回結果的 shard 數量

??? "skipped": 0,

??? "failed": 0

? },

? "hits": { #搜索結果相關數據

??? "total": 3, # 總計多少數據,符合搜索條件的數據數量

??? "max_score": 1, # 最大相關度分數,和搜索條件的匹配度

??? "hits": [#具體的搜索結果

????? {

??????? "_index": "java17",#索引名稱

??????? "_type": "course",? #類型名稱

??????? "_id": "1",# id值

??????? "_score": 1, #匹配度分數,本條數據匹配度分數

??????? "_source": { #具體的數據內容

????????? "name": "php從入門到放棄",

????????? "description": "php是世界上最好的語言",

????????? "studymodel":? "201001"

??????? }

????? }

??? ]

? }

}

5.4 刪除Document

6?ES讀寫原理

documnet routing(數據路由)

當客戶端創建document的時候,es需要確定這個document放在該index哪個shard上,這個過程就是document routing。

路由過程:

    路由算法:shard = hash(routing) %number_of_primary_shards

    routing:document的_id,可能是手動指定,也可能是自動生成,決定一個document在哪個shard上

    number_of_primary_shards主分片。

6.1ES document寫操作原理

ES增刪改的處理流程:增刪改的請求一定作用在主分片上。

假如我們es集群有3個node,每個node上一個主分片一個復制分片,

如下圖:


1)、第一步 客戶端發起一個PUT請求,假如該請求被發送到第一個node節點,那么該節點將成為協調節點(coordinating

??? node),如圖P1所在的節點就是協調節點。他將根據該請求的路由信息計算,該document將被存儲到哪個分片。

2)、第二步通過計算發現該document被存儲到p0分片,那么就將請求轉發到node2節點。

3)、第三步P0根據請求信息創建document,和相應的索引信息,創建完畢后將信息同步到自己的副本節點R0上。

4)、第四步P0和R0將通知我們的協調節點,任務完成情況。

5)、第五部協調節點響應客戶端最終的處理結果。

6.2 讀操作原理

假如我們es集群有3個node,每個node上一個主分片一個復制分片,

如下圖:

1)、第一步客戶端發送讀器請求到協調節點(coordinate node)。

2)、第二步協調節點(coordinate node)根據請求信息對document進行路由計算,將請求轉發到對應的node,node2或者node3,此時會使用round-robin隨機輪詢算法,在primary shard以及其所有replica(副本)中隨機選擇一個讓讀請求負載均衡。

3)、第三步相應接收到請求的節點(node2或者node3)將處理結果返回給協調節點(coordinate node)。

4)、第四步協調節點將最終的結果反饋給客戶端。

7.? ?IK分詞器

在添加文檔時會進行分詞,索引中存放的就是一個一個的詞(term),當你去搜索時就是拿關鍵字去匹配詞,最終找到詞關聯的文檔。

普通分詞器:

會發現分詞的效果將“測試”這個詞拆分成兩個單字“測”和“試”,這是因為當前索引庫使用的分詞器對中文就是單字分詞。

7.1.?安裝IK分詞器?

?使用IK分詞器可以實現對中文分詞的效果。下載IK分詞器:(Github地址:https://github.com/medcl/elasticsearch-analysis-ik)

解壓,并將解壓的文件拷貝到ES安裝目錄的plugins下的ik(重命名)目錄下

7.2.兩種分詞模式

ik分詞器有兩種分詞模式:ik_max_word和ik_smart模式。

1、ik_max_word

?????? 會將文本做最細粒度的拆分,比如會將“中華人民共和國人民大會堂”拆分為“中華人民共和國、中華人民、中華、華人、人民共和國、人民、共和國、大會堂、大會、會堂等詞語。

2、ik_smart

?????? 會做最粗粒度的拆分,比如會將“中華人民共和國人民大會堂”拆分為中華人民共和國、人民大會堂。

7.3自定義詞庫

如果要讓分詞器支持一些專有詞語,可以自定義詞庫。

iK分詞器自帶一個main.dic的文件,此文件為擴展詞典。

也可以上邊的目錄中新建一個my.dic文件(注意文件格式為utf-8(不要選擇utf-8 BOM))

可以在其中自定義詞匯:

比如定義:

配置文件中配置my.dic,

7.4 field詳細介紹


?7.4.1 field的屬性介紹


type:? 通過type屬性指定field的類型。

analyzer:通過analyzer屬性指定分詞模式。

指定了analyzer是指在索引和搜索都使用ik_max_word,如果單獨想定義搜索時使用的分詞器則可以通過

search_analyzer屬性。

對于ik分詞器建議是索引時使用ik_max_word將搜索內容進行細粒度分詞,搜索時使用ik_smart提高搜索精確性。


index:通過index屬性指定是否索引。

默認為index=true,即要進行索引,只有進行索引才可以從索引庫搜索到。

但是也有一些內容不需要索引,比如:商品圖片地址只被用來展示圖片,不進行搜索圖片,此時可以將index設置

為false。? ? ? 刪除索引,重新創建映射,將pic的index設置為false,嘗試根據pic去搜索,結果搜索不到數據

store:是否在source之外存儲,每個文檔索引后會在?ES中保存一份原始文檔,存放在"_source"中,一般情況下不需要設置

store為true,因為在_source中已經有一份原始文檔了。

field索引不存儲\?

如果某個字段內容非常多,業務里面只需要能對該字段進行搜索,最后返回文檔id,查看文檔內容會再次到mysql或者hbase中取數據,把大字段的內容存在Elasticsearch中只會增大索引,這一點文檔數量越大結果越明顯,如果一條文檔節省幾KB,放大到億萬級的量結果也是非常可觀的。

如果只想存儲某幾個字段的原始值到Elasticsearch,可以通過incudes參數來設置,在mapping中的設置如下:

同樣,可以通過excludes參數排除某些字段:

7.5常用field類型

text文本字段

keyword關鍵字字段

keyword字段為關鍵字字段,通常搜索keyword是按照整體搜索,所以創建keyword字段的索引時是不進行分詞的

date日期類型??????

日期類型不用設置分詞器,通常日期類型的字段用于排序。

1)format

通過format設置日期格式,多個格式使用雙豎線||分隔, 每個格式都會被依次嘗試, 直到找到匹配的


Numeric類型?

?下圖是ES支持的數值類型:

1、盡可能選擇范圍小的數據類型, 字段的長度越短, 索引和搜索的效率越高;

2、對于浮點數盡量用比例因子,比如一個價格字段,單位為元,我們將比例因子設置為100這在ES中會按分存

儲,映射如下:

由于比例因子為100,如果我們輸入的價格是23.45則ES中會將23.45乘以100存儲在ES中。

使用比例因子的好處是整型比浮點型更易壓縮,節省磁盤空間。

8 Spring Boot整合ElasticSearch

ES提供多種不同的客戶端:

1、TransportClient

?????? ES提供的傳統客戶端,官方計劃8.0版本刪除此客戶端。

2、RestClient

?????? RestClient是官方推薦使用的,它包括兩種:Java Low Level REST

Client和 Java High

Level REST Client。

ES在6.0之后提供 Java

High Level REST Client,兩種客戶端官方更推薦使用 Java High Level REST

Client,不過當前它還處于完善中,有些功能還沒有。

?????? 本教程準備采用 Java High Level REST Client,如果它有不支持的功能,則使用Java Low Level REST Client

8.1創建項目

8.2 修改pom.xml文件


8.3 修改application.yml


8.4 創建RestHighLevelClient配置類

8.5 創建啟動類

8.6 測試

8.6.1 創建索引庫

kinbana:api



java代碼:

8.6.2 刪除索引庫

kinbana:api

java代碼:


8.6.3 添加文檔

kinbana:api

java代碼:


8.6.4 批量添加文檔

kinbana:api

java代碼:

8.6.5 修改文檔:

kinbana:api

java代碼:


8.8.6. 刪除文檔

kinbana:api

java代碼:

8.6.7 文檔搜索:

8.6.7.1?簡單搜索

kibana:api

java代碼:

8.6.7.2 DSL搜索(? match_all查詢)

DSL(Domain Specific Language)是ES提出的基于json的搜索方式,在搜索時傳入特定的json格式的數據來完成不同的搜索需求,DSL比URI搜索方式功能強大,在項目中建議使用DSL方式來完成搜索。

kinbana:api


8.6.7.3 DSL搜索(? Term 查詢??)

Term Query為精確查詢,在搜索時會整體匹配關鍵字,不再將關鍵字分詞。

kinbana:api

java代碼:

8.6.7.4 DSL搜索(?match查詢??)?

match Query即全文檢索,它的搜索方式是先將搜索字符串分詞,再使用各各詞條從索引中搜索。

query搜索的關鍵字,對于英文關鍵字如果有多個單詞則中間要用半角逗號分隔,而對于中文關鍵字中間可以用逗號分隔也可以不用。

operatoror 表示只要有一個詞在文檔中出現則就符合條件,and表示每個詞都在文檔中出現則才符合條件。

?kinbana:api?

java代碼:


8.6.7.5 DSL搜索(??multi_match查詢???)??

termQuery和matchQuery是在一個field中去匹配,multiQuery是拿關鍵字去多個Field中匹配。

匹配多個字段時可以提升字段的boost(權重)來提高得分, 如“name^10”表示權重提升10倍,執行查詢時name中包括spring關鍵字的文檔排在前邊。

kinbana:api

java代碼:


8.6.7.6 DSL搜索(?bool查詢?)

布爾查詢對應于Lucene的BooleanQuery查詢,實現將多個查詢組合起來。

參數:

?????? must:表示必須,多個查詢條件必須都滿足。(通常使用must)

?????? should:表示或者,多個查詢條件只要有一個滿足即可。

?????? must_not:表示非。

kinbana:api:

java代碼:

8.6.7.7 DSL搜索(filter查詢)

此操作實際上就是query DSL 的補充語法。過濾的時候,不進行任何的匹配分數計算,相對于 query 來說,filter 相對效率較高。Query 要計算搜索匹配相關度分數。Query更加適合復雜的條件搜索。查詢:

kinbana:api



java代碼:


8.7?highlight查詢?

?高亮顯示。高亮不是搜索條件,是顯示邏輯,在搜索的時候,經常需要對條件實現高亮顯示。

kinbana:api

java代碼:

9.集群管理

9.1集群結構


9.2?

9.2 集群的三個角色

主節點:master節點主要用于集群的管理及索引比如新增節點、分片分配、索引的新增和刪除等。

數據節點:data 節點上保存了數據分片,它負責索引和搜索操作。

客戶端節點:client節點僅作為負載均衡器不存數據,只是將請求均衡轉發到其它節點。


通過下邊兩項參數來配置節點的功能:

node.master: #是否允許為主節點

node.data: #允許存儲數據作為數據節點

node.ingest: #是否允許成為協調節點,

四種組合方式:

master=true,data=true:即是主節點又是數據節點

master=false,data=true:僅是數據節點

master=true,data=false:僅是主節點,不存儲數據

master=false,data=false:即不是主節點也不是數據節點,此時可設置ingest為true(默認)表示它是一個客戶端。

9.3 創建結點2

3、修改elasticsearch-2的elasticsearch.yml內容如下:

cluster.name: sxt

node.name:sxt_node_2

network.host:? 0.0.0.0

http.port:9201

transport.tcp.port:9301

node.master:? true

node.data:? true

discovery.zen.ping.unicast.hosts:? ["0.0.0.0:9300", "0.0.0.0:9301"]

discovery.zen.minimum_master_nodes:? 1

bootstrap.memory_lock:? false

node.max_local_storage_nodes:? 3


path.data:? D:\ElasticSearch-2\data

path.logs:? D:\ElasticSearch-2\logs


http.cors.enabled:? true

http.cors.allow-origin:? /.*/


9.4查看集群健康狀態

GET _cluster/health

結果:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,345評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,494評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,283評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,953評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,714評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,410評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,940評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,776評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,210評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,654評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容