ElasticSearch 的DSL查询动态拼接工具类

Elasticsearch DSL写的很崩溃,自己定义了个工具类,

然后这样撸起来还挺方便的,习惯了restfulapi,nativeapi暂且用着不顺先这样用着




import com.vacp.api.common.DateUtils;

import com.vacp.api.common.UUIDUtils;

import org.apache.commons.lang3.StringUtils;

import java.util.Calendar;

import java.util.Date;

import java.util.HashMap;

import java.util.Map;


public class DslQueryUtils {

public static final StringASC="asc";

    public static final StringDESC="desc";

    public static final String_SOURCE="{\"includes\": [ \"*\"],\"excludes\": [ \"track.*\" ]}";

    public static final String_SOURCEAGGS="{\"excludes\": [ \"*\" ]}";

    public static final String_SOURCEAGGS_COLLAPSEC="{\"excludes\": [ \"*\" ]}";

    static public Stringsearch(String dsl,String scriptfield,String aggs,String source,String sort,String hightlight,Integer from,Integer size,boolean profile ){

StringBuilder sb =new StringBuilder("{");

        if(StringUtils.isNotBlank(dsl)){

sb.append("\"query\":"+dsl+",");

        }

if(StringUtils.isNotBlank(scriptfield)){

sb.append("\"script_fields\":"+scriptfield+",");

        }

if(StringUtils.isNotBlank(source)){

sb.append("\"_source\":"+source+",");

        }

if(StringUtils.isNotBlank(sort)){

sb.append("\"sort\":"+sort+",");

        }

if(StringUtils.isNotBlank(hightlight)){

sb.append("\"hightlight\":"+hightlight+",");

        }

if(from!=null){

sb.append("\"from\":"+from+",");

        }

if(size!=null){

sb.append("\"size\":"+size+",");

        }

if(aggs!=null){

sb.append("\"aggs\":"+aggs+",");

        }

if(profile==true){

sb.append("\"profile\":"+profile+",");

        }

return  sb.substring(0,sb.length()-1)+"}";

    }

static public Stringsearch(String dsl,String scriptfield,String aggs,String collapse,String source,String sort,String hightlight,Integer from,Integer size,boolean profile ){

StringBuilder sb =new StringBuilder("{");

        if(StringUtils.isNotBlank(dsl)){

sb.append("\"query\":"+dsl+",");

        }

if(StringUtils.isNotBlank(scriptfield)){

sb.append("\"script_fields\":"+scriptfield+",");

        }

if(StringUtils.isNotBlank(source)){

sb.append("\"_source\":"+source+",");

        }

if(StringUtils.isNotBlank(sort)){

sb.append("\"sort\":"+sort+",");

        }

if(StringUtils.isNotBlank(hightlight)){

sb.append("\"hightlight\":"+hightlight+",");

        }

if(from!=null){

sb.append("\"from\":"+from+",");

        }

if(collapse!=null){

sb.append("\"collapse\":"+collapse+",");

        }

if(size!=null){

sb.append("\"size\":"+size+",");

        }

if(aggs!=null){

sb.append("\"aggs\":"+aggs+",");

        }

if(profile==true){

sb.append("\"profile\":"+profile+",");

        }

return  sb.substring(0,sb.length()-1)+"}";

    }

static public  Stringsearch( String dsl){

return search(dsl,null,null,null,null,null,null,null,false);

    }

static public  Stringsearch(String dsl,int from,int size ){

return search(dsl,null,null,_SOURCE,null,null,from,size,false);

    }

static public  StringsearchSort(String dsl,String sort,int from,int size ){

return search(dsl,null,null,_SOURCE,sort,null,from,size,false);

    }

static public  Stringsearch(String dsl,int from,int size,String source ){

return search(dsl,null,source,null,null,null,from,size,false);

    }

static public  StringsearchAddScriptField(String dsl,String scriptField,int from,int size ){

return search(dsl,scriptField,null,_SOURCE,null,null,from,size,false);

    }

static public  StringsearchAddScriptField(String dsl,String sort,String scriptField,int from,int size ){

return search(dsl,scriptField,null,_SOURCE,sort,null,from,size,false);

    }

static public  StringsearchAggs(String dsl,String aggs,int from,int size ){

return search(dsl,null,aggs,_SOURCEAGGS,null,null,from,size,false);

    }

static public  StringsearchCollapse(String dsl,String collapse,int from,int size ){

return search(dsl,null,null,collapse,_SOURCEAGGS_COLLAPSEC,null,null,from,size,false);

    }

/**

* https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-post-filter.html

    * @param dsl

    * @param postFilter

    * @param aggs

    * @param from

    * @param size

    * @return

    */

