Elasticsearch8搭建及Springboot中集成使用_elasticsearch8安装配置

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注运维)
img

正文

private List<T> getResult(Class<T> target, List<T> result, SearchResponse<HashMap> search) {
    List<Hit<HashMap>> hits = search.hits().hits();
    Iterator<Hit<HashMap>> iterator = hits.iterator();
    while (iterator.hasNext()) {
        Hit<HashMap> decodeBeanHit = iterator.next();
        Map<String, Object> docMap = decodeBeanHit.source();
        docMap.put("id", decodeBeanHit.id());
        String json = JSON.toJSONString(docMap);
        T obj = JSON.parseObject(json, target);
        result.add(obj);
    }
    return result;
}

/**
 * @param
 * @param client
 * @param dto
 * @return long
 * @author liuch
 * @description 根据关键字查询总条数
 * @date 2022/4/2 17:15
 */
public static long queryCountByFiled(ElasticsearchClient client, EsQueryDTO dto) throws Exception {
    CountResponse count = client.count(c -> c.index(dto.getIndexName()).query(q -> q.term(t -> t
            .field(dto.getField())
            .value(dto.getWord())
    )));
    long total = count.count();
    return total;
}

/**
 * @param
 * @param client
 * @param dto
 * @return long
 * @author liuch
 * @description 根据关键字查询总条数-复合查询
 * @date 2022/4/2 17:15
 */
public static long queryCountByFileds(ElasticsearchClient client, List<Query> queries, EsQueryDTO dto) throws Exception {
    getFieldValues(dto, queries);
    CountResponse count = client.count(c -> c.index(dto.getIndexName()).query(q -> q.bool(b -> b.must(queries))));
    long total = count.count();
    return total;
}


/**
 * @param client
 * @param dto
 * @param target
 * @return java.util.List<T>
 * @author liuch
 * @description 根据关键字分页查询- 复合查询  must
 * @date 2022/4/2 17:15
 */
public List<T> queryMustByFiledsWithPage(ElasticsearchClient client, EsQueryDTO dto, List<Query> queries, Class<T> target) throws Exception {
    List<T> result = new ArrayList<>();
    List<SortOptions> sorts = new ArrayList<>();
    if (StringUtils.isNotBlank(dto.getOrder())) {
        SortOptions sortOptions = SortOptions.of(s -> s
                .field(f -> f.field(dto.getOrder()).order(SortOrder.valueOf(dto.getOrderType()))));
        sorts.add(sortOptions);
    }
    SearchResponse<HashMap> search = client.search(s -> s
                    .index(dto.getIndexName())
                    .query(q -> q.bool(b -> b.must(queries)))
                    .sort(sorts).from(dto.getFrom()).size(dto.getSize()),
            HashMap.class);
    return getResult(target, result, search);
}

/**
* @param client
* @param dto
* @param target
* @return java.util.List
* @author liuch
* @description 根据关键字分页查询- 复合查询 must 过滤
* @date 2022/4/2 17:15
*/
public List queryMustByFiledsWithPage(ElasticsearchClient client, EsQueryDTO dto, List queries, List filters, Class target) throws Exception {
List result = new ArrayList<>();
List sorts = new ArrayList<>();
if (StringUtils.isNotBlank(dto.getOrder())) {
SortOptions sortOptions = SortOptions.of(s -> s
.field(f -> f.field(dto.getOrder()).order(SortOrder.valueOf(dto.getOrderType()))));
sorts.add(sortOptions);
}
SearchResponse search = client.search(s -> s
.index(dto.getIndexName())
.query(q -> q.bool(b -> b.must(queries).filter(filters)))
.sort(sorts).from(dto.getFrom()).size(dto.getSize()),
HashMap.class);
return getResult(target, result, search);
}

/**
 * @param client
 * @param dto
 * @param target
 * @return java.util.List<T>
 * @author liuch
 * @description 根据关键字分页查询- 复合查询  should
 * @date 2022/4/2 17:15
 */
public List<T> queryShouldByFiledsWithPage(ElasticsearchClient client, EsQueryDTO dto, List<Query> queries, Class<T> target) throws Exception {
    List<T> result = new ArrayList<>();
    List<SortOptions> sorts = new ArrayList<>();
    if (StringUtils.isNotBlank(dto.getOrder())) {
        SortOptions sortOptions = SortOptions.of(s -> s
                .field(f -> f.field(dto.getOrder()).order(SortOrder.valueOf(dto.getOrderType()))));
        sorts.add(sortOptions);
    }
    SearchResponse<HashMap> search = client.search(s -> s
                    .index(dto.getIndexName())
                    .query(q -> q.bool(b -> b.should(queries)))
                    .sort(sorts).from(dto.getFrom()).size(dto.getSize()),
            HashMap.class);
    return getResult(target, result, search);
}

