Elasticsearch 安裝與簡(jiǎn)單使用

1.Search Engine

  • 目前主流的開(kāi)源搜索引擎主要有兩個(gè)沪摄,一個(gè)是基于Java的Apache Lucene躯嫉,另一個(gè)是基于C++的Sphinx。在建立索引所需時(shí)間方面杨拐,Sphinx只需Lucene時(shí)間的50%左右祈餐,但是索引文件Sphinx比Lucene要大一倍,即Sphinx采用的是空間換時(shí)間的策略哄陶。在全文檢索速度方面帆阳,二者相差不大。全文檢索精確度方面屋吨,Lucene要優(yōu)于Sphinx蜒谤。在加入中文分詞引擎的難易程度上,Lucene要優(yōu)于Sphinx至扰。Lucene的API接口設(shè)計(jì)的比較通用鳍徽,輸入輸出結(jié)構(gòu)都很像數(shù)據(jù)庫(kù)的表、記錄敢课、字段阶祭,所以很多傳統(tǒng)的應(yīng)用的文件绷杜、數(shù)據(jù)庫(kù)等都可以比較方便的映射到Lucene的存儲(chǔ)結(jié)構(gòu)/接口中。因此濒募,選擇Lucene作為全文搜索引擎是比較好的選擇接剩。

2.Search based on Lucene

  • Lucene只是一個(gè)框架,要充分利用它的功能萨咳,需要很高學(xué)習(xí)成本,很少直接直接使用Lucene疫稿,Solr和ElasticSearch都是基于Lucene的搜索服務(wù)器培他。ElasticSearch相比于solr擁有一些重要特征:
  • 1.導(dǎo)入性能更好,查詢性能與solr持平遗座,因?yàn)閟olr在建索引時(shí)會(huì)產(chǎn)生io的阻塞舀凛,造成搜索性能的下降,但ElasticSearch不會(huì)途蒋,它是先把索引的內(nèi)容保存到內(nèi)存之中猛遍,當(dāng)內(nèi)存不夠時(shí)再把索引持久化到硬盤(pán)中,同時(shí)它還有一個(gè)隊(duì)列号坡,是在系統(tǒng)空閑時(shí)自動(dòng)把索引寫(xiě)到硬盤(pán)中
  • 2.ElasticSearch 完全支持Apache Lucene的接近實(shí)時(shí)的搜索懊烤。
  • 3.支持更多的客戶端庫(kù),如Java宽堆,Python腌紧,Javascript
  • 4.自包含集群,無(wú)需zookeeper即可自動(dòng)構(gòu)建集群
  • 5.支持多種插件:例如ElasticSearch-head插件畜隶、ik分詞插件
  • 6.支持多個(gè)存儲(chǔ)方式壁肋,ElasticSearch的數(shù)據(jù)文件可以存儲(chǔ)在本地文件系統(tǒng)、Hadoop的HDFS和亞馬孫的S3

3.ES Vs Relational DB

  • Relational DB--->庫(kù)(Databases)--->表(Tables)--->行(Rows)--->列(columns)
  • ES--->索引(Indices)--->類型(Types)--->文檔(Documents)--->字段(Fields)

4.ElasticSearch Install

  • 版本說(shuō)明
    Java環(huán)境:JDK 1.8.0
    Elasticsearch:2.3.4
    OS環(huán)境:windows 7(為了開(kāi)發(fā)調(diào)試方便)
  • 下載解壓安裝包
    下載地址:https://www.elastic.co/downloads/elasticsearch
    下載合適版本的安裝包籽慢,當(dāng)前最新的版本是5.0.1浸遗,Elasticsearch版本更新太快,直接從2.4.0到了5.0箱亿,由于5.x版本安裝Elasticsearch-head插件過(guò)于復(fù)雜跛锌,選用的2.x版本即可
    解壓后的目錄如下
├─bin
├─config
├─lib
└─modules
    ├─lang-expression
    ├─lang-groovy
    └─reindex

