import com.alibaba.fastjson.JSON;
import com.bobft.fairy.service.EsService;
import com.bobft.fairy.vo.EsInsertEntity;
import com.bobft.fairy.vo.FinanceEsVo;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.action.bulk.BulkItemResponse;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.common.xcontent.XContentType;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* Es 创建索引和字段
*
* @author hcf
* @date 2021/12/17 17:28
*/
@Slf4j
@Service
public class EsServiceImpl implements EsService {
@Resource
// restHighLevelClient 的配置信息请查看
// [【烦人的ElasticSearch】Es7 如何判断索引是否存在(Java版本)](https://blog.youkuaiyun.com/qq_27631797/article/details/122091486?spm=1001.2014.3001.5501)
private RestHighLevelClient restHighLevelClient;
@Override
public void createEsIndex(String esIndexYear) throws Exception {
CreateIndexRequest createIndexRequest = new CreateIndexRequest(esIndexYear);
// 配置分片数量和副本数量
createIndexRequest.settings(Settings.builder()
.put("number_of_shards", 3)
.put("number_of_replicas", 0));
// 配置映射源
// 映射源的配置采用的是 XContentBuilder 方式
// 还有两种方式分别是 Json 方式和 Map 方式
// XContentBuilder 规则是每个元素必须以 startObject() 开始,以 endObject() 结尾
// 对应到 ES 的语句便是,每个{}前后在Java代码中都对应一个 startObject() 和 endObject()
XContentBuilder builder = XContentFactory.jsonBuilder();
builder.startObject();
{
builder.startObject("properties");
{
// 流水号
builder.startObject("requestRefId");
{
builder.field("type", "keyword");
}
builder.endObject();
// 手机号
builder.startObject("mobile");
{
builder.field("type", "keyword");
}
builder.endObject();
// 发送时间
builder.startObject("sendTime");
{
builder.field("format", "yyyy-MM-dd HH:mm:ss");
builder.field("type", "date");
}
builder.endObject();
}
builder.endObject();
}
builder.endObject();
createIndexRequest.mapping(builder);
restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT);
}
}
附录 ES 原始操作
curl -XPUT '127.0.0.1:9200/es_index_create_test/_mapping?pretty' -H 'Content-Type: application/json' -d'
{
"properties":{
"requestRefId":{
"type":"keyword"
},
"mobile":{
"type":"keyword"
},
"sendTime":{
"format":"yyyy-MM-dd HH:mm:ss",
"type":"date"
}
}
}'
附录其他两种方式
// JSON 格式
CreateIndexRequest createIndexRequest = new CreateIndexRequest(esIndexYear);
createIndexRequest.mapping("{\"properties\":{\"requestRefId\":{\"type\":\"keyword\"},\"mobile\":{\"type\":\"keyword\"},\"sendTime\":{\"format\":\"yyyy-MM-dd HH:mm:ss\",\"type\":\"date\"}}}");
restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT);
// Map格式其实就是Map序列化后成为Json这种格式就可以
Map<String, String> requestRefIdParam = new HashMap();
requestRefIdParam.put("type", "keyword");
// mobile 和 sendTime 同理
Map<String, Object> mobileParam = new HashMap();
......
Map<String, Object> sendTimeParam = new HashMap();
......
// properties
Map<String, Object> propertiesParam = new HashMap();
propertiesParam.put("requestRefId", requestRefIdParam);
propertiesParam.put("mobile ", mobileParam);
propertiesParam.put("sendTime", sendTimeParam);
// 汇总
Map<String, Object> propertiesMap = new HashMap();
propertiesMap.put("properties", propertiesParam);
CreateIndexRequest createIndexRequest = new CreateIndexRequest(esIndexYear);
createIndexRequest.mapping(propertiesMap);
restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT);