java代碼對es操作

基於上篇文檔基礎上: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("[email protected]");
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("[email protected]");
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("[email protected]");
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":"[email protected]","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("[email protected]");
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("[email protected]");
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":"[email protected]","phoneNumer":"131000055555","remark":"Jack的備註","status":1,"userId":5,"userName":"Jack"},{"address":"深圳市","age":25,"birthday":775670400000,"email":"[email protected]","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":"[email protected]","phoneNumer":"13500001111","remark":"tom的備註","status":1,"userId":1,"userName":"tom"},{"address":"上海市","age":22,"birthday":864144000000,"email":"[email protected]","phoneNumer":"13800002222","remark":"lily的備註","status":1,"userId":2,"userName":"lily"},{"address":"杭州市","age":30,"birthday":611679600000,"email":"[email protected]","phoneNumer":"13600003333","remark":"Tony的備註","status":0,"userId":3,"userName":"Tony"},{"address":"天津市","age":38,"birthday":350668800000,"email":"[email protected]","phoneNumer":"131000055555","remark":"Jack的備註","status":1,"userId":5,"userName":"Jack"},{"address":"深圳市","age":25,"birthday":775670400000,"email":"[email protected]","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":"[email protected]","phoneNumer":"13600003333","remark":"Tony的備註","status":0,"userId":3,"userName":"Tony"}]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章