spring 操作elasticsearch查询使用方法
最近学习了一下elasticsearch使用,网上的资料又很少,真是一个头两个大。好歹最后终于了解了。留个笔记做日后查询。
packagecom.gooddeep.dev.elasticsearch.commons.dao; importjava.util.ArrayList; importjava.util.List; importjava.util.Map; importorg.elasticsearch.action.ActionFuture; importorg.elasticsearch.action.admin.cluster.health.ClusterHealthRequest; importorg.elasticsearch.action.admin.cluster.health.ClusterHealthResponse; importorg.elasticsearch.action.search.SearchResponse; importorg.elasticsearch.client.Client; importorg.elasticsearch.cluster.health.ClusterHealthStatus; importorg.elasticsearch.common.text.Text; importorg.elasticsearch.index.query.BoolQueryBuilder; importorg.elasticsearch.index.query.QueryBuilders; importorg.elasticsearch.search.SearchHit; importorg.elasticsearch.search.highlight.HighlightBuilder; importorg.elasticsearch.search.highlight.HighlightBuilder.Field; importorg.elasticsearch.search.sort.FieldSortBuilder; importorg.elasticsearch.search.sort.SortOrder; importorg.slf4j.Logger; importorg.slf4j.LoggerFactory; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.data.domain.Page; importorg.springframework.data.domain.PageImpl; importorg.springframework.data.domain.PageRequest; importorg.springframework.data.domain.Pageable; importorg.springframework.data.elasticsearch.core.ElasticsearchTemplate; importorg.springframework.data.elasticsearch.core.SearchResultMapper; importorg.springframework.data.elasticsearch.core.query.Criteria; importorg.springframework.data.elasticsearch.core.query.CriteriaQuery; importorg.springframework.data.elasticsearch.core.query.DeleteQuery; importorg.springframework.data.elasticsearch.core.query.IndexQuery; importorg.springframework.data.elasticsearch.core.query.IndexQueryBuilder; importorg.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; importorg.springframework.data.elasticsearch.core.query.SearchQuery; importorg.springframework.data.elasticsearch.core.query.StringQuery; importorg.springframework.stereotype.Component; importcom.gooddeep.dev.core.helper.PropertyHelper; importcom.gooddeep.dev.core.helper.UuidHelper; importcom.gooddeep.dev.core.model.BasePage; importcom.gooddeep.dev.elasticsearch.commons.model.EsBaseBean; importcom.gooddeep.dev.elasticsearch.commons.service.EsBaseService; @Component("esBaseDao") publicabstractclassEsBaseDaoImplimplementsEsBaseDao { privateLoggerlogger=LoggerFactory.getLogger(EsBaseService.class); @Autowired privateElasticsearchTemplateelasticsearchTemplate; @Autowired privateClientesClient; /** *插入或等新,需要有id,id需要自己生成 * *@paramtList *@return */ publicbooleaninsertOrUpdate(List tList){ List queries=newArrayList (); for(Tt:tList){ Stringid=((EsBaseBean)t).getId(); if(id==null){ id=UuidHelper.getRandomUUID(); ((EsBaseBean)t).setId(id); } IndexQueryindexQuery=newIndexQueryBuilder().withId(id).withObject(t).build(); queries.add(indexQuery); } elasticsearchTemplate.bulkIndex(queries); returntrue; } /** *插入或更新 * *@paramt *@return */ publicbooleaninsertOrUpdate(Tt){ Stringid=((EsBaseBean)t).getId(); if(id==null){ id=UuidHelper.getRandomUUID(); ((EsBaseBean)t).setId(id); } try{ IndexQueryindexQuery=newIndexQueryBuilder().withId(id).withObject(t).build(); elasticsearchTemplate.index(indexQuery); returntrue; }catch(Exceptione){ logger.error("insertorupdateuserinfoerror.",e); returnfalse; } } /** *删除 * *@paramid *@return */ publicbooleandeleteById(Stringid){ try{ elasticsearchTemplate.delete(getEntityClass(),id); returntrue; }catch(Exceptione){ logger.error("delete"+getEntityClass()+"byid"+id +"error.",e); returnfalse; } } /** *删除ids *@paramidList *@return */ @Override publicbooleandeleteByIds(List idList){ try{ CriteriaQuerycriteriaQuery=newCriteriaQuery(newCriteria()); criteriaQuery.setIds(idList); elasticsearchTemplate.delete(criteriaQuery,getEntityClass()); returntrue; }catch(Exceptione){ e.printStackTrace(); returnfalse; } } /** *根据条件查询 *@paramfiledContentMap不能为null *@return */ publicbooleandeleteByQuery(Map filedContentMap){ try{ DeleteQuerydq=newDeleteQuery(); BoolQueryBuilderqb=QueryBuilders.boolQuery(); if(filedContentMap!=null) for(Stringkey:filedContentMap.keySet()){//字段查询 qb.must(QueryBuilders.matchQuery(key,filedContentMap.get(key))); } dq.setQuery(qb);; elasticsearchTemplate.delete(dq,getEntityClass());; returntrue; }catch(Exceptione){ e.printStackTrace(); returnfalse; } } /** *检查健康状态 * *@return */ publicbooleanping(){ try{ ActionFuture health=esClient.admin() .cluster().health(newClusterHealthRequest()); ClusterHealthStatusstatus=health.actionGet().getStatus(); if(status.value()==ClusterHealthStatus.RED.value()){ thrownewRuntimeException( "elasticsearchclusterhealthstatusisred."); } returntrue; }catch(Exceptione){ logger.error("pingelasticsearcherror.",e); returnfalse; } } /** *条件查询 * *@paramsearchfields *查询字段 *@paramfiledContentMap *字段和查询内容 *@paramsortField *排序字段 *@paramorder *排序 *@paramfrom *@paramsize *@return */ @Override publicBasePage queryPage(Map filedContentMap,finalList heightFields,StringsortField,SortOrderorder,BasePage basePage){ Field[]hfields=newField[0]; if(heightFields!=null) { hfields=newField[heightFields.size()]; for(inti=0;i ").postTags("").fragmentSize(250); } } NativeSearchQueryBuildernsb=newNativeSearchQueryBuilder().withHighlightFields(hfields);//高亮字段 if(sortField!=null&&order!=null)//排序 nsb.withSort(newFieldSortBuilder(sortField).ignoreUnmapped(true).order(order)); if(basePage!=null)//分页 nsb.withPageable(newPageRequest(basePage.getPageNo(),basePage.getPageSize())); BoolQueryBuilderqb=QueryBuilders.boolQuery(); for(Stringkey:filedContentMap.keySet()){//字段查询 qb.must(QueryBuilders.matchQuery(key,filedContentMap.get(key))); } //userKey=78e48b85e94911e0d285f4eec990d556 //fa6e9c5bb24a21807c59e5fd3b609e12 nsb.withQuery(qb); SearchQuerysearchQuery=nsb.build();//查询建立 Page page=null; if(heightFields!=null&&heightFields.size()>0){//如果设置高亮 page=elasticsearchTemplate.queryForPage(searchQuery, getEntityClass(),newSearchResultMapper(){ @SuppressWarnings("unchecked") @Override public Page mapResults(SearchResponseresponse,Class clazz,Pageablepageable){ List chunk=newArrayList (); for(SearchHitsearchHit:response.getHits()){ if(response.getHits().getHits().length<=0){ returnnull; } Map entityMap=searchHit.getSource(); for(StringhighName:heightFields){ Texttext[]=searchHit.getHighlightFields().get(highName).fragments(); if(text.length>0) { StringhighValue=searchHit.getHighlightFields().get(highName).fragments()[0].toString(); entityMap.put(highName,highValue); } } chunk.add((T)PropertyHelper.getFansheObj( getEntityClass(),entityMap)); } if(chunk.size()>0){ returnnewPageImpl ((List )chunk); } returnnewPageImpl (newArrayList ()); } }); }else//如果不设置高亮 { logger.info("#################"+qb.toString()); page=elasticsearchTemplate.queryForPage(searchQuery,getEntityClass()); } //List ts=page.getContent(); basePage.setTotalRecord(page.getTotalElements()); basePage.setResults(page.getContent()); returnbasePage; } @Override publicList queryList(Map filedContentMap,finalList heightFields,StringsortField,SortOrderorder){ Field[]hfields=newField[0]; if(heightFields!=null) { hfields=newField[heightFields.size()]; for(inti=0;i ").postTags("").fragmentSize(250); } } NativeSearchQueryBuildernsb=newNativeSearchQueryBuilder().withHighlightFields(hfields);//高亮字段 if(sortField!=null&&order!=null)//排序 nsb.withSort(newFieldSortBuilder(sortField).ignoreUnmapped(true).order(order)); BoolQueryBuilderqb=QueryBuilders.boolQuery(); for(Stringkey:filedContentMap.keySet()){//字段查询 qb.must(QueryBuilders.matchQuery(key,filedContentMap.get(key))); } nsb.withQuery(qb); SearchQuerysearchQuery=nsb.build();//查询建立 Page page=null; if(heightFields!=null&&heightFields.size()>0){//如果设置高亮 page=elasticsearchTemplate.queryForPage(searchQuery, getEntityClass(),newSearchResultMapper(){ @SuppressWarnings("unchecked") @Override public Page mapResults(SearchResponseresponse,Class clazz,Pageablepageable){ List chunk=newArrayList (); for(SearchHitsearchHit:response.getHits()){ if(response.getHits().getHits().length<=0){ returnnull; } Map entityMap=searchHit.getSource(); for(StringhighName:heightFields){ StringhighValue=searchHit.getHighlightFields().get(highName).fragments()[0].toString(); entityMap.put(highName,highValue); } chunk.add((T)PropertyHelper.getFansheObj(getEntityClass(),entityMap)); } if(chunk.size()>0){ returnnewPageImpl ((List )chunk); } returnnull; } }); }else//如果不设置高亮 page=elasticsearchTemplate.queryForPage(searchQuery,getEntityClass()); returnpage.getContent(); } /** *本类查询 * *@paramid *@return */ publicTqueryById(Stringid){ StringQuerystringQuery=newStringQuery("id="+id); Tt=elasticsearchTemplate.queryForObject(stringQuery, getEntityClass()); returnt; } publicElasticsearchTemplategetElasticsearchTemplate(){ returnelasticsearchTemplate; } publicClientgetEsClient(){ returnesClient; } /** *得到类型 * *@return */ publicabstractClass getEntityClass(); /** *添加各自类的影射 */ publicabstractvoidputClassMapping(); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。