es基础用法

author author     2022-09-08     360

关键词:

1、简介:

 Elasticsearch 是一个兼有搜索引擎NoSQL数据库功能的开源系统,基于Java/Lucene构建,可以用于全文搜索结构化搜索以及近实时分析。可以说Lucene是当今最先进,最高效的全功能开源搜索引擎框架。 说明: Lucene:只是一个框架,要充分利用它的功能,需要使用JAVA,并且在程序中集成Lucene,学习成本高,Lucene确实非常复杂。 Elasticsearch 是 面向文档型数据库,这意味着它存储的是整个对象或者 文档,它不但会存储它们,还会为他们建立索引,这样你就可以搜索他们了

Es的增删改查

导入数据到es前需要的配置代码

Settings settings = Settings 

            .settingsBuilder() 

            .put("cluster.name", "new_gjjqyxy")  //集群名称

            .put("client.transport.sniff",true)

           .build();

 

InetSocketTransportAddress transportAddress= new InetSocketTransportAddress

(InetAddress.getByName("172.22.21.21"),9300);//es所在的服务器和端口

 

Client  client =TransportClient.builder().settings(settings).build().

addTransportAddresses(transportAddresses);

 

BulkRequestBuilder bulkRequest =client.prepareBulk();

(附:需要导入相应的jar包以及jdk1.7以上,需要写在try catch

增和改

对于增加和修改,如果提供“主键id”那么执行的操作是一样的,增加可以提供id也可以不提供,这里推荐提供,这样方便修改。对于修改,就像提供id的增加的操作一样,es会根据你提供的id来修改该id对应的数据。

 

代码如下:

Map<String,Object> map=newHashMap<String,Object>();

bulkRequest.add(client.prepareIndex("12315_charts_test","type","finzjid") .setSource(

                                getXContentBuilderAnother(map)

                                )

                         );//12315_charts_test为索引名称

                           // type为类型

                           //finzjid为数据的主键id

                           // map为一条数据,存放在map

BulkResponse bulkResponse =bulkRequest.execute().actionGet();

int errorCount = 0;

if (bulkResponse.hasFailures()) {

    //处理错误

    for(BulkItemResponse itemResponse : bulkResponse) {

       if(itemResponse.isFailed()) {

           ++errorCount;

       }

    }

}

bulkRequest.request().requests().clear();

 

public static XContentBuildergetXContentBuilderAnother(Map map) throws IOException { 

       Setset = map.keySet();

       inta=set.size();

       Iteratoriterator=set.iterator();

   

       XContentBuilderxcb = XContentFactory.jsonBuilder().startObject();

       while(iterator.hasNext()){

           XContentBuilderxcbtemp=null;

           String key = (String) iterator.next();

           Objectvalue = map.get(key);

           xcbtemp=xcb.field(key,tmp);

           xcb=xcbtemp;

       }

       returnxcb.endObject();

    }

 

bulkRequest.add(client.prepareDelete("12315_charts_test"," type ", id).request());//id为待删除数据的主键

 

BulkResponse bulkResponse =bulkRequest.get(); 

   if (bulkResponse.hasFailures()) { 

        for(BulkItemResponse item :bulkResponse.getItems()){ 

            System.out.println(item.getFailureMessage()); 

        } 

   }else { 

        System.out.println("deleteok"); 

   }

一:查询条件的设置

//最终条件

BoolQueryBuildermustFilter = QueryBuilders.boolQuery();

 

1.//对于某字段的范围查询

RangeQueryBuilder rangeQueryBuilder =QueryBuilders.

rangeQuery("REGTIME");//REGTIMElong型字段,查询该字段的一个范围

rangeQueryBuilder.from(starttime);//开始边界

rangeQueryBuilder.to(endtime);//结束边界

rangeQueryBuilder.includeLower(true);

rangeQueryBuilder.includeUpper(true);

 

mustFilter.must(rangeQueryBuilder);//must相当and,should相当于 or

 

 

2.//对于某字段中值得限定查询

mustFilter.must(QueryBuilders.termQuery(SearchEntity.P_BUIS_TYPE,model.getBusitype()));

//第一个参数SearchEntity.P_BUIS_TYPE填写es上的字段名

//第二个参数model.getBusitype()填写第一个参数字段限定的值

// termQuery相当于等于的含义

// matchPhraseQuery 短语匹配,字段里面的值含有该短语就符合条件

// matchQuery 字段中有传入短语里面的那些字(按照短语顺序) 即符合条件

// matchPhrasePrefixQuery  字段中短语匹配且短语在开头

 

 

3.//对于一个字段里面匹配多个值

BoolQueryBuilder mustFiltertemp =QueryBuilders.boolQuery();

mustFiltertemp.should(QueryBuilders.matchPhraseQuery(SearchEntity.TABLE_COL,table1));//参照2所述

mustFiltertemp.should(QueryBuilders.matchPhraseQuery(SearchEntity.TABLE_COL,table2)); //参照2所述

 

mustFilter.must(mustFiltertemp);//最后把子条件添加到最终条件里


二:查询数据

//得到上面的BoolQueryBuilder mustFilter(查询条件)然后开始查询

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

SearchRequestBuilder searchRequestBuilder =client.

prepareSearch(INDEX_GS12315).setTypes(sss);

//这里INDEX_GS12315为你所查的索引名称,ssstype,可以是多个

 

searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH);