/**
 * 构件复合查询条件
 *
 * @param dto
 * @param queries
 */
private static void getFieldValues(EsQueryDTO dto, List<Query> queries) {
    List<FieldValue> fieldValues = new ArrayList<>();
    //根据关键字列表构件复合查询的值
    dto.getWords().stream().forEach(word -> fieldValues.add(FieldValue.of(word)));
    //查询条件列表
    queries.add(Query.of(q -> q.terms(t -> t.field(dto.getField()).terms(v -> v.value(fieldValues)))));
}


/**
 * @param
 * @param client
 * @param dto
 * @param target
 * @return java.lang.Object
 * @author liuch
 * @description 根据文档id查询
 * @date 2022/4/2 17:16
 */
public Object queryByDocumentId(ElasticsearchClient client, EsQueryDTO dto, Class<T> target) throws Exception {
    GetResponse<HashMap> getResponse = client.get(s -> s
                    .index(dto.getIndexName()).id(dto.getWord()),
            HashMap.class);
    getResponse.source();
    Map<String, Object> docMap = getResponse.source();
    String json = JSON.toJSONString(docMap);
    T obj = JSON.parseObject(json, target);
    return obj;
}

}


#### 2.4.4.基础操作接口



/**
 * 基础操作—接口
 */
public interface IElasticSearchIRepository<T, V> {

int delete(V id);

int update(T entity);

T getById(V id);

List<T> getAll();

long count();

PageInfo<T> getListByPage(int pageIndex, int pageSize);

/**
 * 新增一个文档
 *
 * @param entity 实体类
 * @return
 */
IndexResponse createByFluentDSL(T entity);

/**
 * 新增一个文档
 *
 * @param entity 实体类
 * @return
 */
IndexResponse createByBuilderPattern(T entity);

/**
 * 批量增加文档
 *
 * @param list 对象集合
 * @return 批量操作的结果
 */
BulkResponse bulkCreate(List<T> list);

/**
* 根据文档id查找文档,返回类型是ObjectNode
*
* @param id 文档id
* @return ObjectNode类型的查找结果
*/
ObjectNode getObjectNodeById(V id);

/**
 * 批量删除文档
 *
 * @param docIds  要删除的文档id集合
 * @return
 * @throws Exception
 */
BulkResponse bulkDeleteByIds(List<V> docIds);

/**
 * 根据文档id删除文档
 *
 * @param idxName 索引名
 * @param docId   文档id
 * @return Object类型的查找结果
 * @throws Exception
 */
Boolean deleteById(String idxName, String docId) throws IOException;


/**

* 新建索引,指定索引名称
     *
     */
    Boolean createIndex();

/**
     * 创建索引,指定索引名称和setting和mapping
     *
     * @param settingFn - 索引参数
     * @param mappingFn - 索引结构
     */
    Boolean createIndex(Function<IndexSettings.Builder, ObjectBuilder> settingFn,
                     Function<TypeMapping.Builder, ObjectBuilder> mappingFn);

/**
     * 删除索引
     * @throws IOException
     */
    Boolean deleteIndex();

/**
     * 修改索引字段信息

     * 字段可以新增,已有的字段只能修改字段的 search_analyzer 属性。
     *
     * @param propertyMap - 索引字段,每个字段都有自己的property
     * @throws IOException
     */
    Boolean updateIndexProperty(HashMap<String, Property> propertyMap);

/**
     * 查询索引列表
     *
     * @return
     * @throws IOException
     */
    GetIndexResponse getIndexList();

/**
     * 查询索引详情
     *
     * @return
     * @throws IOException
     */
    GetIndexResponse getIndexDetail();

/**
     * 检查指定名称的索引是否存在
     *
     * @return - true:存在
     * @throws IOException
     */
    boolean indexExists();

}


#### 2.4.5.基础操作接口实现类