單機(jī)Elasticsearch不需要修改過(guò)多的配置,就能直接使用届惋,如果需要修改察净,修改config目錄下Elasticsearch.yml文件即可,例如數(shù)據(jù)文件目錄盼樟、日志文件目錄氢卡、Elasticsearch服務(wù)器的ip和端口號(hào)以及JVM堆內(nèi)存大小

  • 發(fā)布成服務(wù)
    講ElasticSearch發(fā)布為服務(wù),方便在后臺(tái)運(yùn)行和開(kāi)機(jī)啟動(dòng)
    在elasticsearch-2.3.4\bin下執(zhí)行
    service.bat install ElasticSearch
  • 啟動(dòng)后檢查
    啟動(dòng)ElasticSearch服務(wù)后晨缴,訪問(wèn)http://localhost:9200/译秦,提示服務(wù)是否就緒
{
    "name": "D'Ken",
    "cluster_name": "elasticsearch",
    "version": {
        "number": "2.3.4",
        "build_hash": "e455fd0c13dceca8dbbdbb1665d068ae55dabe3f",
        "build_timestamp": "2016-06-30T11:24:31Z",
        "build_snapshot": false,
        "lucene_version": "5.5.0"
    },
    "tagline": "You Know, for Search"
}

5.Basic Operator of ElasticSearch

  • 新建文檔
curl -XPUT http://localhost:9200/blog/article/1 -d '{"titile": "New version of ElasticSearch released!", "content":"Version 1.0 released today!", "tags" : ["announce", "elasticsearch"," release"]}'

http://localhost:9200/blog/article/1筑悴,blog是index们拙,article是indextype,1代表文檔的id阁吝,在同一個(gè)index砚婆、同一個(gè)indextype下是唯一的。也可以不指定文檔id突勇,通過(guò)post方法新建文檔装盯,生成的文檔id是隨機(jī)的。如下所示:

curl -XPOST http://localhost:9200/blog/article -d '{"titile": "New version of ElasticSearch released!", "content":"Version 1.0 released today!", "tags" : ["announce", "elasticsearch","release"]}'
  • 檢索文檔
    已知文檔id條件甲馋,檢索文檔
    curl -XGET http://localhost:9200/blog/article/1
    做全文搜索時(shí)埂奈,當(dāng)type中的字段比較多,但是我們只需要某些字段時(shí)定躏,可以選擇結(jié)果集要返回的字段
curl -XGET http://localhost:9200/blog/article/_search –d 
‘{
    "fields": [
        "title",
        "author"
    ],
    "query": {
        "match_all": {}
    }
}’
  • 更新文檔
    更新文檔在ElasticSearch屬于比較消耗的操作账磺,需要將之前的建立的索引刪掉,重建新的索引痊远,ElasticSearch局部更新操作是通過(guò)Groovy腳步實(shí)現(xiàn)更新的垮抗,在更新之前,需要在elasticsearch.yml中添加
    script.inline: on
    script.indexed: on
    script.engine.groovy.inline.aggs: on
    重啟ElasticSearch
    例如碧聪,需要根據(jù)用戶的點(diǎn)擊次數(shù)借宵,更新某篇文章的瀏覽量
    POST /blog /article/1/_update
    {
    "script" : "ctx._source.read_count+=1"
    }
  • 刪除文檔
    刪除文檔命令
    curl -XDELETE http://localhost:9200/blog/article/1

6.Devlopment Process

  • 引入maven依賴
    在pom文件添加對(duì)應(yīng)版本的依賴包
<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>2.3.4</version>
</dependency>
  • 創(chuàng)建mapping
    mapping是什么?為了能夠把日期字段處理成日期,把數(shù)字字段處理成數(shù)字矾削,把字符串字段處理成全文本(Full-text)或精確的字符串值壤玫,Elasticsearch需要知道每個(gè)字段里面都包含了什么類型。這些類型和字段的信息存儲(chǔ)(包含)在映射(mapping)中
  • 為什么要?jiǎng)?chuàng)建mapping
    雖然Elasticsearch能更夠根據(jù)數(shù)據(jù)類型創(chuàng)建自動(dòng)創(chuàng)建mapping哼凯,但是自動(dòng)創(chuàng)建mapping很可能不符合要求欲间,例如我們想對(duì)指定的字段指定分詞器
    查看mapping命令
curl  -XGET http://localhost:9200/blog/article/_mapping/

或者通過(guò)head插件查看

結(jié)果如何

{
    "blog": {
        "mappings": {
            "article": {
                "_ttl": {
                    "enabled": false
                },
                "properties": {
                    "author": {
                        "type": "string",
                        "index": "not_analyzed"
                    },
                    "content": {
                        "type": "string",
                        " analyzer ": "ik "
                    },
                    "publish_time": {
                        "type": "date",
                        "format": "strict_date_optional_time||epoch_millis"
                    },
                    "read_count": {
                        "type": "integer"
                    },
                    "title": {
                        "type": "string",
                        "analyzer": "ik"
                    }
                }
            }
        }
    }
}

