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就是分组后的列的值和该值得数量