if(mustQuery!=null)searchRequestBuilder.setQuery(mustQuery);

searchRequestBuilder.

setFrom((page.getPageNo() - 1) *page.getPageSize()).

setSize(page.getPageSize());

//(page.getPageNo() - 1) * page.getPageSize()参数页数-1和页大小的乘积

// page.getPageSize()参数为页大小,这里自己定义传入

 

SearchResponse searchResponse =searchRequestBuilder.execute().

actionGet();

SearchHits hits = searchResponse.getHits();

// hits这是返回结果,可以自定义一个pager 将所需要的结果都放入相应的属性中

 

 

long num=hits.getTotalHits();

// num是符合条件的查询结果总数

 

 

//存放结果的链表,SearchEntity自定义的结果类,里面包含es上所有字段名

List<SearchEntity> list = newArrayList<SearchEntity>();

for (SearchHit hit : searchHists) {

           SearchEntityb = convert2SearchInfo(hit);

           Stringid=hit.getId();

           Stringtype=hit.getType();

           b.setId(id);

           b.setType(type);

           list.add(b);

       }

//es返回的一条结果转化为我们自定义的实体类

private static SearchEntityconvert2SearchInfo(SearchHit hit) {

String json = hit.getSourceAsString();

// json串值转换成对应的实体对象

//  SearchEntityb = JsonUtil.decode(json, SearchEntity.class);

//SearchEntity b =new SearchEntity();

JSONObjectjsontemp=JSONObject.fromObject(json);

SearchEntity b = (SearchEntity)jsontemp.

toBean(jsontemp,SearchEntity.class);

       returnb;

    }

 

//得到上面的list,就相当于得到的查询结果,这里的结果返回的条数是你自己定义的页大小和页号,不设置页大小和页号默认值为第1页的10条数据

 

 

三:分组查询

es中的某个字段分组,并找出分组后数量排名靠前的字段的值

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

 

// INDEX_GS12315参数是索引名称,sss是对哪些类型进行操作

SearchRequestBuilder searchRequestBuilder =client.

prepareSearch(INDEX_GS12315).setTypes(sss);

 

//_score字段按照降序排列

searchRequestBuilder.addSort(SortBuilders.fieldSort("_score").order(SortOrder.DESC));

 

searchRequestBuilder.setSearchType(SearchType.COUNT);

 

//col参数是分组的列名称,size是返回数量排名前多少的分组值

//size0时全部返回,size默认为10(如果不设置size的话)

TermsBuilder busitypeTermsBuilder = AggregationBuilders.terms(col).

field(col).size(size);

searchRequestBuilder.addAggregation(busitypeTermsBuilder);

 

//设置分组的条件

if(mustFilter!=null)searchRequestBuilder.setQuery(mustFilter);

searchRequestBuilder.setFrom(0).setSize(10000);

SearchResponse sr =searchRequestBuilder.execute().actionGet();

//返回的结果

Map<String, Aggregation> aggMap =sr.getAggregations().asMap();

      

//得到col列的返回结果,然后将分组结果放到dataMap

Terms terms = sr.getAggregations().get(col);

Collection<Terms.Bucket> buckets =terms.getBuckets(); 

Map<String, String> dataMap = newHashMap<String, String>(); 

for (Terms.Bucket bucket : buckets) { 

   Stringkey = (String) bucket.getKey(); 

   dataMap.put(key,bucket.getDocCount() + ""); 

 }

 

dataMap就是分组后的列的值和该值得数量


es6基础学习二const

es5是没用常量声明这个选项,es6将其添加其中。1.基本用法const声明一个只读常量。一旦申明,常量的值就不能改变。constPI=3.1415;PI=3;//SyntaxErrorconst声明的变量,一旦声明必须初始化(即赋值),否则报错。constfoo;//syntaxError除此... 查看详情

es6基础学习一let

1.基本用法let声明的变量,只在let命令所在的代码快有效:{leta=1;varb=1;}b//1a//referenceError:aisnotdefindps:说明es5没有块级作用域,导致if,for等循环语句声明的变量或变量赋值,外泄块级以外的环境。如:vari=100;for(vari=0;i<10;i++){}i;/... 查看详情