    static public  StringsearchPostFilter(String dsl,String postFilter,String aggs,int from,int size,String source){

return search(dsl,null,aggs,_SOURCE,null,null,from,size,false);

    }

static public  Stringsearch(String dsl,String source,int from,int size ){

if(StringUtils.isBlank(source)){

source=_SOURCE;

        }

return search(dsl,null,null,source,null,null,from,size,false);

    }

static public Stringsearch(String dsl,String scriptfield,String source,String sort,int from,int size ){

if(StringUtils.isBlank(dsl)) {

dsl ="{}";

        }

if(StringUtils.isBlank(source)){

source=_SOURCE;

        }

return"{\"query\":"+dsl+",\"_source\":"+source+"\"sort\":"+sort+",\"from\":"+from+",\"size\":"+size+"}";

    }

/**

*https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-simple-query-string-query.html

    * @param query 正则通配符 widldcards

    * @param operator and or not

    * @param fields

    * @return

    */

    static public StringqueryStringOpr(String query,String operator,String...  fields){

if(StringUtils.isBlank(operator)) {

operator ="and";

        }

StringBuilder sb =new StringBuilder();

        sb.append("{\"query_string\":{\"query\":\""+query+"\",\"default_operator\":\""+operator+"\",");

        int i;

        if(fields==null||fields.length==0){

sb.append("\"default_field\":\"_all\",");

        }else {

sb.append("\"fields\":[");

            for (i =0; i < fields.length; i++) {

sb.append("\"" + fields[i] +"\",");

            }

sb=new StringBuilder(sb.substring(0,sb.length()-1)+"],");

        }

return sb.substring(0,sb.length()-1)+"}}";

    }

static public StringqueryString(String query,String...  fields){

if(StringUtils.isBlank(query)) {

return null;

        }

return queryStringOpr(query,"and",fields);

    }

static public StringqueryStringOr(String query,String...  fields){

query = query.trim();

        if(StringUtils.isBlank(query)) {

return null;

        }

return queryStringOpr(query,"or",fields);

    }

static public StringscriptFields(String...values){

StringBuilder sb =new StringBuilder("{");

        for(int i =0 ;i

sb.append("\""+values[i]+"\":{");

            sb.append("\"script\":\""+values[i+1]+"\"},");

        }

return sb.substring(0,sb.length()-1)+"}";

    }

static public Stringbool(String must){

return bool(must,null,null,null,null);

    }

static public Stringbool(String must,String mustNot,String should){

return bool(must,mustNot,should,null,null);

    }

static public Stringbool(String must,String mustNot,String should,int minimum_should_match){

return bool(must,mustNot,should,minimum_should_match,null);

    }

static public Stringbool(String must,String mustNot,String should,String filter){

return bool(must,mustNot,should,null,filter);

    }

static public Stringbool(String must,String mustNot,String should,Integerminimum_should_match,String filter){

StringBuilder sb =new StringBuilder("{\"bool\":{");

        if(StringUtils.isNotBlank(must)){

sb.append("\"must\":"+must+",");

        }

if(StringUtils.isNotBlank(mustNot)){

sb.append("\"must_not\":"+mustNot+",");

        }

if(StringUtils.isNotBlank(should)){

sb.append("\"should\":"+should+",");

        }

if(minimum_should_match!=null){

sb.append("\"minimum_should_match\":"+minimum_should_match+",");

        }

if(StringUtils.isNotBlank(filter)){

sb.append("\"filter\":"+filter+",");

        }

return sb.substring(0,sb.length()-1).toString()+"}}";

    }

static public StringboolFilter(String filter){

if(StringUtils.isBlank(filter))

filter="{}";

        return "{\"bool\":{\"filter\":"+filter+"}}";

    }

/**

* and or not

    * @param operator

    * @param dsl

    * @return

    */

