首页 > 编程语言 >SpringBoot2.x 版本集成elasticsearch 8.x(基于elasticsearch-java)

SpringBoot2.x 版本集成elasticsearch 8.x(基于elasticsearch-java)

时间:2024-10-12 16:48:59浏览次数:7  
标签:boolQueryBuilder java builder field json elasticsearch new SpringBoot2

  上次elasticsearch到8.13.3之后,由于springboot版本2.4.13,jdk版本是11,使用springboot内置的ElasticsearchRestTemplate查询的时候做了兼容性之后虽然代码没有报错了,但是每次查询都会有一个警告[WRAN],如果查询比较频繁的时候日志里面看到的全都是这种警告信息:[ignore_throttled] parameter is deprecated because frozen indices have been deprecated. Consider cold or frozen tiers in place of frozen indices. 这个警告是什么意思呢?翻译过来就是:[ignore_throttled]参数已被弃用,因为冻结索引已被弃用。考虑用冷层或冻结层代替冻结指数。[ignore_throttled]参数已被弃用 应该是版本的问题,在java中经常会有某个参数在高版本中被废弃使用了。之前我们做的兼容性也没有很好的把各种情况都考虑到,所以我们只有升级客户端了。因为elasticsearch是8.x的,所以在springboot官网也没有找到对应的api版本,并且通过elasticsearch的官网得知,在7.x之后就不在推荐RestHighLevelClient客户端了,用过这个api的人都知道它不管是操作数据还是查询都非常的方便,现在被启用之后,我们也就只有使用Elasticsearch Java API Client了,完整的相关maven jar包如下:

<dependency>
    <groupId>co.elastic.clients</groupId>
    <artifactId>elasticsearch-java</artifactId>
    <version>8.13.3</version>
    <exclusions>
        <exclusion>
            <artifactId>jakarta.json-api</artifactId>
            <groupId>jakarta.json</groupId>
        </exclusion>
        <exclusion>
            <artifactId>elasticsearch-rest-client</artifactId>
            <groupId>org.elasticsearch.client</groupId>
        </exclusion>

    </exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/org.elasticsearch.client/elasticsearch-rest-client -->
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-client</artifactId>
    <version>8.13.3</version>7
</dependency>

<dependency>
    <groupId>jakarta.json</groupId>
    <artifactId>jakarta.json-api</artifactId>
    <version>2.1.2</version>
</dependency>
<dependency>
    <groupId>jakarta.json.bind</groupId>
    <artifactId>jakarta.json.bind-api</artifactId>
    <version>3.0.0</version>
</dependency>

  这里需要注意的是elasticsearch-java的版本号最好是和你的es服务端版本号一致,另外就是要注意rest-client和json的版本号,如果不排除,则默认使用的是springboot里面的,所以这里需要先排除,在重新引用,如果重新应用了还是使用的是sprinboot的内置版本,就需要pom强制修改依赖版了。

<properties>
    <jakarta-json.version>2.1.2</jakarta-json.version>
    <elasticsearch.version>8.13.3</elasticsearch.version>
</properties>

  然后我们再来创建elasticsearch的连接客户端,查询了。

public static void main( String[] args) throws IOException {
    // ES用户名和密码
    String username = "elastic";
    String password = "******";
    BasicCredentialsProvider credsProv = new BasicCredentialsProvider();
    credsProv.setCredentials(
            AuthScope.ANY, new UsernamePasswordCredentials(username, password)
    );
    RestClient restClient = RestClient
            .builder(getHttpHosts())
            .setHttpClientConfigCallback(hc ->
                    hc.setDefaultCredentialsProvider(credsProv)
                            .setKeepAliveStrategy(getConnectionKeepAliveStrategy())
                            .setMaxConnPerRoute(10)
                            .setDefaultIOReactorConfig(IOReactorConfig.custom().setIoThreadCount(1).build())
            )
            .setRequestConfigCallback(requestConfigBuilder ->
                    requestConfigBuilder.setConnectTimeout(1000) //time until a connection with the server is established.
                            .setSocketTimeout(12 * 1000) //time of inactivity to wait for packets[data] to receive.
                            .setConnectionRequestTimeout(2 * 1000)
            ).build();
    ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
    ElasticsearchClient elasticsearchClient = new ElasticsearchClient(transport);

    List<String> gid = new ArrayList<>();
    gid.add("123");//
    gid.add("345");//

    SearchRequest.Builder builder = new SearchRequest.Builder();
    builder.index("es_index_v1");
    BoolQuery.Builder boolQueryBuilder = QueryBuilders.bool();
    //精确查询
    if(true) {
        Query byName = TermQuery.of(m -> m
                .field("goods_name_cms")
                .value("通用商品")
        )._toQuery();
        boolQueryBuilder.must(byName);
    }
    //模糊查询
    if(false){
        boolQueryBuilder.must(query -> query.wildcard(f -> f.field("goods_name_cms").value("*水杯*")));
        Query q = WildcardQuery.of(t->t.field("goods_name_cms").value("*水杯*"))._toQuery();
        boolQueryBuilder.must(q);
    }
    //多文字匹配
    if(false) {
        TermsQuery bySkuIds = TermsQuery.of(t -> t
                .field("goods_id")
                .terms(t2 -> t2
                        .value(gid.stream().map(FieldValue::of).collect(Collectors.toList())))
        );
        boolQueryBuilder.must(bySkuIds._toQuery());
    }
    builder.from(1);
    builder.size(10);
    builder.sort(t->t.field(tt->tt.field("goods_id").order(SortOrder.Desc)));

    BoolQuery boolQuery = boolQueryBuilder.build();
    SearchRequest searchRequest = new SearchRequest.Builder()
            .index("es_good_info_v1_3")
            .query(q -> q.bool(boolQuery))
            .build();


    SearchResponse<EsPhpGoodsIndex> search =
            elasticsearchClient.search(
                    searchRequest,
                    EsPhpGoodsIndex.class
            );
    for (Hit<EsPhpGoodsIndex> hit: search.hits().hits()) {
        EsPhpGoodsIndex pd = hit.source();
        System.out.println(pd);
    }
}

