记录一些java es的相关操作

#记录一些es的相关操作
一个好用的插件

org.elasticsearch.client
transport
6.7.0

maven包
maven和es的版本要一致,不然会出现一些其他问题
1.建立连接

Settings settings = Settings.builder().put("client.transport.sniff", true).put("cluster.name", "maoannan").build();
		Client esClient = new PreBuiltTransportClient(settings)
				.addTransportAddress(new TransportAddress(new InetSocketAddress("127.0.0.1", 9300)));
2.根据实体类创建索引
esClient.admin().indices().prepareCreate("ceshi1").execute().actionGet();
        XContentBuilder mapping = XContentFactory.jsonBuilder()
				.startObject()
					.startObject("properties");
		Student obj = new Student();
		BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());    
	    PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();    
	    for (PropertyDescriptor property : propertyDescriptors) {
	    	mapping.startObject(property.getName());
	    	if(property.getPropertyType().equals(BigDecimal.class)){
	    		mapping.field("type","double");
	    	}else if(property.getPropertyType().equals(Date.class)){
	    		mapping.field("type","date").field("format", "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis");
	    	}else if(property.getPropertyType().equals(Integer.class)){
	    		mapping.field("type","integer");
	    	}else if(property.getPropertyType().equals(Long.class)){
	    		mapping.field("type","long");
	    	}//如果是关键词字段则进行分词
	    	else if(property.getName().equals("keyWords")){
	    		mapping.field("type","text").field("analyzer","ik_max_word").field("search_analyzer","ik_max_word");
	    	}else{
	    		mapping.field("type","keyword");
	    	}
	    	mapping.endObject();
	    }  
	    mapping.endObject()
				.endObject();
		PutMappingRequest putMappingRequest = Requests.putMappingRequest("ceshi1").type("test1").source(mapping);
		esClient.admin().indices().putMapping(putMappingRequest).actionGet();
		3.关闭连接
		esClient.close();

执行后用postman查询索引,字段符合要求
查询后,里面没有数据
增删改

String[] indexEnum=new String[]{"ceshi1","test1"};
		Student student=new Student();
		student.setAge(19);
		student.setId(1);
		student.setName("飞飞");
		student.setSex("男");
		SearchRequestBuilder requestBuilder = client.prepareSearch("ceshi1")
	            .setTypes("test1")
	            .setQuery(QueryBuilders.termQuery("id", 1));
        SearchResponse searchResponse = requestBuilder.get();
        boolean success;
        long totalHit = searchResponse.getHits().getTotalHits();
        //如果没有则新增如果有则修改,超过则删除在新增
        if (totalHit == 0) {
        	System.out.println(111);
            success = create(student, indexEnum);
        } else if (totalHit == 1) {
        	System.out.println(222);
            String esId = searchResponse.getHits().getAt(0).getId();
            success = update( student, indexEnum,esId);
        } else {
        	System.out.println(333);
            success = deleteAndCreate(totalHit, student, indexEnum);
        }
        System.out.println(success);
private static boolean create(Student template, String[] indexEnum) {
    try {
        IndexResponse response = client
            .prepareIndex(indexEnum[0],indexEnum[1])
            .setSource(JSONObject.toJSONString(template), XContentType.JSON).get();
        if (response.status() == RestStatus.CREATED) {
            return true;
        } else {
            return false;
        }
    } catch (Exception e) {
    	e.printStackTrace();
        return false;
    }
}

private static boolean update(Student template, String[] indexEnum,String esId) {

    try {
        UpdateResponse response = client
            .prepareUpdate(indexEnum[0],indexEnum[1], esId)
            .setDoc(JSONObject.toJSONString(template), XContentType.JSON).get();
        if (response.status() == RestStatus.OK) {
            return true;
        } else {
            return false;
        }
    } catch (Exception e) {
        return false;
    }
}
private static boolean deleteAndCreate(long totalHit, Student template,String[] indexEnum) {
    DeleteByQueryRequestBuilder builder = DeleteByQueryAction.INSTANCE
        .newRequestBuilder(client)
        .filter(QueryBuilders.termQuery("id", template.getId()))
        .source(indexEnum[0]);
    BulkByScrollResponse response = builder.get();
    long deleted = response.getDeleted();
    if (deleted != totalHit) {
        return false;
    } else {
        return create(template, indexEnum);
    }
}

新增后有数据了
查询的一些方法
查询的代码有一部分类没贴,所以直接复制黏贴是没用的

List<QueryBuilder> boolQueryList = new ArrayList<QueryBuilder>();
//时间比大小
if (this.startTime != null) {
    	boolQueryList.add(QueryBuilders.rangeQuery("bookExpectLeavePort").gte(this.startTime.getTime()));
    }
    if (this.endTime != null) {
    	boolQueryList.add(QueryBuilders.rangeQuery("bookExpectLeavePort").lte(this.endTime.getTime()));
    }
