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
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
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
//得到col列的返回结果,然后将分组结果放到dataMap中
Terms terms = sr.getAggregations().get(col);
Collection
Map
for (Terms.Bucket bucket : buckets) {
Stringkey = (String) bucket.getKey();
dataMap.put(key,bucket.getDocCount() + "");
}
dataMap就是分组后的列的值和该值得数量