文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringBoot框架如何集成ElasticSearch

2023-06-25 12:28

关注

这篇文章主要为大家展示了“SpringBoot框架如何集成ElasticSearch”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SpringBoot框架如何集成ElasticSearch”这篇文章吧。

依赖

SpringBoot版本:2.4.2

 <dependencies>        <!--lombok-->        <dependency>            <groupId>org.projectlombok</groupId>            <artifactId>lombok</artifactId>            <optional>true</optional>        </dependency>  <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-devtools</artifactId>            <optional>true</optional>            <scope>true</scope>        </dependency>        <dependency>            <groupId>com.alibaba</groupId>            <artifactId>fastjson</artifactId>            <version>1.2.47</version>        </dependency>    </dependencies>    <dependencyManagement>        <dependencies>            <dependency>                <groupId>org.springframework.cloud</groupId>                <artifactId>spring-cloud-dependencies</artifactId>                <version>2020.0.1</version>                <type>pom</type>                <scope>import</scope>            </dependency>            <dependency>                <groupId>com.alibaba.cloud</groupId>                <artifactId>spring-cloud-alibaba-dependencies</artifactId>                <version>2021.1</version>                <type>pom</type>                <scope>import</scope>            </dependency>        </dependencies>    </dependencyManagement>

先了解一下curl方式操作es

SpringBoot框架如何集成ElasticSearch

与SpringBoot集成

配置类

import org.elasticsearch.client.RestHighLevelClient;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.elasticsearch.client.ClientConfiguration;import org.springframework.data.elasticsearch.client.RestClients;import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration;@Configurationpublic class ElasticsearchConfig extends AbstractElasticsearchConfiguration {    @Override    @Bean    public RestHighLevelClient elasticsearchClient() {        final ClientConfiguration clientConfiguration = ClientConfiguration.builder()                .connectedTo("localhost:9200")                .build();        return RestClients.create(clientConfiguration).rest();    }}

实体类