vue基础(es6)(代码片段)

...上来就直接用vue-cli构建项目,尤其是如果没有Node/Webpack基础。 什么是ECMAScript,以及es6的诞生?1997年ECMAScript1.0诞生1999年12月ECMA 查看详情

es6----promise基本用法(代码片段)

...为了正式规范,统一了用法,原生提供了Promise对象。2、基础用法//resolve代表成功reject失败都是一个函数letp=newPromise(function(reslove,reject)//reslove(‘成功‘)//状态由等待变为成功,传的参数作为then函数中成功函数的实参reject(‘失败... 查看详情

vuex----------state的基础用法

先使用vuecli构建一个自己的vue项目1.npmi-gvue-cli2.vueinitwebpacksell(sell是你的项目名)3.一路回车(在这个过程中会提示你是否安装一些依赖包,比如vue-router,es6语法检查等等,这些根据你个人习惯或者癖好选择Y/N)4.npmi(这个是安装项... 查看详情

promise的基础用法(代码片段)

Promise是异步编程的一种解决方案,比传统的解决方案–回调函数和事件--更合理和更强大。它由社区最早提出和实现,ES6将其写进了语言标准,统一了语法,原生提供了Promise所谓Promise,简单说就是一个容器,里面保存着某个... 查看详情

es6----class用法

http://es6.ruanyifeng.com/#docs/class    阮一峰老师的ES6入门一:知识点:1.基本上,ES6的class可以看作只是一个语法糖,它的绝大部分功能,ES5都可以做到。2.ES6的类,完全可以看作构造函数的另一种写法。3,.类的方法都... 查看详情

es6重要吗?为什么要学习es6?(代码片段)

...1.构建一套支持ES6的环境(gulp/babel/webpack/npm)。2.学习ES6的基础语法(了解用法;代码用法实例;注意事项)3.实际项目开发。3.对比E 查看详情

es6重要内容用法

ES6一、ECMA历史组成部分:ECMA、DOM、BOM什么是ECMA?全称ECMAScript简写ECMA或ESECMA是一个标准,JS是实现例如:HTML5是标准,chrome,FF,IE10是实现将来也可能有xxxscript实现ECMA目前的版本:低级浏览器:主要支持es3.1,3.2高级浏览器:正... 查看详情

vue基础之es6(代码片段)

什么是ECMAScript,以及es6的诞生?1997年ECMAScript1.0诞生1999年12月ECMAScript3.0诞生,它是一个巨大的成功,在业界得到了广泛的支持,它奠定了JS的基本语法,被其后版本完全继承。直到今天,我们一开始学习JS,其实就是在学3.0版的... 查看详情

es:promise的基本用法

letmyRandom=Math.floor(Math.random()*10);varworkIsDone=newPromise((resolve,reject)=>if(myRandom<5)resolve("finished......")elsereject("ongoing......"))workIsDone.then(function(value)console.log( 查看详情

es7新特性includes用法

 返回数组是否包含某个元素vararray1=[1,2,3];console.log(array1.includes(2));//expectedoutput:true   查看详情

(转)es6用法

如何在浏览器中使用es6的语法呢?方法一:引入文件相关js文件<scriptsrc="traceur.js"></script><scriptsrc="bootstrap.js"></script>//引导程序---跟css的bootstrap无关<scripttype="module">//code这里写你的代码</script& 查看详情

vue+webpack+es6的学习路线建议

...。ES6模块化与异步编程高级用法前端工程化与webpackVue的基础入门以上是自学的大方向,下面我们来一个部分一个部分细化学习路线。一、ES6模块化与异步编程高级用法的学习需要的内容为:ES6模块化Promiseasync/awaitEventLoop... 查看详情

es6系列--let的用法

基本用法:Es5只有全局作用域和函数作用域,没有块级作用域,这就带来了很不合理的场景比如:我们所期望的是能把vari =11的值打印出来 Es6新增了let命令,let命令只能在它的代码块中有效,其用法类似var不存在变量提升let并... 查看详情

es6.0generator三种用法

//Generatorstart-------thunk用法constThunk=function(fn){returnfunction(...args){returnfunction(callback){returnfn.call(this,...args,callback);}};};construn_thunk=function(fn){vargen=fn();functionnext(da 查看详情

es7,es8(代码片段)

ES7新特性ES7在ES6的基础上添加了三项内容:求幂运算符(**)、Array.prototype.includes()方法、函数作用域中严格模式的变更。Array.prototype.includes()方法includes()的作用,是查找一个值在不在数组里,若在,则返回 true,反之返回&nbs... 查看详情

es6let用法

1、实现块作用域2、不存在变量提升。ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。 查看详情