ElasticsearchTemplate替换为ElasticsearchRestTemplate(Transport Client替换为RestHighLevelClient)

news/2024/7/7 16:23:41

 

在Elasticsearch 8.0的版本中也将完全移除TransportClient,其次有些es有些账号不能通过 9300端口连接

所以项目中打算由RestHighLevelClient 替换掉 Transport Client

版本

这里给一张springboot官方的版本推荐

这里我的springboot版本为 2.1.6.RELEASE Elasticsearch 版本为 6.8.2

升级需要的maven依赖:

<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-elasticsearch</artifactId>
			<version>3.2.6.RELEASE</version>
		</dependency>

 

只需要这一个即可

配置

application.properties

# ip+端口
elasticSearch.host.port=localhost:9200
elasticSearch.user=elastic
elasticSearch.password=123456
# Socket连接超时时间
elasticSearch.socketTimeout = 60

ElasticConfig

@Configuration
public class ElasticConfig extends AbstractElasticsearchConfiguration {

    @Value("${elasticSearch.host.port}")
    private String hostAndPort;
    @Value("${elasticSearch.user}")
    private String user;
    @Value("${elasticSearch.password}")
    private String password;
    @Value("${elasticSearch.socketTimeout}")
    private long socketTimeout;

    @Override
    @Bean
    public RestHighLevelClient elasticsearchClient() {

        final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
                .connectedTo(hostAndPort)
                .withBasicAuth(user, password)
                .withSocketTimeout(Duration.ofSeconds(socketTimeout))
                .build();

        return RestClients.create(clientConfiguration).rest();
    }
	
	/*@Bean
    public RestHighLevelClient esRestClient(){
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("192.168.77.130", 9200, "http")));
        return  client;
    }*/
	
	

    @Bean
    public ElasticsearchRestTemplate restTemplate() throws Exception {
        return new ElasticsearchRestTemplate(elasticsearchClient());
    }


}

至此环境就搭建完成了,我们来看看具体的操作

删除索引


@Autowired
ElasticsearchRestTemplate restTemplate;

 public boolean deleteIndex(String indexName) throws Exception{
        GetIndexRequest request = new GetIndexRequest(indexName);
        boolean exists = restTemplate.getClient().indices().exists(request, RequestOptions.DEFAULT);
        if (exists) {
            log.info("索引存在");
            DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(indexName);
            AcknowledgedResponse deleteIndexResponse = restTemplate.getClient().indices()
                    .delete(deleteIndexRequest, RequestOptions.DEFAULT);

            if (deleteIndexResponse.isAcknowledged()) {
                log.info("删除成功");
            }
            return true;

        }
        return true;
    }

创建索引

    public boolean createIndex(String indexName, String mapping) throws Exception {
		//创建前先调用上面的删除索引方法
        deleteIndex(indexName);
        // 创建索引
        CreateIndexRequest createIndexRequest = new CreateIndexRequest(indexName);
        createIndexRequest.settings(Settings.builder()
                .put("index.number_of_shards", 1)//指定shards
                .put("index.number_of_replicas", 0))//指定replicas
                .mapping(mapping, XContentType.JSON);//指定mapping
        CreateIndexResponse createIndexResponse = restTemplate.getClient().indices()
                .create(createIndexRequest, RequestOptions.DEFAULT);
        if (createIndexResponse.isAcknowledged()) {
            log.info("索引创建成功");
            return true;
        }

        return false;


    }

批量插入数据

public <T> int documents(List<DscStandardProduct> list){
         if (CollectionUtils.isEmpty(list)) {
            return 0;
        }
        DscStandardProduct t = list.get(0);
        Document document = t.getClass().getAnnotation(Document.class);
        BulkRequest request = new BulkRequest();
        List<IndexQuery> queries = list.stream().map(item->{
            item.getOtherSpec();
            IndexQuery query = new IndexQuery();
            query.setIndexName(document.indexName());
            query.setType(document.type());
            query.setSource(JSON.toJSONString(item));
            return query;
        }).collect(Collectors.toList());

        restTemplate.bulkIndex(queries);
        return list.size();
    }

这里给出类 DscStandardProduct的注解信息

简单的查询

基本还是和原来 ElasticsearchTemplate 类似

public void query(){
		Drug drug = new Drug(name, company, approval, spec);
        SearchQuery query = getQuery(drug, true);
        PageRequest request = PageRequest.of(0,1);
        query.setPageable(request);
        List<DscStandardProduct> list = restTemplate.queryForList(query, DscStandardProduct.class);

}