//全字符比较
boolQueryList.add(QueryBuilders.termQuery("salesmanId", this.salesmanId));
//模糊比
boolQueryList.add(QueryBuilders.wildcardQuery("salesmanName",
          "*"+this.salesmanName+"*"));
//吧查询类设置的参数配置上
//建立查询对象
SearchRequestBuilder requestBuilder = this.esClient.prepareSearch("ceshi1").setTypes("test1");
//配置参数
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
    Map<String, List<QueryBuilder>> builderMap = query.getBuilderMap();
    List<QueryBuilder> boolQueryList = builderMap.get("boolQueryList");
    if (!CollectionUtils.isEmpty(boolQueryList)) {
        for (QueryBuilder builder : boolQueryList) {
            boolQuery.filter(builder);
        }
    }
    //设置排序和长度(es默认是1W条)
     requestBuilder
        .addSort(baseQuery.getOrderName(), SortOrder.fromString(baseQuery.getOrder()))
        .setFrom(start).setSize(length);
requestBuilder.setQuery(boolQuery);
//获取到结果
SearchResponse response2 = requestBuilder.get();
    
    for (SearchHit hit : response2.getHits()) {
        T t = JSON.parseObject(hit.getSourceAsString(), clazz);
        result.add(t);
    }

//聚合查询

TermsAggregationBuilder groupByQuery=null;
groupByQuery = FinanclalCountGroupByEnum.getGroupByQuery(groupByEnum,groupByEnum1);
public static TermsAggregationBuilder getGroupByQuery(FinanclalCountGroupByEnum groupByEnum1,
		FinanclalCountGroupByEnum groupByEnum2) {
		TermsAggregationBuilder tb = AggregationBuilders
		.terms(groupByEnum1.getTerm())
		.field(groupByEnum1.getField())
		.size(1000000)
		.subAggregation(
		AggregationBuilders
		.terms(groupByEnum2.getTerm())
		.field(groupByEnum2.getField())
		.size(1000000)
		.subAggregation(AggregationBuilders.sum("sumActualGoodsMoneyRmb").field("actualGoodsMoneyRmb"))
        .subAggregation(AggregationBuilders.sum("sumNotReceivedMoneyRmb").field("notReceivedMoneyRmb"))
        .subAggregation(AggregationBuilders.sum("sumActualGoodsMoneyUsd").field("actualGoodsMoneyUsd"))
        .subAggregation(AggregationBuilders.sum("sumNotReceivedMoneyUsd").field("notReceivedMoneyUsd"))
    	.subAggregation(AggregationBuilders.sum("sumAccountsReceivableAllMoney").field("accountsReceivableAllMoney"))
    	.subAggregation(AggregationBuilders.sum("sumNotReceivedMoney").field("notReceivedMoney"))
    	.subAggregation(AggregationBuilders.sum("sumActualGoodsMoney").field("actualGoodsMoney")));
	
	return tb;
}
聚合查询的二次分组里也要设置长度不然如果数据超过1W默认就只查询一万这样聚合出来的数据会不对
Terms term = response.getAggregations().get(groupByEnum.getTerm());
for (Terms.Bucket entry : term.getBuckets()) {
       遍历处理是数据
       
}

用postman对es的一些查询
//查询数据
http://127.0.0.1:9200/ceshi1/_search
//准确查询字段
{

"query":{
    "term":{
        "freightType":"到付"
    }
}

}
//模糊查询
{

"query":{
    "wildcard":{
        "freightType":"*到付*"
    }
}

}
//多个条件(和比大小查询)
{

"query":{
	"bool":{
	 "must": [
{
"wildcard":
{
        	 "customerNameCn":"*大华*"
    	 }
    	},
    	{
    	 "range": {
        	 "bookExpectLeavePort": {
        	 "gte": 1561219200000,
            	 "lte": 1563724800000
        	 }
    	 }
    	}
    ]
	}
    
}

}

//新增字段
http://47.110.59.3:9200/organizationfinanclalcs/_mapping/organizationfinanclalcalcs

{
"organizationfinanclalcalcs": {
"properties":{
 "customerSalemanName": {
     "type": "keyword"
 }
}
}
}

{
"knowledageBase": {
"properties":{
 "keyWords": {
     "type": "text",
     "analyzer": "ik_max_word",
     "search_analyzer": "ik_max_word"
 }
}
}
}

//查询索引内的字段
http://47.110.59.3:9200/employeefinanclalcs/_mapping/employeefinanclalcalcs

//批量修改字段
http://192.168.0.161:9200/freightquery/_update_by_query

{

"query":{
    "term":{
        "name":"飞飞"
    }
}
,
"script": {
"lang": "painless", 
"inline": "ctx._source.age = '50' "
  }
}

吧名字是飞飞的年龄全部改成50

//吧es索引1W限制改大

reportcount/_settings?preserve_existing=true


{"max_result_window":"2000000000"}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值