主要需要指定字段type類型,對(duì)于string類型断部,需要指定是否需要分詞猎贴,以及分詞器的類型

public class BlogMapping {
    public static XContentBuilder getMapping(){
        XContentBuilder mapping = null;
        try {
            mapping = jsonBuilder()
                    .startObject()
                    //開(kāi)啟倒計(jì)時(shí)功能
                    .startObject("_ttl")
                    .field("enabled",false)
                    .endObject()
                    .startObject("properties")
                    .startObject("title")
                    .field("type","string")
                    .field("analyzer", "ik")
                    .endObject()
                    .startObject("content")
                    .field("type","string")
                    .field("index","not_analyzed")
                    .endObject()
                    .startObject("author")
                    .field("type","string")
                    .field("index","not_analyzed")
                    .endObject()
                    .startObject("publish_time")
                    .field("type","date")
                    .field("index","not_analyzed")
                    .endObject()
                    .startObject("read_count")
                    .field("type","integer")
                    .field("index","not_analyzed")
                    .endObject()
                    .endObject()
                    .endObject();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return mapping;
    }
}
  • 分析分詞結(jié)果
    查看分詞結(jié)果
curl -XGET 'localhost:9200/_analyze' -d '
{
  "analyzer": "ik",
  "text": "百度張亞勤:ABC時(shí)代來(lái)了,迎戰(zhàn)云計(jì)算“馬拉松”"
}

命令行下官方推薦使用get方法蝴光,使用post方法也是可以的她渴,而且命令行環(huán)境下對(duì)漢字的支持不是很有友好,可以通過(guò)head插件或者其他restclient圖形界面工具查詢分詞結(jié)果蔑祟,通過(guò)圖形界面工具查詢務(wù)必使用post方法

  • 分詞結(jié)果如下:
    [百度趁耗,百,度疆虚,張苛败,亞满葛,勤,abc罢屈,時(shí)代嘀韧,來(lái)了,迎戰(zhàn)缠捌,戰(zhàn)云锄贷,計(jì)算,馬拉松曼月,馬谊却,拉,松]
    分詞結(jié)果直接決定了十嘿,我們應(yīng)該采用精確匹配還是全文檢索,以及我們搜索的關(guān)鍵詞能否命中
  • 創(chuàng)建DSL語(yǔ)句
    Elasticsearch檢索文件是通過(guò)DSL語(yǔ)句岳锁,檢索文檔分為兩種分式精確查詢和全文檢索绩衷,在Elasticsearch里面分別對(duì)應(yīng)term query和match query
    term query:
    在給定的字段里查詢?cè)~或者詞組;
    提供的查詢?cè)~是不分詞的(not analyzed)激率,即只有完全包含才算匹配咳燕;
    支持boost屬性,boost可以提高field和document的相關(guān)性乒躺;
    match query:
    與term query不同招盲,match query的查詢?cè)~是被分詞處理的(analyzed),即首先分詞嘉冒,然后構(gòu)造相應(yīng)的查詢曹货,所以應(yīng)該確保查詢的分詞器和索引的分詞器是一致的;
    與terms query相似讳推,提供的查詢?cè)~之間默認(rèn)是or的關(guān)系顶籽,可以通過(guò)operator屬性指定;
    match query有兩種形式银觅,一種是簡(jiǎn)單形式礼饱,一種是bool形式;
    希望通過(guò)[百度究驴,張亞勤镊绪,云計(jì)算,馬拉松]中任意一個(gè)搜索詞都能夠搜到上面的內(nèi)容洒忧,即百度張亞勤:ABC時(shí)代來(lái)了蝴韭,迎戰(zhàn)云計(jì)算“馬拉松”
    如果使用term query
GET http://localhost:9200/blog/article/_search
{
  "query": {
    "term": {
      "title": "百度"
    }
  }
}

當(dāng)title的值為“百度”或者“馬拉松”時(shí)可以檢索到內(nèi)容,當(dāng)title為“張亞勤或者云計(jì)算時(shí)熙侍,無(wú)法檢索到文檔万皿,因?yàn)榉衷~結(jié)果是[百度摧找,百,度牢硅,張蹬耘,亞,勤减余,abc综苔,時(shí)代,來(lái)了位岔,迎戰(zhàn)如筛,戰(zhàn)云,計(jì)算抒抬,馬拉松杨刨,馬,拉擦剑,松]妖胀,無(wú)法匹配“張亞勤”和“云計(jì)算”
如果使用match query檢索

