elasticsearch java 基于TransportClient API的增删改查

来源:互联网 发布:连江尚德中学网络硬盘 编辑:程序博客网 时间:2024/05/10 23:42

返回客户端类(基于TransportClient)

@Configuration("meta")  public class ConfigBeans {        @Value("${es_name}")   private String es_name;   @Value("#{'${es_ip}'.split(',')}")   private List<String> es_ip;   @Value("${es_port}")   private Integer es_port;   private TransportClient client = null;    @Bean    @Lazy    public TransportClient esClient(){      if(client==null){         if(es_name != null && !"".equals(es_name)){            Settings settings = Settings.builder().put("cluster.name", es_name).build();            client = new PreBuiltTransportClient(settings);         }else{            client = new PreBuiltTransportClient(Settings.EMPTY);         }         try {            for (String ip : es_ip) {               client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(ip), es_port));            }         } catch (UnknownHostException e) {            e.printStackTrace();         }         return client;      }else{         return client;      }    }     }  
增删改查类

public class UserServcieImpl implements UserService{      
private static Logger log = LogManager.getLogger(UserServcieImpl.class);private String esIndexName = "test";@Value("#{'${es_indexs}'.split(',')}")private String[] indexs;@Value("#{'${es_types}'.split(',')}")private String[] types;//private String[] indexs = {"test","accounts"};//private String[] types = {"person","info","info2"};@Resourceprivate  UserMapper userMapper;@AutowiredConfigBeans configBeans;@Autowiredprivate IMyDataDriver myDataElasticSearchDriver;/** * 查询 * @param keyword * @return */@Overridepublic List<Map<String, Object>> searchMany(String keyword) {   SearchResponse searchResponse = configBeans.esClient().prepareSearch(indexs).setTypes(types)//设置index,type (多个传字符串数组)         //.setQuery(QueryBuilders.matchAllQuery()) //查询所有默认返回10条         //.setQuery(QueryBuilders.matchQuery("last_name", keyword))//进行分词匹配单个字段,匹配字段名为filedname,值为value,加and完全匹配分词,根据匹配程度排序(_score)         //.setQuery(QueryBuilders.matchPhraseQuery("about", keyword))//完全匹配单个字段,匹配字段名为filedname,值为value         //.setQuery(QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("last_name", keyword)).filter(QueryBuilders.rangeQuery("age").gt(30)))//逻辑条件 must--and,should--or,must_not          //.setQuery(QueryBuilders.multiMatchQuery(keyword, "content","title"))//多字段匹配         //.setQuery(QueryBuilders.queryStringQuery("name:to* AND age:[0 TO 19]")) //根据条件查询,支持通配符大于等于0小于等于19         //.setQuery(QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery("lastModifyTime") .from("2017-8-23 00:00:01").to("2018-7-21 00:00:03"))) //分词 根据条件查询,支持通配符大于等于0小于等于19(全文搜索)         //.setQuery(QueryBuilders.termQuery("title", keyword))//查询时不分词 疑问 一个字能查出来,两个字以上查不出来         //.setQuery(QueryBuilders.termsQuery("title", keyword,"技"))//其中一个命中即匹配         //.setQuery(QueryBuilders.rangeQuery("province").gt(10).lt(20))//对于某一个field,大于多少,小于多少         //.setQuery(QueryBuilders.regexpQuery(field, regexp))//正则表达式查询         //.setQuery(QueryBuilders.existsQuery("sort"))// 存在field的不为null的数据         //.setQuery(QueryBuilders.nestedQuery("publication_history", QueryBuilders.matchQuery("publication_history.publication_date","20130102"),   ScoreMode.Total))//嵌套查询         //.setScroll(new TimeValue(60000))//滚动         //.highlighter(new HighlightBuilder().field("about").preTags("<span style='color:red'>").postTags("</span>")) //高亮         //TermsAggregationBuilder teamAgg= AggregationBuilders.terms("player_count ").field("team");         //TermsAggregationBuilder posAgg= AggregationBuilders.terms("pos_count").field("position");         //.addAggregation(AggregationBuilders.nested("negsted_path","comments").subAggregation(AggregationBuilders.sum("mysum").field("comments.stars")))         /*.addAggregation(AggregationBuilders.nested("negsted_path","comments").subAggregation(AggregationBuilders.histogram("age_group").field("comments.age").interval(10.0)).subAggregation(AggregationBuilders         .reverseNested("blogposts").subAggregation(AggregationBuilders.terms("tags").field("tags"))         ))*/         //.addAggregation(AggregationBuilders.filter("count",QueryBuilders.queryStringQuery("contactsName:刘承梅")))   //MoreLikeThisRequestBuilder mlt = new MoreLikeThisRequestBuilder(client, "indexName", "indexType", "id");  mlt.setField("title");//匹配的字段  SearchResponse response = client.moreLikeThis(mlt.request()).actionGet();         /*         聚合查询  获取聚合查询结果时 get 返回的时对应桶      (1)统计某个字段的数量            ValueCountBuilder vcb=  AggregationBuilders.count("count_uid").field("uid");  get返回ValueCount      (2)去重统计某个字段的数量(有少量误差查找性别的 M、F,共两个)            CardinalityBuilder cb= AggregationBuilders.cardinality("distinct_count_uid").field("uid");      (3)聚合过滤            FilterAggregationBuilder fab= AggregationBuilders.filter("uid_filter").filter(QueryBuilders.queryStringQuery("uid:001"));      (4)按某个字段分组(记录有多少F,多少M)            TermsBuilder tb=  AggregationBuilders.terms("group_name").field("name");  get返回Terms      (5)求和            SumBuilder  sumBuilder= AggregationBuilders.sum("sum_price").field("price");   get返回Sum      (6)求平均            AvgBuilder ab= AggregationBuilders.avg("avg_price").field("price"); get返回Avg      (7)求最大值            MaxBuilder mb= AggregationBuilders.max("max_price").field("price");      (8)求最小值            MinBuilder min= AggregationBuilders.min("min_price").field("price");       (9)  扩展统计包括最大最小方差等            ExtendedStatsAggregationBuilder field = AggregationBuilders.extendedStats("price").field("price");//返回ExtendedStats      (10)按日期间隔分组            DateHistogramBuilder dhb= AggregationBuilders.dateHistogram("dh").field("date");      (11)获取聚合里面的结果            TopHitsBuilder thb=  AggregationBuilders.topHits("top_result");      (12)嵌套的聚合            NestedBuilder nb= AggregationBuilders.nested("negsted_path").path("quests");      (13)反转嵌套            AggregationBuilders.reverseNested("res_negsted").path("kps ");  */         .setSearchType(SearchType.QUERY_THEN_FETCH)//设置查询类型         .setExplain(true)// 设置是否按查询匹配度排序         .setFrom(0).setSize(10)//分页         //.addSort("age", SortOrder.DESC)//指定字段排序         .execute().actionGet();//execute() 方法中,创建了一个ActionListener,用来监听action的执行结果;然后在调用actionGet(timeout),获取最终返回结果,actionGet是一个阻塞的方法,可以设置一个超时时间,也可以不设置          //.get();   List<Map<String,Object>> results = new ArrayList<Map<String,Object>>();   SearchHit[] hits = searchResponse.getHits().getHits();   System.out.println("size  "+hits.length);   for(SearchHit s : hits) {      results.add(s.getSource());      /*System.out.println(s.getHighlightFields());      Map<String, HighlightField> highlightFields = s.getHighlightFields();      HighlightField highlightField = highlightFields.get("about");      System.out.println("高亮字段:"+highlightField.getName()+"\n 高亮部分内容:"+highlightField.getFragments()[0].string());*/   }   /*Nested nested = searchResponse.getAggregations().get("negsted_path");   System.out.println(nested.getDocCount());   Histogram sum  = nested.getAggregations().get("age_group");   List<Histogram.Bucket> buckets = (List<Histogram.Bucket>) sum.getBuckets();   for(Histogram.Bucket bucket :buckets){      String id = bucket.getKeyAsString();      Long count = bucket.getDocCount();      System.out.println("id   "+id+"    count"+count);   }   ReverseNested  reverseNested =nested.getAggregations().get("blogposts");   System.out.println(reverseNested);   Terms by_key  = reverseNested.getAggregations().get("tags");   List<Terms.Bucket> buckets2 = (List<Terms.Bucket>) by_key.getBuckets();   for(Terms.Bucket bucket :buckets2){      String id = bucket.getKeyAsString();      Long count = bucket.getDocCount();      System.out.println("id   "+id+"    count"+count);   }*/   /*Terms by_key  = searchResponse.getAggregations().get("sales");   System.out.println(by_key);   //System.out.println("sum+="+sum+" max"+   by_key.getMax());   List<Terms.Bucket> buckets = (List<Terms.Bucket>) by_key.getBuckets();   for(Terms.Bucket bucket :buckets){      String id = bucket.getKeyAsString();      Long count = bucket.getDocCount();   }   */   //System.out.println("name--"+aggregation.getName()+"type  "+aggregation.getType()+" metadata "+aggregation.getMetaData());   /*String a = searchResponse.getScrollId();   int count=0;   while(true) {      SearchResponse response2 = configBeans.esClient().prepareSearchScroll(a)            .setScroll(new TimeValue(60000)).execute().actionGet();      SearchHit[] hits2 = response2.getHits().getHits();      System.out.println(hits2.length);      if(hits2.length==0)         break;      for (SearchHit s : hits2) {         System.out.println("count:" + count+" "+s.getSourceAsString()+"index:"+s.getIndex()+"type:"+s.getType());      }      count++;      a=response2.getScrollId();      System.out.println(a);   }*/      return results;}@Overridepublic Boolean add() {   List<Map<String, Object>> infoMap = userMapper.listAllChen();   TransportClient transportClient = configBeans.esClient();   BulkRequestBuilder bulkRequest=transportClient.prepareBulk();//批量   try {      IndexRequestBuilder indexRequestBuilder = configBeans.esClient().prepareIndex("test", "require");      int i=0;      for (Map<String, Object> map : infoMap) {         //indexRequestBuilder.setSource(map).execute().actionGet();         bulkRequest.add(transportClient.prepareIndex("hut_paper","paper").setSource(map));         //indexRequestBuilder.setSource(obj).execute().actionGet();         if (i%500==0) {            bulkRequest.execute().actionGet();            System.out.println("执行。。");         }      }      bulkRequest.execute().actionGet();   } catch (Exception e) {      e.printStackTrace();      return false;   }   return true;}@Overridepublic Boolean addMapping(String index,String type) {   //先创建空索引库   configBeans.esClient().admin().indices().prepareCreate(index).execute().actionGet();   try {      XContentBuilder  mapping = XContentFactory.jsonBuilder()            .startObject()            .startObject(index)            .startObject("properties")            .startObject("title").field("type", "string").field("store", "yes").endObject()            .startObject("description").field("type", "string").field("index", "not_analyzed").endObject()            .startObject("price").field("type", "double").endObject()            .startObject("onSale").field("type", "boolean").endObject()            .startObject("type").field("type", "integer").endObject()            .startObject("createDate").field("type", "date").endObject()            .endObject()            .endObject()            .endObject();      PutMappingRequest mappingRequest = Requests.putMappingRequest(index).type(type).source(mapping);      configBeans.esClient().admin().indices().putMapping(mappingRequest).actionGet();   }catch (IOException e){      return false;   }   return true;}@Overridepublic Boolean deleteDocument(String id) {   try{      DeleteResponse response = configBeans.esClient().prepareDelete("chenjiale", "chenjiale", id)            .get();      String index = response.getIndex();      String type = response.getType();      String id2 = response.getId();      long version = response.getVersion();      System.out.println("index:"+index+" type: "+type+" id:"+id2+"  version:"+version+"  status:"+response.status());      return true;   }catch (Exception e){      return false;   }}@Overridepublic Boolean updateDocument(String id) {   try{      XContentBuilder xContentBuilder = XContentFactory.jsonBuilder()            .startObject();      JSONObject obj = new JSONObject();      for(String key:obj.keySet()){         xContentBuilder.field(key, obj.getJSONObject(key));    //便利map,多行更新      }      xContentBuilder.endObject();      UpdateResponse response = configBeans.esClient().update(new UpdateRequest("chenjiale", "chenjiale", id)            .doc(xContentBuilder)).get();      return true;   }catch (Exception e){      e.printStackTrace();      return false;   }}
}