关键词:
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");//REGTIME为long型字段,查询该字段的一个范围
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为你所查的索引名称,sss是type,可以是多个
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是返回数量排名前多少的分组值
//当size为0时全部返回,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命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。 查看详情