{
  "query": {
    "match": {
      "title": {
        "query": "張亞勤",
        "operator": "and",
        "minimum_should_match": "3"
      }
    }
  }
}

使用match query檢索,ik分詞器會(huì)把張亞勤分[張惠勒,亞赚抡,勤],會(huì)把三個(gè)元素依次和[百度,百纠屋,度涂臣,張,亞售担,勤赁遗,abc,時(shí)代族铆,來(lái)了吼和,迎戰(zhàn),戰(zhàn)云骑素,計(jì)算炫乓,馬拉松,馬献丑,拉末捣,松]里面的數(shù)據(jù)比對(duì),operator=and,表示每個(gè)分詞比較結(jié)果是與的關(guān)系创橄,minimum_should_match=3箩做,表示至少三次匹配成功,此時(shí)就能檢索到內(nèi)容
multi_match
如果我們希望兩個(gè)字段進(jìn)行匹配妥畏,其中一個(gè)字段有這個(gè)文檔就滿足的話邦邦,使用multi_match安吁,用戶輸入一個(gè)搜索詞,我們很少根據(jù)有一個(gè)字段進(jìn)行索引燃辖,通常是根據(jù)某幾個(gè)字段進(jìn)行索引鬼店,例如我們想根據(jù)title或者content字段搜包含“云計(jì)算”的內(nèi)容,那么相應(yīng)DSL語(yǔ)句:

{
  "query": {
    "multi_match": {
        "query" : "云計(jì)算",
        "fields" : ["title", "content"]
    }
  }
}
  • 理解評(píng)分機(jī)制
    通過(guò)DSL語(yǔ)句只是查詢到我們需要的結(jié)果黔龟,但是怎么對(duì)查詢到的結(jié)果進(jìn)行排序妇智,就需要了解ElasticSearch的評(píng)分機(jī)制,ElasticSearch默認(rèn)是安裝查詢文檔的評(píng)分排序的氏身。
    詳細(xì)查看評(píng)分的命令
POST http://localhost:9200/blog/article/_search?explain
{
  "query": {
    "match": {
      "title": {
        "query": "羅一笑",
        "operator": "and",
        "minimum_should_match": "3"
      }
    }
  }
}

搜索詞:羅一笑
查詢時(shí)將搜索詞分為4個(gè)分詞(term)巍棱,羅,一笑蛋欣,一航徙,笑
每個(gè)詞有一個(gè)評(píng)分
羅:0.042223614
一笑:0.11945401
一:0.11945401
笑:0.11945401
根據(jù)羅一笑查詢到文檔的總評(píng)分為:0.40058565=0.042223614+0.11945401+0.11945401+0.11945401
對(duì)于每一個(gè)term的評(píng)分規(guī)則是:term評(píng)分= queryweight * fieldweight
一笑的評(píng)分:0.11945401 = 0.54607546 * 0.21875
查詢權(quán)重query weight = idf * queryNorm

{
    "value": 0.54607546,
    "description": "queryWeight, product of:",
    "details": [
        {
            "value": 1,
            "description": "idf(docFreq=1, maxDocs=2)",
            "details": []
        },
        {
            "value": 0.54607546,
            "description": "queryNorm",
            "details": []
        }
    ]
}

域權(quán)重fieldweight= tf * idf * fieldNorm

{
    "value": 0.21875,
    "description": "fieldWeight in 0, product of:",
    "details": [
        {
            "value": 1,
            "description": "tf(freq=1.0), with freq of:",
            "details": [
                {
                    "value": 1,
                    "description": "termFreq=1.0",
                    "details": []
                }
            ]
        },
        {
            "value": 1,
            "description": "idf(docFreq=1, maxDocs=2)",
            "details": []
        },
        {
            "value": 0.21875,
            "description": "fieldNorm(doc=0)",
            "details": []
        }
    ]
}