public abstract class ElasticSearchIRepository<T,V> implements IElasticSearchIRepository<T,V> {

@Autowired(required =false)
@Qualifier("elasticsearchClient")
private ElasticsearchClient elasticsearchClient;

protected ElasticSearchDocument getEntityProperties() {
    Class<T> cls = getEntityClass();
    ElasticSearchDocument esDoc = cls.getAnnotation(ElasticSearchDocument .calss);
    return esDoc;
}

/**设置索引全局配置*/
protected abstract Function<IndexSettings.builder, ObjectBuilder<IndexSettings>> getIndexSettings();

/**手动设置映射(不手动设置会自动创建映射,同时在插入时若手动映射时没有的字段也会自动创建)*/
protected abstract Function<TypeMapping.builder, ObjectBuilder<TypeMapping>> getIndexMappings();

protected abstract Class<T> getEntityClass();


@Override
public int update(T entity) {
     try {
        ElasticSearchDocument doc = getEntityProperties();
        UpdateRequest updateRequest = new UpdateRequest.Builder()
                .index(doc.index())
                .id(entity.getId().toString())
                .doc(entity)
                .build();
        UpdateResponse updateResponse = elasticsearchClient.update(updateRequest, entity.getClass());
        return updateResponse != null && StringUtils.isNotEmpty(updateResponse.id()) ? 1 : 0;
     }
     catch (IOException e) {
        log.error(e);
     }
     return 0;
}

@Override
public PageInfo getListByPage(int pageIndex, int pageSize) {
List list = new ArrayList<>();
try {
ElasticSearchDocument doc = getEntityProperties();
ElasticClientUtils elasticClientUtils = new ElasticClientUtils();
EsQueryDTO dto = new EsQueryDTO();
dto.setIndex(paeIndex);
dto.setSize(pageSize);
dto.setIndexName(doc.index());
list = elasticClientUtils.queryPage(elasticsearchClient, dto, getEntityClass());
return new PageInde(pageIndex, pageSize, (long)list.size(), list);
}
catch (IOException e) {
log.error(e);
}
return new PageInde(pageIndex, pageSize, 0L, list);
}

@Override
public int delete(V id) {
try {
ElasticSearchDocument doc = getEntityProperties();
DeleteResponse delete = elasticsearchClient.delete(d -> d
.index(doc.index())
.id(id.toString()));
return delete.forcedRefresh() ? 1 : 0;
}
catch (IOException e) {
log.error(e);
}
return 0;
}

@Override
public List<T> getAll() {
     try {
        ElasticSearchDocument doc = getEntityProperties();
        ElasticClientUtils elasticClientUtils = new ElasticClientUtils();
        EsQueryDTO dto = new EsQueryDTO();
        dto.setIndexName(doc.index());
        return elasticClientUtils.queryAll(elasticsearchClient, dto, getEntityClass());
     }
     catch (IOException e) {
        log.error(e);
     }
     return null;
}

@Override
public long count() {
     try {
        ElasticSearchDocument doc = getEntityProperties();
        EsQueryDTO dto = new EsQueryDTO();
        dto.setIndexName(doc.index());
        return ElasticClientUtils.queryCountByFiled(elasticsearchClient, dto);
     }
     catch (IOException e) {
        log.error(e);
     }
     return 0;
}

@Override
public IndexResponse createByFluentDSL(T entity) {
    try {
        ElasticSearchDocument doc = getEntityProperties();
        IndexResponse response = elasticsearchClient.index(index -> idx
                 .index(doc.index())
                 .id(entity.getId().toString())
                 .document(entity));
        return response;
     }
     catch (IOException e) {
        log.error(e);
     }
     return null;
}

@Override
public IndexResponse createByBuilderPattern(T entity) {
    try {
        ElasticSearchDocument doc = getEntityProperties();
        IndexRequest.Builder<Object> indexReqBuilder = new IndexRequest.Builder<>();

        indexReqBuilder.index(doc.index());
        indexReqBuilder.id(entity.getId().toString());
        indexReqBuilder.document(entity);
        return elasticsearchClient.index(indexReqBuilder.build());
     }
     catch (IOException e) {
        log.error(e);
     }
     return null;
}

@Override
public BulkResponse bulkCreate(List<T> documents) {
    try {
        ElasticSearchDocument doc = getEntityProperties();
        BulkRequest.Builder br = new BulkRequest.Builder();
        documents.stream()
            .forEach(esDocument -> br
                    .operations(op -> op
                            .index(idx -> idx
                                    .index(doc.index())
                                    .id(esDocument.getId().toString())
                                    .document(esDocument))));

        return elasticsearchClient.bulk(br.build());
     }
     catch (IOException e) {
        log.error(e);
     }
     return null;
}

@Override
public T getById(V id) {
    try {
        ElasticSearchDocument doc = getEntityProperties();
        GetResponse<Object> response = elasticsearchClient.get(g -> g
                    .index(doc.index())
                    .id(id.toString()),
            Object.class);
    return response.found() ? FastJsonUtil.fromJson(response.source().toString(), getEntityClass()) : null;
     }
     catch (IOException e) {
        log.error(e);
     }
     return null;
}

@Override
public ObjectNode getObjectNodeById(V id) {
    try {
        ElasticSearchDocument doc = getEntityProperties();
        GetResponse<ObjectNode> response = elasticsearchClient.get(g -> g
                    .index(doc.index())
                    .id(id.toString()),
            ObjectNode.class);

    return response.found() ? response.source() : null;
     }
     catch (IOException e) {
        log.error(e);
     }
     return null;
}



@Override
public BulkResponse bulkDeleteByIds(List<V> docIds) {

    try {
        ElasticSearchDocument doc = getEntityProperties();
        BulkRequest.Builder br = new BulkRequest.Builder();

         // 将每一个对象都放入builder中
         docIds.stream().forEach(id -> br
            .operations(op -> op
                    .delete(d -> d
                            .index(doc.index())
                            .id(id.toString()))));

         return elasticsearchClient.bulk(br.build());
     }
     catch (IOException e) {
        log.error(e);
     }
     return null;
}

/*自动创建映射/
@Override
public Boolean createIndex() {
try {
ElasticSearchDocument doc = getEntityProperties();
CreateIndexResponse response = elasticsearchClient.indices().create(c -> c.index(doc.index()));
log.info(“createIndex方法,acknowledged={}”, response.acknowledged());
return response.acknowledged();
}
catch (IOException e) {
log.error(e);
}
return false;
}

/**手动创建映射*/
@Override
public Boolean createIndex(Function<IndexSettings.Builder, ObjectBuilder<IndexSettings>> settingFn,
                        Function<TypeMapping.Builder, ObjectBuilder<TypeMapping>> mappingFn) {

    try {
        ElasticSearchDocument doc = getEntityProperties();
        CreateIndexResponse response = elasticsearchClient
            .indices()
            .create(c -> c
                    .index(doc.index())
                    .settings(settingFn)
                    .mappings(mappingFn)
            );
    log.info("createIndex方法,acknowledged={}", response.acknowledged());
      return response.acknowledged();
     }
     catch (IOException e) {
        log.error(e);
     }
     return false;
    
}

@Override
public Boolean deleteIndex() {
    try {
        ElasticSearchDocument doc = getEntityProperties();
        DeleteIndexResponse response = elasticsearchClient.indices().delete(c -> c.index(doc.index()));
    log.info("deleteIndex方法,acknowledged={}", response.acknowledged());
    return response.acknowledged();
     }
     catch (IOException e) {
        log.error(e);
     }
     return false;
    
}

@Override
public Boolean updateIndexProperty(HashMap<String, Property> propertyMap) {
    try {
        ElasticSearchDocument doc = getEntityProperties();
        PutMappingResponse response = elasticsearchClient.indices()
            .putMapping(typeMappingBuilder ->
                    typeMappingBuilder
                            .index(doc.index())
                            .properties(propertyMap)
            );
    log.info("updateIndexMapping方法,acknowledged={}", response.acknowledged());
    return response.acknowledged();
     }
     catch (IOException e) {
        log.error(e);
     }
     return false;
}

@Override
public GetIndexResponse getIndexList() {
    try {
        ElasticSearchDocument doc = getEntityProperties();
        //使用 * 或者 _all都可以
    GetIndexResponse response = elasticsearchClient.indices().get(builder -> builder.index("_all"));
    log.info("getIndexList方法,response.result()={}", response.result().toString());
    return response;
     }
     catch (IOException e) {
        log.error(e);
     }
     return null;
}

@Override
public GetIndexResponse getIndexDetail() {
    try {
        ElasticSearchDocument doc = getEntityProperties();
        GetIndexResponse response = elasticsearchClient.indices().get(builder -> builder.index(doc.index()));
    log.info("getIndexDetail方法,response.result()={}", response.result().toString());
    return response;
     }
     catch (IOException e) {
        log.error(e);
     }
     return null;
    
}

@Override
public boolean indexExists() {
    try {
        ElasticSearchDocument doc = getEntityProperties();
        return elasticsearchClient.indices().exists(b -> b.index(doc.index())).value();
     }
     catch (IOException e) {
        log.error(e);
     }
     return null;
}  

}


### 2.5.业务


#### 2.5.1.接口



**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)**
![img](https://img-blog.csdnimg.cn/img_convert/446cb3b98373f534dd6bd40c254ebaba.jpeg)

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
n null;
        
    }

    @Override
    public boolean indexExists() {
        try {
            ElasticSearchDocument doc = getEntityProperties();
            return elasticsearchClient.indices().exists(b -> b.index(doc.index())).value();
         }
         catch (IOException e) {
            log.error(e);
         }
         return null;
    }  

}

2.5.业务

2.5.1.接口

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)
[外链图片转存中…(img-xclQlmUg-1713130485094)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值