private SearchQuery getQuery(Drug drug, Boolean specFlag) {

        BoolQueryBuilder builder = QueryBuilders.boolQuery();
        BoolQueryBuilder nameMatch = QueryBuilders.boolQuery().minimumShouldMatch(1)
                .should(QueryBuilders.matchQuery("drugName",drug.getName()))
                .should(QueryBuilders.matchQuery("productName",drug.getName()));



        BoolQueryBuilder must = QueryBuilders.boolQuery().minimumShouldMatch(2)
                .should(nameMatch)
                .should(QueryBuilders.matchQuery("company", drug.getCompany()))
                .should(QueryBuilders.matchQuery("approvalIndex", drug.getApproval()));


        builder.must(must);
        if (specFlag) {
            BoolQueryBuilder specMatch = QueryBuilders.boolQuery().minimumShouldMatch(1)
                    .should(QueryBuilders.matchQuery("specIndex",drug.getSpec()))
                    .should(QueryBuilders.matchQuery("otherSpec",drug.getSpec()));
            builder.must(specMatch);
            builder.should(QueryBuilders.termQuery("specIndex.full", drug.getSpec()))
                    .should(QueryBuilders.termQuery("otherSpec.full", drug.getSpec()));
        }


        return new NativeSearchQuery(builder);

    }

更多

更多操作请参考
https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#preface.versions
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/6.8/java-rest-high-search.html


http://www.niftyadmin.cn/n/4054444.html

相关文章

ruby编码说明

程序编码一般分几种情况&#xff1a; 1、源码文件编码 2、接收外部内容的编码 3、运行环境编码 4、操作系统编码 首先源码文件的编码&#xff0c;可以通过在ruby文件的头部添加一行申明即可&#xff0c;这样所有在源码里面出现的字符都保存为指定的编码&#xff1a; # -*- codi…

left join注意事项

一、【问题描述】 客户表&#xff08;CLT.CSM_BASEINFO&#xff09;左连接证件信息表&#xff08;CLT.CSM_CERTINFO&#xff09;&#xff0c;通过客户名称查询客户信息。 1&#xff09;证件信息表的字段筛选条件&#xff0c;放到on后面&#xff0c;查询结果正常 SELECT clt…

JDK8给Tomcat配置https

第一步&#xff1a;生成秘钥库 采用JDK自带的keytool工具生成秘钥 别名 xieh1234 存储路径 D:\cas\keystore\ keytool -genkey -v -alias xieh1234 -keyalg RSA -keystore D:\cas\keystore\xieh1234.keystore -alias 表示证书的别名&#xff0c;一个keystore文件中可以存放多…

笔记本插拔电源黑屏一下

亲爱的朋友你是否有这样的痛苦呢?当你的笔记本插上电源,屏幕要黑一下;当你拔掉电源时屏幕还是要黑一下。下面我就以Thinkpad E550电脑,win10系统为例和大家分享一下我的解决办法。 之所以会出现如上现状,是因为电脑插上电源和拔掉电源的刷屏率设置不相同。在桌面单击"右击…

编程游戏网站

http://www.imooc.com/article/14793转载于:https://blog.51cto.com/11283249/1950174

阿里云数加合作伙伴-袋鼠云获A轮融资,成立一年半获三轮投资超亿元

创投市场再次风起。2017年7月&#xff0c;袋鼠云宣布&#xff0c;获得来自戈壁创投主投、元璟资本跟投的A轮融资&#xff0c;相对于当前冷淡的投资市场&#xff0c;此举也再次引发了行业对大数据、云计算技术创新企业的关注。据袋鼠云CEO陈吉平&#xff08;花名&#xff1a;拖雷…

Adam:大规模分布式机器学习框架

引子 转载请注明&#xff1a;http://blog.csdn.net/stdcoutzyx/article/details/46676515 又是好久没写博客&#xff0c;记得有一次看Ng大神的訪谈录&#xff0c;假设每周读三篇论文&#xff0c;那么经年以后&#xff0c;必定成为对某个领域非常熟悉的人。 可惜&#xff0c;在忙…

arduino uno r3 静态控制四位共阳数码管(笔记)

2019独角兽企业重金招聘Python工程师标准>>> 最近在玩arduino的板子&#xff0c;玩到静态控制四位数码管遇到了障碍&#xff0c;搞了一下午才弄明白&#xff0c;写个笔记玩玩&#xff1a; 首先需要&#xff1a;&#xff08;1&#xff09;arduino uno r3 &#xff08…