主要有個(gè)兩個(gè)概念Term Frequency和Inverse document frequency
Term Frequency:某單個(gè)關(guān)鍵詞(term) 在某文檔的某字段中出現(xiàn)的頻率次數(shù), 顯然, 出現(xiàn)頻率越高意味著該文檔與搜索的相關(guān)度也越高
具體計(jì)算公式是 tf(q in d) = sqrt(termFreq)
Inverse document frequency:某個(gè)關(guān)鍵詞(term) 在索引(單個(gè)分片)之中出現(xiàn)的頻次. 出現(xiàn)頻次越高, 這個(gè)詞的相關(guān)度越低. 相對(duì)的, 當(dāng)某個(gè)關(guān)鍵詞(term)在一大票的文檔下面都有出現(xiàn), 那么這個(gè)詞在計(jì)算得分時(shí)候所占的比重就要比那些只在少部分文檔出現(xiàn)的詞所占的得分比重要低. 說(shuō)的那么長(zhǎng)一句話, 用人話來(lái)描述就是 “物以稀為貴”。
具體計(jì)算公式:
idf = 1 + ln(maxDocs/(docFreq + 1))
詳細(xì)計(jì)算公式請(qǐng)參考lucene源碼或者參考http://www.hankcs.com/program/java/lucene-scoring-algorithm-explained.html
lucene的評(píng)分機(jī)制過(guò)于復(fù)雜陷虎,我們可以根據(jù)上述公式派生出簡(jiǎn)單容易理解的規(guī)則
匹配的詞條越罕見(jiàn)到踏,文檔的得分越高
文檔的字段越小,文檔的得分越高
字段的加權(quán)越高泻红,文檔的得分越高

官方指導(dǎo)文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末夭禽,一起剝皮案震驚了整個(gè)濱河市霞掺,隨后出現(xiàn)的幾起案子谊路,更是在濱河造成了極大的恐慌,老刑警劉巖菩彬,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缠劝,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡骗灶,警方通過(guò)查閱死者的電腦和手機(jī)惨恭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)耙旦,“玉大人脱羡,你說(shuō)我怎么就攤上這事∶舛迹” “怎么了锉罐?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)绕娘。 經(jīng)常有香客問(wèn)我脓规,道長(zhǎng),這世上最難降的妖魔是什么险领? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任侨舆,我火速辦了婚禮秒紧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘挨下。我一直安慰自己熔恢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布复颈。 她就那樣靜靜地躺著绩聘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪耗啦。 梳的紋絲不亂的頭發(fā)上凿菩,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音帜讲,去河邊找鬼衅谷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛似将,可吹牛的內(nèi)容都是我干的获黔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼在验,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼玷氏!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起腋舌,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤盏触,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后块饺,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體赞辩,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年授艰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辨嗽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡淮腾,死狀恐怖糟需,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谷朝,我是刑警寧澤洲押,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站徘禁,受9級(jí)特大地震影響诅诱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜送朱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一娘荡、第九天 我趴在偏房一處隱蔽的房頂上張望干旁。 院中可真熱鬧,春花似錦炮沐、人聲如沸争群。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)换薄。三九已至,卻和暖如春翔试,著一層夾襖步出監(jiān)牢的瞬間轻要,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工垦缅, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留冲泥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓壁涎,卻偏偏與公主長(zhǎng)得像凡恍,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子怔球,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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

  • Solr&ElasticSearch原理及應(yīng)用 一嚼酝、綜述 搜索 http://baike.baidu.com/it...
    樓外樓V閱讀 7,291評(píng)論 1 17
  • 歡迎訪問(wèn)本人博客:http://wangnan.tech Elasticsearch是一個(gè)可伸縮的開(kāi)源全文搜索和分...
    GhostStories閱讀 3,088評(píng)論 0 10
  • 昨天闽巩,我在公眾號(hào)里發(fā)布了一個(gè)講述你與母親故事的活動(dòng),我從中選擇了一篇很喜歡的與大家分享一下: 我是一個(gè)自私的女兒流码,...
    CodyYang閱讀 305評(píng)論 0 0
  • 12.22.2016 預(yù)約的下午兩點(diǎn)手術(shù) 媽媽和老公陪我去的醫(yī)院又官。手術(shù)前一個(gè)小時(shí)我吃了一顆止疼藥延刘。到了醫(yī)院chec...
    dingding001閱讀 857評(píng)論 0 0
  • 突然想起一個(gè)人來(lái)碘赖,小時(shí)候那個(gè)因?yàn)槠圬?fù)我被老師當(dāng)著全班同學(xué)的面打了一個(gè)耳光的班長(zhǎng)驾荣。 從五年級(jí)一直到碰見(jiàn)他,一直都沒(méi)有...
    寒氷閱讀 1,048評(píng)論 0 0