import lombok.Data;import org.springframework.data.annotation.Id;import org.springframework.data.elasticsearch.annotations.Document;import org.springframework.data.elasticsearch.annotations.Field;import org.springframework.data.elasticsearch.annotations.FieldType;@Data@Document(indexName = "product", shards = 3, replicas = 1)public class Product {    //必须有 id,这里的 id 是全局唯一的标识,等同于 es 中的"_id"    @Id    private Long id;//商品唯一标识        @Field(type = FieldType.Text, analyzer = "ik_max_word")    private String title;//商品名称    @Field(type = FieldType.Keyword)    private String category;//分类名称    @Field(type = FieldType.Double)    private Double price;//商品价格    @Field(type = FieldType.Keyword, index = false)    private String images;//图片地址}

测试例子

 

@RestController@RequestMappingpublic class TestESController {    @Autowired    private ElasticsearchRestTemplate elasticsearchRestTemplate;    @Resource    ProductMapper productMapper;    @GetMapping    public void createIndex() {        //创建索引,系统初始化会自动创建索引        System.out.println("创建索引");    }    @DeleteMapping    public void deleteIndex() {        //创建索引,系统初始化会自动创建索引        boolean flg = elasticsearchRestTemplate.deleteIndex(Product.class);        System.out.println("删除索引 = " + flg);    }    @PostMapping    public void save(){        Product product = new Product();        product.setId(1L);        product.setTitle("华为手机");        product.setCategory("手机");        product.setPrice(2999.0);        product.setImages("http://www.atguigu/hw.jpg");        productMapper.save(product);    }    @PutMapping    public void update(){        Product product = new Product();        product.setId(1L);        product.setTitle("小米 2 手机");        product.setCategory("手机");        product.setPrice(9999.0);        product.setImages("http://www.atguigu/xm.jpg");        productMapper.save(product);    }    @GetMapping("/findById")    public void findById(){        Product product = productMapper.findById(1L).get();        System.out.println(product);    }    @GetMapping("/findAll")    public void findAll(){        Iterable<Product> products = productMapper.findAll();        for (Product product : products) {            System.out.println(product);        }    }    //删除    @DeleteMapping("/delDocument")    public void delete(){        Product product = new Product();        product.setId(1L);        productMapper.delete(product);    }    //批量新增    @PostMapping("/addBatch")    public void saveAll(){        List<Product> productList = new ArrayList<>();        for (int i = 0; i < 10; i++) {            Product product = new Product();            product.setId(Long.valueOf(i));            product.setTitle("["+i+"]小米手机");            product.setCategory("手机");            product.setPrice(1999.0+i);            product.setImages("http://www.atguigu/xm.jpg");            productList.add(product);        }        productMapper.saveAll(productList);    }    //分页查询    @GetMapping("/findByPageable")    public void findByPageable(){        //设置排序(排序方式,正序还是倒序,排序的 id)        Sort sort = Sort.by(Sort.Direction.DESC,"id");        int currentPage=0;//当前页,第一页从 0 开始, 1 表示第二页        int pageSize = 5;//每页显示多少条        //设置查询分页        PageRequest pageRequest = PageRequest.of(currentPage, pageSize,sort);        //分页查询        Page<Product> productPage = productMapper.findAll(pageRequest);        for (Product Product : productPage.getContent()) {            System.out.println(Product);        }    }}

RestHighLevelClient直接操作

这些操作,就是javaApi,和上图中,通过http方式和es交互式类似的

索引操作

@Slf4jpublic class ESIndexTestCase {    public static void main(String[] args) throws IOException {        // 创建客户端        RestHighLevelClient esClient = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200)));        // 创建索引        // CreateIndexRequest indexRequest = new CreateIndexRequest("book");        // CreateIndexResponse indexResponse = esClient.indices().create(indexRequest, RequestOptions.DEFAULT);        // boolean acknowledged = indexResponse.isAcknowledged();        // log.error("响应{}",acknowledged);        // 查询索引        // GetIndexRequest getIndexRequest = new GetIndexRequest("book");        // GetIndexResponse getIndexResponse = esClient.indices().get(getIndexRequest, RequestOptions.DEFAULT);        // log.info("getAliases:{}",getIndexResponse.getAliases());        // log.info("getMappings:{}",getIndexResponse.getMappings());        // log.info("getSettings:{}",getIndexResponse.getSettings());        // 删除索引        AcknowledgedResponse deleteRes = esClient.indices().delete(new DeleteIndexRequest("book"), RequestOptions.DEFAULT);        boolean delAck = deleteRes.isAcknowledged();        log.error("delAck:{}",delAck);        esClient.close();    }}

文档操作

@Slf4jpublic class ESDocmentTestCase {    public static void main(String[] args) throws IOException {        // 创建客户端        RestHighLevelClient esClient = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200)));        // 新增文档        // IndexRequest indexRequest = new IndexRequest("user");        // indexRequest.id("1001");               // // 准备文档        // User user = new User();        // user.setName("张三");        // user.setAge(22);        // user.setSex("男");                // String userJson = JSONObject.toJSONString(user);        // indexRequest.source(userJson, XContentType.JSON);        // IndexResponse indexResponse = esClient.index(indexRequest, RequestOptions.DEFAULT);        // log.error("getResult:==========>:{}",indexResponse.getResult());        // 批量新增文档        BulkRequest bulkRequest = new BulkRequest();        bulkRequest.add(new IndexRequest("user").id("2001").source(XContentType.JSON,"name","张三","age","40","sex","男"));        bulkRequest.add(new IndexRequest("user").id("2002").source(XContentType.JSON,"name","222","age","10","sex","女"));        bulkRequest.add(new IndexRequest("user").id("2003").source(XContentType.JSON,"name","33333","age","20","sex","男"));        bulkRequest.add(new IndexRequest("user").id("2004").source(XContentType.JSON,"name","111","age","30","sex","男"));        bulkRequest.add(new IndexRequest("user").id("2005").source(XContentType.JSON,"name","2222","age","31","sex","女"));        BulkResponse bulkResponse = esClient.bulk(bulkRequest, RequestOptions.DEFAULT);        log.error("getResult:==========>:{}",bulkResponse.getTook());        // 更新文档(全量更新,局部更新)        // UpdateRequest updateRequest = new UpdateRequest("user", "1001");        // updateRequest.doc("sex","dddddd");        // UpdateResponse updateResponse = esClient.update(updateRequest, RequestOptions.DEFAULT);        // log.error("getResult:==========>:{}",updateResponse.getResult());        // 根据_id查询文档        // GetRequest getRequest = new GetRequest("user", "1001");        // GetResponse getResponse = esClient.get(getRequest, RequestOptions.DEFAULT);        // log.error("getResult:==========>:{}",getResponse.getSource());        // 根据_id 删除数据        // DeleteRequest deleteRequest = new DeleteRequest("user", "1001");        // DeleteResponse deleteResponse = esClient.delete(deleteRequest, RequestOptions.DEFAULT);        // log.error("getResult:==========>:{}",deleteResponse.getResult());        // 批量删除(和批量新增类似)        esClient.close();    }}

检索操作

@Slf4jpublic class EsSearchTest {    public static void main(String[] args) throws IOException {        // 创建客户端        RestHighLevelClient esClient = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200)));        // 查询所有        // SearchRequest searchRequest = new SearchRequest("user");        // SearchSourceBuilder queryBuilder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());        // queryBuilder.from(0);        // queryBuilder.size(4);        // queryaBuilder.sort("age", SortOrder.DESC);        // SearchRequest sourceRequest = searchRequest.source(queryBuilder);        // SearchResponse searchResponse = esClient.search(sourceRequest, RequestOptions.DEFAULT);        // log.error("getHits:======>{}", searchResponse.getHits().getTotalHits());        // searchResponse.getHits().forEach(hit -> System.out.println(hit.getSourceAsString()));        // 2-组合查询        // SearchRequest searchRequest = new SearchRequest("user");        // BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();        // // 这里就是组合条件。和mysql where 组合类似        // boolQueryBuilder.should(QueryBuilders.matchQuery("age","30"));        // boolQueryBuilder.should(QueryBuilders.matchQuery("age","40"));        // SearchSourceBuilder sourceBuilder = new SearchSourceBuilder().query(boolQueryBuilder);        // searchRequest.source(sourceBuilder);        // SearchResponse searchResponse = esClient.search(searchRequest, RequestOptions.DEFAULT);        // searchResponse.getHits().forEach(hit -> System.err.println(hit.getSourceAsString()));        // 3-范围查询        // SearchRequest searchRequest = new SearchRequest("user");        // SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();        // RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("age");        // rangeQuery.gte("30");        // sourceBuilder.query(rangeQuery);        // searchRequest.source(sourceBuilder);        // SearchResponse searchResponse = esClient.search(searchRequest, RequestOptions.DEFAULT);        // searchResponse.getHits().forEach(hit -> System.out.println(hit.getSourceAsString()));        //4-模糊查询+高亮        SearchRequest searchRequest = new SearchRequest("user");        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();        FuzzyQueryBuilder fuzzyQuery = QueryBuilders.fuzzyQuery("name", "张三");        sourceBuilder.query(fuzzyQuery);        HighlightBuilder highlightBuilder = new HighlightBuilder();        highlightBuilder.preTags("<font color='red'>");        highlightBuilder.postTags("</font>");        highlightBuilder.field("name");        sourceBuilder.highlighter(highlightBuilder);        searchRequest.source(sourceBuilder);        SearchResponse searchResponse = esClient.search(searchRequest, RequestOptions.DEFAULT);        searchResponse.getHits().forEach(System.out::println);        // 5-聚合查询        esClient.close();    }}

以上是“SpringBoot框架如何集成ElasticSearch”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