#记录一些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();
增删改
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"}