    static public Stringfilter(String operator,String dsl){

return "{\""+operator+"\":["+dsl+"]}";

    }

static public StringmergeDsl(String... dsls){

StringBuilder sb =new StringBuilder("[");

        for(String dsl:dsls){

if(StringUtils.isBlank(dsl)) {

continue;

            }

sb.append(dsl);

            sb.append(",");

        }

return sb.substring(0,sb.length()-1)+"]";

    }

static public Stringmatch(String field,String value){

return "{\"match\":{\""+field+"\":\""+value+"\"}}";

    }

/**

    * @param field

    * @param query

    * @param operator (and or)

    * @param minnum

    * @return

    */

    static public Stringmatch(String field,String query,String operator,int minnum){

return "{\"match\":{\""+field+"\":{\"query\":\""+query+"\",\"operator\":\""+operator+"\",\"\",:"+minnum+"}}";

    }

static public Stringmatch(HashMap map){

StringBuilder sb =new StringBuilder("[");

        for(Map.Entry entry :map.entrySet()){

if(entry.getValue()instanceof String ) {

sb.append("{\"match\":{\"" + entry.getKey() +"\":\"" + entry.getValue() +"\"}},");

            }

else {

sb.append("{\"match\":{\"" + entry.getKey() +"\":" + entry.getValue() +"\"}},");

            }

}

return sb.substring(0,sb.length()-1)+"]";

    }

static public Stringmatch(String field,Object... list){

StringBuilder sb =new StringBuilder("[");

        for(Object str :list){

if(strinstanceof String ) {

sb.append("{\"match\":{\"" + field +"\":\"" + str +"\"}},");

            }

else {

sb.append("{\"match\":{\"" + field +"\":" + str +"\"}},");

            }

}

return sb.substring(0,sb.length()-1)+"]";

    }

static public Stringterm(String type, Object value){

if(value==null||StringUtils.isBlank(String.valueOf(value))){

return null;

        }

if(valueinstanceof String) {

return "{\"term\":{\"" + type +"\":\"" + value +"\"}}";

        }

else{

return "{\"term\":{\"" + type +"\":" + value +"}}";

        }

}

static public StringtermCoverPlate(String type, String value){

if(StringUtils.isBlank(value)){

return null;

        }

StringBuilder dsl =new StringBuilder("[");

        String[] types =value.split(",");

        for(String coverType:types){

dsl.append("{\"term\":{\"" + type +"\":"+coverType+"}},");

        }

return dsl.substring(0,dsl.length()-1)+"]";

    }

static public Stringterm(HashMap map){

if(map.size()==0) {

return null;

        }

StringBuilder sb =new StringBuilder("[");

        for(Map.Entry entry :map.entrySet()){

sb.append("{\"term\":{\""+entry.getKey()+"\":\""+entry.getValue()+"\"}},");

        }

return sb.substring(0,sb.length()-1)+"]";

    }

static public Stringterm(String field,String ... values){

if(values==null||values.length==0) {

return null;

        }

StringBuilder sb =new StringBuilder("[");

        for(String val:values){

sb.append("{\"term\":{\""+field+"\":\""+val+"\"}},");

        }

return sb.substring(0,sb.length()-1)+"]";

    }

static public StringmuilMatch(String ctx,String... fields){

StringBuilder strBuilder =new StringBuilder("\"{\"multi_match\":{\"query\":\"\"+ctx+\"\",\"fields\":[");

        for(String filed :fields){

strBuilder.append("\""+filed+"\",");

        }

return strBuilder.substring(0,strBuilder.length()-1)+"]}}}";

    }

static public StringmuilMatchFuzzy(String ctx,String... fields){

StringBuilder strBuilder =new StringBuilder("\"{\"multi_match\":{\"query\":\"\"+ctx+\"\",\"fields\":[");

        for(String filed :fields){

strBuilder.append("\""+filed+"\",");

        }

return strBuilder.substring(0,strBuilder.length()-1)+"],\"fuzziness\":\"AUTO\"}}}";

    }

/**

*

    * @param field

    * @param value

    * @return

    */