private static HttpHost[] getHttpHosts() {
    List<String> clusterNodes = new ArrayList<>();
    clusterNodes.add("172.0.0.1:9200");
    HttpHost[] httpHosts = new HttpHost[clusterNodes.size()];
    for (int i = 0; i < clusterNodes.size(); i++) {
        String[] node = clusterNodes.get(i).split(":");
        httpHosts[i] = new HttpHost(node[0], Convert.toInt(node[1]), "http");
    }
    return httpHosts;
}

private static ConnectionKeepAliveStrategy getConnectionKeepAliveStrategy() {
    return (response, context) -> 2 * 60 * 1000;
}

 

 

标签:boolQueryBuilder,java,builder,field,json,elasticsearch,new,SpringBoot2
From: https://www.cnblogs.com/yangkangIT/p/18460866

相关文章

  • javase基础(自用)
    常用的dos命令#查看当前目录下的所有文件dir#切换目录cdchangedirectorycd..#清理屏幕cls(clearscreen)#退出终端exit#查看电脑IPipconfg#打开应用 calc mspaint notepad#ping命令 pingwww.baidu.com #文件操作 md目录名 rd目录名 cd>文件名 de......
  • java获取当前时间(年月日)
     转自:https://blog.csdn.net/lynn_Kun/article/details/76997856 在java程序中常常需要获取的时间和设置时间的格式1、获取当前的时间Datedate=newDate();//此时date为当前的时间2、设置时间的格式Datedate=newDate();//此时date为当前的时间System.out.println(date);......
  • java.lang.UnsupportedOperationException: null
    问题描述:在Java中,当你遇到 java.lang.UnsupportedOperationException 这个异常时,通常意味着你尝试在一个不支持该操作的集合上执行了一个操作。在这个具体的例子中,问题很可能出在 toList() 方法的使用上,以及后续对列表的修改。List<Long>ids=dtos.stream(......
  • 前后端分离nodejs_vue+javascript个人身体健康档案管理系统
    目录技术栈具体实现截图开发工具和技术简介错误处理和异常处理nodejs类核心代码部分展示解决的思路其他题目推荐源码获取/联系我技术栈该系统将采用B/S结构模式,开发软件有很多种可以用,本次开发用到的软件是vscode,用到的数据库是MySQL,为了更加便捷地使用数据库,用到了......
  • JavaScript原型链污染漏洞分析
    原型链污染漏洞CVE:1、yargs-Parser输入验证错误漏洞(CVE-2020-7608)2、tough-cookie安全漏洞(CVE-2023-26136)3、JSON5原型污染漏洞(CVE-2022-46175) 漏洞描述:1、yargs-Parser输入验证错误漏洞(CVE-2020-7608):yargs-parser是一款选项解析器。yargs-parser13.1.2之前......
  • java 网络知识 + 多线程问题
    服务器:packagep1007;importjava.io.*;importjava.net.*;importjava.util.Random;publicclassServer{publicstaticvoidmain(String[]args){intport=12345;//服务端口try(ServerSocketserverSocket=newServerSocket(port)......
  • java 文件的建立,文件夹的建立, 删除
    importjava.io.File;importjava.io.IOException;publicclassFileTest{publicstaticvoidmain(String[]args)throwsIOException{//请在Begin-End间编写完整代码/**********Begin**********///创建目录Filefile=n......
  • JavaScript
    什么是JavaScript?Web标准也称为网页标准,由一系列的标准组成,大部分由W3C(WorldWideWebConsortium,万维网联盟)负责制定。三个组成部分:HTML:负责网页的基本结构(页面元素和内容)。CSS:负责网页的表现效果(页面元素的外观、位置等页面样式,如:颜色、大小等)。JavaScript:负责网页的......
  • PTA 作业六 JAVA 面向对象程序设计6-2 sdut-oop-list-1 学生集合(类、集合)作者 周雪芹
    6-2sdut-oop-list-1学生集合(类、集合)分数15作者 周雪芹单位 山东理工大学以下程序不完整,请你根据已经给出的程序代码中表达的题意,以及程序的输入、输出信息,完成Student类的设计,补全代码。函数接口定义:classStudent{}裁判测试程序样例:importjava.util.ArrayLi......
  • 大学生HTML期末大作业——HTML+CSS+JavaScript购物商城(篮球)
    HTML+CSS+JS【购物商城】网页设计期末课程大作业web前端开发技术web课程设计网页规划与设计......