基于上篇文档基础上:es配置和工具类
索引
String indexName = "lockie_test2";
- 新增索引
代码:
boolean index = EsClientUtil.createIndex(indexName);
System.out.println("创建索引是否成功:" + index);
执行结果:
创建索引是否成功:true
- 检查索引是否存在
代码:
boolean lockie_test = EsClientUtil.checkIndexExist(indexName);
System.out.println("索引是否存在:" + lockie_test);
执行结果:
索引是否存在:true
- 新增分片索引
调用createIndex默认新增的索引的分片,副本都是1,如果想要指定分片和副本则调用下面的方法
代码:
boolean createIndex = EsClientUtil.createIndex(indexName, 2, 2);
System.out.println("创建分片索引是否成功:" + createIndex);
- 开启索引
boolean openIndex = EsClientUtil.openIndex(indexName);
System.out.println("开启索引是否成功:" + openIndex);
- 关闭索引
索引关闭了就不能执行查询等操作
代码:
boolean closeIndex = EsClientUtil.closeIndex(indexName);
System.out.println("关闭索引是否成功:" + closeIndex);
- 删除索引
代码:
boolean deleteIndex = EsClientUtil.deleteIndex(indexName);
System.out.println("删除索引是否成功:" + deleteIndex);
执行结果:
删除索引是否成功:true
Mapping
- 检查mapping是否存在
boolean checkMappingExist = EsClientUtil.checkMappingExist(indexName);
System.out.println("mapping是否存在:" + checkMappingExist);
新增索引后mapping默认为空
- 新增mapping
首先新增一个mapping类,里面定义mapping字段的类型
import com.dst.charge.business.center.es.elasticsearch7.mapping.BaseElasticSearchMapping;
import org.elasticsearch.Version;
import org.elasticsearch.index.mapper.DateFieldMapper;
import org.elasticsearch.index.mapper.NumberFieldMapper;
import org.elasticsearch.index.mapper.RootObjectMapper;
import org.elasticsearch.index.mapper.TextFieldMapper;
import java.io.Serializable;
/**
* @author: lockie
* @Date: 2019/12/6 14:13
* @Description: 用户mapping
*/
public class UserMapping extends BaseElasticSearchMapping {
private static final String INDEX_TYPE = "document";
public UserMapping() {
super(INDEX_TYPE, Version.V_7_3_1);
}
@Override
protected void configureRootObjectBuilder(RootObjectMapper.Builder builder) {
builder
.add(new NumberFieldMapper.Builder("userId", NumberFieldMapper.NumberType.INTEGER))
.add(new TextFieldMapper.Builder("userName"))
.add(new NumberFieldMapper.Builder("age", NumberFieldMapper.NumberType.INTEGER))
.add(new TextFieldMapper.Builder("address"))
.add(new DateFieldMapper.Builder("birthday"))
.add(new TextFieldMapper.Builder("phoneNumber"))
.add(new TextFieldMapper.Builder("email"))
.add(new NumberFieldMapper.Builder("status", NumberFieldMapper.NumberType.INTEGER))
.add(new TextFieldMapper.Builder("remark"));
}
}
然后再调用工具类生成mapping
boolean putMapping = EsClientUtil.postMapping(indexName, new UserMapping());
System.out.println("新增mapping是否成功:" + putMapping);
文档
首先创建mapping对应的java对象 UserEntity
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* @author: lockie
* @Date: 2019/12/9 17:27
* @Description:
*/
@Data
public class UserEntity implements Serializable {
private int userId;
private String userName;
private int age;
private String address;
private Date birthday;
private String phoneNumer;
private String email;
private int status;
private String remark;
}
- 新增、更新、删除文档
UserEntity user = new UserEntity();
user.setUserId(1);
user.setUserName("tom");
user.setAge(20);
user.setAddress("北京市");
user.setBirthday(DateUtil.convert2Date("1999-10-01", DateUtil.DATEFORMAT));
user.setPhoneNumer("13500001111");
user.setEmail("tom@163.com");
user.setStatus(1);
UserEntity user2 = new UserEntity();
user2.setUserId(2);
user2.setUserName("lily");
user2.setAge(22);
user2.setAddress("上海市");
user2.setBirthday(DateUtil.convert2Date("1997-05-21", DateUtil.DATEFORMAT));
user2.setPhoneNumer("13800002222");
user2.setEmail("lily@163.com");
user2.setStatus(1);
UserEntity user3 = new UserEntity();
user3.setUserId(3);
user3.setUserName("Tony");
user3.setAge(30);
user3.setAddress("杭州市");
user3.setBirthday(DateUtil.convert2Date("1989-05-21", DateUtil.DATEFORMAT));
user3.setPhoneNumer("13600003333");
user3.setEmail("Tony@163.com");
user3.setStatus(0);
UserEntity user4 = new UserEntity();
user4.setUserId(4);
// 转成成json字符串形式
String jsonString = JSONObject.toJSONString(user);
// 新增文档
EsClientUtil.addDocByJson(indexName, "4", jsonString);
// 更新文档
EsClientUtil.updateDocByJson(indexName, "3", jsonString);
// 删除文档
EsClientUtil.deleteDoc(indexName, "4");
- 根据ID获取文档
Map<String, Object> doc = EsClientUtil.getDoc(indexName, "1");
System.out.println("根据ID获取文档数据:" + JSONObject.toJSONString(doc));
根据ID获取文档数据:{"address":"北京市","age":20,"birthday":938707200000,"email":"tom@163.com","phoneNumer":"13500001111","remark":"tom的备注","status":1,"userId":1,"userName":"tom"}
- 批量新增、更新、删除文档
List<Map<String, String>> params = new ArrayList<>();
UserEntity user5 = new UserEntity();
user5.setUserId(5);
user5.setUserName("Jack");
user5.setAge(38);
user5.setAddress("天津市");
user5.setBirthday(DateUtil.convert2Date("1981-02-11", DateUtil.DATEFORMAT));
user5.setPhoneNumer("131000055555");
user5.setEmail("Jack@163.com");
user5.setStatus(1);
user5.setRemark("Jack的备注");
Map<String, String> map5 = new HashedMap();
map5.put("index", "lockie_test2");
map5.put("id", "5");
map5.put("json", JSONObject.toJSONString(user5));
UserEntity user6 = new UserEntity();
user6.setUserId(6);
user6.setUserName("Rain");
user6.setAge(25);
user6.setAddress("深圳市");
user6.setBirthday(DateUtil.convert2Date("1994-08-01", DateUtil.DATEFORMAT));
user6.setPhoneNumer("131000066666");
user6.setEmail("Rain@163.com");
user6.setStatus(1);
user6.setRemark("Rain的备注");
Map<String, String> map6 = new HashedMap();
map6.put("index", "lockie_test2");
map6.put("id", "6");
map6.put("json", JSONObject.toJSONString(user6));
params.add(map5);
params.add(map6);
// 批量新增
EsClientUtil.bulkAdd(params);
// 批量更新
EsClientUtil.bulkUpdate(params);
// 批量删除
EsClientUtil.bulkDelete(params);
- 批量获取文档
List<Map<String, Object>> list = EsClientUtil.multiGet(params);
System.out.println("批量获取:" + JSONObject.toJSONString(list));
批量获取:[{"address":"天津市","age":38,"birthday":350668800000,"email":"Jack@163.com","phoneNumer":"131000055555","remark":"Jack的备注","status":1,"userId":5,"userName":"Jack"},{"address":"深圳市","age":25,"birthday":775670400000,"email":"Rain@163.com","phoneNumer":"131000066666","remark":"Rain的备注","status":1,"userId":6,"userName":"Rain"}]
- 根据条件删除
QueryBuilder deleteBuilder = QueryBuilders.termsQuery("userId", "4");
EsClientUtil.deleteByQuery(indexName, deleteBuilder);
查询
- 查询所有的数据
// 创建查询条件
QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
SearchSourceBuilder builder = new SearchSourceBuilder();
// 使用query可以排序,使用postFilter不支持排序
builder.query(queryBuilder);
// 设置查询最大数量,默认10条
builder.size(10000);
// 设置排序字段
builder.sort("userId", SortOrder.ASC);
List<UserEntity> searchList = EsClientUtil.search(indexName, builder, UserEntity.class);
System.out.println("全部查询结果:" + JSONObject.toJSONString(searchList));
全部查询结果:[{"address":"北京市","age":20,"birthday":938707200000,"email":"tom@163.com","phoneNumer":"13500001111","remark":"tom的备注","status":1,"userId":1,"userName":"tom"},{"address":"上海市","age":22,"birthday":864144000000,"email":"lily@163.com","phoneNumer":"13800002222","remark":"lily的备注","status":1,"userId":2,"userName":"lily"},{"address":"杭州市","age":30,"birthday":611679600000,"email":"Tony@163.com","phoneNumer":"13600003333","remark":"Tony的备注","status":0,"userId":3,"userName":"Tony"},{"address":"天津市","age":38,"birthday":350668800000,"email":"Jack@163.com","phoneNumer":"131000055555","remark":"Jack的备注","status":1,"userId":5,"userName":"Jack"},{"address":"深圳市","age":25,"birthday":775670400000,"email":"Rain@163.com","phoneNumer":"131000066666","remark":"Rain的备注","status":1,"userId":6,"userName":"Rain"}]
- 复合查询,多条件
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.size(10000);
builder.sort("userId", SortOrder.ASC);
// 构建查询条件,年龄在20到30之间,状态是0,或者城市是北京市
QueryBuilder queryBuilder3 = QueryBuilders.boolQuery()
.must(QueryBuilders.rangeQuery("age").from("20").to("30"))
.should(QueryBuilders.termsQuery("address", "北京市"))
.filter(QueryBuilders.termsQuery("status", "0"));
builder.query(queryBuilder3);
List<UserEntity> boolQueryList = EsClientUtil.search(indexName, builder, UserEntity.class);
System.out.println("多条件查询结果:" + JSONObject.toJSONString(boolQueryList));
多条件查询结果:[{"address":"上海市","age":30,"birthday":611679600000,"email":"Tony@163.com","phoneNumer":"13600003333","remark":"Tony的备注","status":0,"userId":3,"userName":"Tony"}]