    static public StringwildCardQuery(String field,String value){

value=value+"*";

        return "{\"wildcard\":{\""+field+"\",\""+value+"\"}}";

    }

static public Stringregexp(String field,String regexp){

return "{\"regexp\":{\"field\":{\""+field+"\",\""+regexp+"\"}}}";

    }

/**

*

    * @param field

    * @param value

    * @return

    */

    static public Stringhighlight(String field,String value){

return "{\"fields\":\""+field+"\":{\""+value+"\"}}";

    }

static public StringmuilMatchAll(String ctx){

return "{\"multi_match\":{\"query\":\""+ctx+"\",\"fields\":[\"_all\"]}}";

    }

static public StringmatchAll(){

return "{\"match_all\":{}}";

    }

static public Stringmust(String dsl){

return null;

    }

public StringBuildermustNot(HashMap map){

return null;

    }

static public Stringshould(HashMap map){

return null;

    }

static public StringrangeMarkValue(HashMap> markMap){

if(markMap.size()==0) {

return null;

        }

StringBuilder sb =new StringBuilder("[");

        for(Map.Entry> entry :markMap.entrySet()){

String type =entry.getKey();

            HashMap mark = entry.getValue();

            String mk = String.valueOf(mark.get("mark"));

            int value = Integer.valueOf(String.valueOf(mark.get("value")));

            if("=".equals(mk)){

sb.append("{\"term\":{\""+type+"\":"+value+"}},");

            }

else if(">".equals(mk)){

sb.append("{\"range\":{\""+type+"\":{\"gt\":"+value+"}}},");

            }

else if(">=".equals(mk)){

sb.append("{\"range\":{\""+type+"\":{\"gte\":"+value+"}}},");

            }

else if("<".equals(mk)){

sb.append("{\"range\":{\""+type+"\":{\"lt\":"+value+"}}},");

            }

else if("<=".equals(mk)){

sb.append("{\"range\":{\""+type+"\":{\"lte" +

"\":"+value+"}}},");

            }

}

return sb.substring(0,sb.length()-1)+"]";

    }

static public Stringrange(String type,Object minValue,Object maxValue,String gte,String lte){

Object tempMin =null;

        Object tempMax =null;

        if(minValueinstanceof Integer){

tempMin = (Integer)minValue;

            tempMax = (Integer)maxValue;

        }

else if(minValueinstanceof Long){

tempMin = (Long)minValue;

            tempMax = (Long)maxValue;

        }

else if(minValueinstanceof String){

tempMin ="\""+minValue+"\"";

            tempMax ="\""+maxValue+"\"";

        }

else if(minValueinstanceof Double){

tempMin = (Double)minValue;

            tempMax = (Double)maxValue;

        }

else if(minValueinstanceof Float){

tempMin = (Float)minValue;

            tempMax = (Float)maxValue;

        }

else if(minValueinstanceof Date){

tempMin =((Date) minValue).getTime();

            tempMax =((Date) maxValue).getTime();

        }

StringBuilder sb =new StringBuilder();

        sb.append("{\"range\":{\""+type+"\":{");

        if(StringUtils.isNotBlank(gte)){

sb.append("\""+gte+"\":"+String.valueOf(tempMin)+",");

        }

if(StringUtils.isNotBlank(lte)){

sb.append("\""+lte+"\":"+String.valueOf(tempMax)+",");

        }

return sb.substring(0,sb.length()-1)+"}}}";

    }

static public StringrangeGtAndLt(String type,Object minValue,Object maxValue){

return  range(type,minValue,maxValue,"gt","lt");

    }

static public StringrangeGteAndLte(String type,Object minValue,Object maxValue){

return  range(type,minValue,maxValue,"gte","lte");

    }

static public StringrangeGte(String type,Object minValue){

return  range(type,minValue,null,"gte",null);

    }

static public StringrangeLte(String type,Object maxValue){

return  range(type,null,maxValue,null,"lte");

    }

static public StringscriptQuery(String source ){

return "{\"script\":{\"script\":\""+source+"\"}}";

    }

static public StringscriptQueryByTime(String startTime, String endTime ){

if(StringUtils.isBlank(startTime)||StringUtils.isBlank(endTime)){

return null;

        }

int start = Integer.valueOf(startTime.replace(":",""));

        int end = Integer.valueOf(endTime.replace(":",""));

        String source ="int hour = doc['pass_time'].date.hourOfDay;int minute  = doc['pass_time'].date.minuteOfHour;int flag=hour*100+minute; flag>="+start+"&&flag <="+end+" ";

        return "{\"script\":{\"script\":\""+source+"\"}}";

    }

static public StringscriptQueryByTime2(String startTime, String endTime ){

if(StringUtils.isBlank(startTime)||StringUtils.isBlank(endTime)){

return null;

        }

if(startTime.length()==4){

startTime=startTime+"00";

        }

if(endTime.length()==4){

endTime=endTime+"00";

        }

int start = Integer.valueOf(startTime.replace(":",""));

        int end = Integer.valueOf(endTime.replace(":",""));

        return rangeGteAndLte("timenum",start,end);

    }

/**

*code

    * @param source

    * @param paramJson

    * @return

    */

    static public StringscriptQuery(String source,String paramJson ){

return "{\"script\":{\"script\":{\"code\":\""+source+"\",\"lang\" :\"painless\",\"params\":"+paramJson+"}}}";

    }

static public StringscriptQueryByScriptId(String id,String paramJson ){

return "{\"script\":{\"script\":{\"stored\":\""+id+"\",\"params\":"+paramJson+"}}}";

    }

static public Stringmissing(String type){

return "{\"missing\":{\"field\":\""+type+"\"}}";

    }

static public Stringexists(String type){

return "{\"exists\":{\"field\":\""+type+"\"}}";

    }

static public StringpackageScript(String script){

return "{\"script\":{\"lang\":\"painless\",\"code\":\""+script+"\"}}";

    }

/**

* 排序

    * @param field

    * @param sortType

    * @return

    */

    static public Stringsort(String field,String sortType){

if(StringUtils.isBlank(field)) {

return null;

        }

return  "{ \""+field+"\": { \"order\": \""+sortType+"\" }}";

    }

static public Stringasc(String field){

return  sort(field,ASC);

    }

static public Stringdesc(String field){

return  sort(field,DESC);

    }

static public StringhasParent(String type,String dsl){

return "{\"has_parent\":{\"type\":\""+type+"\",\"query\":"+dsl+"}}";

    }

static public StringhasChild(String type,String dsl,String dsl2,boolean showChild){

StringBuilder sb =new StringBuilder("{\"has_child\":{ ");

        sb.append("\"type\":\"" + type +"\",\"query\":" + dsl +",");

        if(showChild==true) {

sb.append("\"inner_hits\": {} }");

        }

String sql = sb.substring(0,sb.length()-1)+"}";

        if (StringUtils.isNotBlank(dsl2)){

sql = sql+",\"filter\":"+dsl2;

        }

return sql+"}";

    }

static public StringhasChild(String type,String dsl,boolean showChild){

return hasChild( type, dsl, null, showChild);

    }

static public StringnestedQuery(String path,String dsl,boolean showNested){

return nestedQuery(path,dsl,null,showNested);

    }

static public StringnestedQuery(String path,String dsl){

return nestedQuery(path,dsl,null,true);

    }

static public StringnestedFilter(String path,String dsl){

return nestedQuery(path,null,dsl,true);

    }

static public StringnestedQuery(String type,String dsl,String dsl2,boolean showChild){

StringBuilder sb =new StringBuilder("{\"nested\":{ ");

        sb.append("\"path\":\"" + type +"\",\"query\":" + dsl +",");

        if(showChild==true) {

sb.append("\"inner_hits\": {} }");

        }

String sql = sb.substring(0,sb.length()-1)+"}";

        if (StringUtils.isNotBlank(dsl2)){

sql = sql+",\"filter\":"+dsl2;

        }

return sql+"}";

    }

/**

* Elasticsearch Fields _source 返回值字段设置

    * @param fields

    * @return

    */

    static public Stringsource(String... fields){

StringBuilder sb =new StringBuilder("[");

        for(String field :fields){

sb.append("\""+field+"\",");

        }

return sb.substring(0,sb.length()-1)+"]";

    }

/**

* 度量聚合

    * @param nickName

    * @param aggsType

    * @return

    * https://blog.csdn.net/donghaixiaolongwang/article/details/58597058

* _search?search_type=count 参数:search_type=count 表示只返回aggregation部分的结果。

* avg max min  sum cardinality(distinct)

* stats 最大、最小、和、平均值。一起求出来

* extended_stats 其他属性,包括最大最小,方差等等。

* geo_bounds (attr "wrap_longitude" : true ) 计算出所有的地理坐标将会落在一个矩形区域

* geo_centroid 计算出所有文档的大概的中心点

* percentiles 百分比统计。可

* percentile_ranks

*top_hits  当于sql 中 group by 后取出前n条。

* value_count  数量统计,看看这个字段一共有多少个不一样的数值。

*

*

*/

    static public StringaggsMetrics(String nickName,String aggsType,String field){

return "{\"aggs\":{\""+nickName+"\":{\""+aggsType+"\":{\"field\":\""+field+"\"}}}}";

    }

static public Stringinner_hits(String name,String sort,int from,int size){

return "{\"name\":\""+name+"\",\"sort\":"+sort+",\"from\""+from+"\",\"size\":"+size+"}";

    }

/**

* 自定义聚合

* https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-scripted-metric-aggregation.html

    * @return

    */

    static public StringscriptMetrics(String nickName,String init,String map,String combine,String reduce){

return "{\""+nickName+"\":{" +

"\"init_script\":" +init+","+

"\"map_script\":" +map+","+

"\"combine_script\":" +combine+

"\"reduce_script\":" +reduce+

"}}";

    }

/**

    * @param values

    * @return

    */

    static public StringaggsMetrics(String ... values){

StringBuilder sb =new StringBuilder();

        sb.append("{\"aggs\":{");

        for(int i =0 ;i

String  nickName =values[i];

            String aggsType = values[i+1];

            String field = values[i+2];

            sb.append("\"" + nickName +"\":{\"" + aggsType +"\":{\"field\":\"" + field +"\"},");

        }

return sb.substring(0,sb.length()-1)+"}}";

    }

/**

*https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket.html

    * @return

    * adjacency_matrix 邻接矩阵,同事满足两个条件的数量

* Children Aggregation 父子关系  聚合

* Composite Aggregation

* sub Aggregation

* Nested Aggregation

*/

    static public StringaggsBucket(){

return  null;

    }

static public StringaggsLine(){

return null;

    }

/**

* 去除中括号,或者括号

    * @param json

    * @return

    */

    static public StringwipeBracket(String json){

return StringUtils.isBlank(json)?json:json.substring(1,json.length()-1);

    }

/**

*

    * @param sub

    * @return

    */

    public static StringreduceChar(String sub){

return sub.replace("[","").replace("]","").replace(","," ").replace("\"","");

    }

/**

*

    * @param sub

    * @return

    */

    public static StringreplaceChar(String sub){

return sub.replace("\"","\'");

}

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 前言 最先接触编程的知识是在大学里面,大学里面学了一些基础的知识,c语言,java语言,单片机的汇编语言等;大学毕...
    oceanfive阅读 3,040评论 0 7
  • 主要积累一些开发中比较 常用的工具类,部分借鉴于网络,主要来源于平时开发因需求而生的小工具类 13、ArithUt...
    大鸭梨leepear阅读 664评论 0 1
  • 五戌忆妈妈,音容乐哈哈 三岁哺奶奶,比妹衔瓜瓜 尿床换裙裙,夜半抽㞎㞎 嗷催油莽莽,哭拒搓痂痂 灶坎等面面,锅前望...
    汤沅霖阅读 464评论 5 2