Elasticsearch运用于实际的SpringBoot项目
2020-07-20 23:22
84 查看
一、SpringBoot整合Elasticsearch
1.spring boot 引入对应的依赖包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> <version>2.2.2.RELEASE</version> </dependency>
注意:这里的依赖包版本必须与es服务版本对应,比如,上述依赖包2.2.2.RELEASE就对应着elasticsearch-6.4.3。
2.在yml文件中配置相应的es服务信息
spring: data: elasticsearch: cluster-name: es6 cluster-nodes: 192.168.1.9:9300
3.常见错误解决
(1)如果出现如下错误
java.lang.IllegalStateException: availableProcessors is already set to [4], rejecting [4]
解决:
@Configuration public class ESConfig { /** * 解决由netty引起的问题 */ @PostConstruct void init() { System.setProperty("es.set.netty.runtime.available.processors", "false"); } }
二、Elasticsearch在SpringBoot中的应用
不建议通过ElasticsearchTemplate 在spring boot中对索引进行直接管理。有两个原因:第一,因为索引就相当于数据库表,在Java中我们是不会通过代码频繁的去建表、删表的。同理es也是一样;第二,通过Java建索引不够灵活,很多类型(FieldType)不能通过Java设置,并且主分片与副本分片不能通过Java来设置。
1.关于索引的操作
(1)索引的创建与更新
第一步:创建文档类
package imooc.es.pojo; import lombok.Getter; import lombok.Setter; import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; @Document(indexName = "stu",type = "_doc") @Data public class Stu { @Id private Long stuId; @Field(store = true) private String name; @Field(store = true) private Integer age; @Field(store = true) private Float money; @Field(store = true) private String sign; @Field(store = true) private String description; }
第二步:创建索引或更新索引
如果该文档记录在索引中存在,即更新,不存在则新增
package com.test; import imooc.Application; import imooc.es.pojo.Stu; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; import org.springframework.data.elasticsearch.core.query.IndexQuery; import org.springframework.data.elasticsearch.core.query.IndexQueryBuilder; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(classes = Application.class) public class ESTest { @Autowired private ElasticsearchTemplate esTemplate; @Test public void createIndexStu() { Stu stu = new Stu(); stu.setStuId(1002L); stu.setName("spider man"); stu.setAge(19); IndexQuery indexQuery = new IndexQueryBuilder().withObject(stu).build(); esTemplate.index(indexQuery); } }
(2)索引的删除
@Test public void deleteIndexStu() { esTemplate.deleteIndex(Stu.class); }
2.关于文档的操作
(1)文档更新
@Test public void updateStuDoc() { Map<String, Object> source = new HashMap<>(); source.put("money",66.8F); source.put("sign","i am nononono"); IndexRequest indexRequest = new IndexRequest(); indexRequest.source(source); UpdateQuery updateQuery = new UpdateQueryBuilder() .withClass(Stu.class) .withId("1002") .withIndexRequest(indexRequest) .build(); esTemplate.update(updateQuery); }
(2)文档查询
@Test public void queryStuDoc() { GetQuery getQuery = new GetQuery(); getQuery.setId("1002"); Stu stu = esTemplate.queryForObject(getQuery, Stu.class); System.out.println(stu); }
(3)文档删除
@Test public void deleteStuDoc() { String delete = esTemplate.delete(Stu.class, "1002"); System.out.println(delete); }
(4)文档分页搜索
@Test public void searchStuDocForPage() { Pageable pageable = PageRequest.of(0, 10); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.matchQuery("description", "super man")) .withPageable(pageable) .build(); AggregatedPage<Stu> stus = esTemplate.queryForPage(searchQuery, Stu.class); System.out.println(stus.getTotalPages()); System.out.println(stus.getContent()); }
(5)搜索内容高亮显示
@Test public void searchStuDocForHighLight() { String preTags = "<font color='red'>"; String postTags = "</font>"; Pageable pageable = PageRequest.of(0, 2); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.matchQuery("description", "man")) .withHighlightFields(new HighlightBuilder.Field("description").preTags(preTags).postTags(postTags)) .withPageable(pageable) .build(); AggregatedPage<Stu> stus = esTemplate.queryForPage(searchQuery, Stu.class, new SearchResultMapper() { @Override public <T> AggregatedPage<T> mapResults(SearchResponse searchResponse, Class<T> aClass, Pageable pageable) { SearchHits hits = searchResponse.getHits(); List<Stu> stuList = new ArrayList<>(); for (SearchHit searchHit : hits){ HighlightField highlightField = searchHit.getHighlightFields().get("description"); String description = highlightField.getFragments()[0].toString(); Object stuId = searchHit.getSourceAsMap().get("stuId"); searchHit.getSourceAsMap().get("name"); Integer age = (Integer) searchHit.getSourceAsMap().get("age"); Object money = searchHit.getSourceAsMap().get("money"); searchHit.getSourceAsMap().get("sign"); Stu stu = new Stu(); stu.setDescription(description); stu.setStuId(Long.valueOf(stuId.toString())); stu.setAge(age); stu.setMoney(Float.valueOf(money.toString())); stuList.add(stu); } if (stuList.size() > 0) { return new AggregatedPageImpl<>((List<T>)stuList); } return null; } }); System.out.println(stus.getTotalPages()); System.out.println(stus.getContent()); }
(6)搜索内容实现排序
@Test public void searchStuDocForSort() { String preTags = "<font color='red'>"; String postTags = "</font>"; Pageable pageable = PageRequest.of(0, 2); SortBuilder sortBuilder = new FieldSortBuilder("money"); sortBuilder.order(SortOrder.ASC); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.matchQuery("description", "man")) .withHighlightFields(new HighlightBuilder.Field("description").preTags(preTags).postTags(postTags)) .withSort(sortBuilder) .withPageable(pageable) .build(); AggregatedPage<Stu> stus = esTemplate.queryForPage(searchQuery, Stu.class); System.out.println(stus.getTotalPages()); System.out.println(stus.getContent()); }
相关文章推荐
- 项目实际运用中用到spring的什么功能?
- springboot实际项目:日志打印、表单验证、异常处理
- SpringBoot项目通过 spring data elasticsearch使用elasticsearch
- RabbitMQ在springboot项目中的应用(实际项目,测试可用)
- springBoot事件监听 在项目实际业务中的异步应用
- spring boot项目运用slf4j+logback记录项目日志
- springboot项目集成elasticsearch、包括增删改就部分分组、求和、求平均值等计算的用法
- 第二十二章:SpringBoot项目多模块运用与设计
- elasticsearch,spring boot,mybatis项目小结
- 手写springboot的自定义日志打印starter组件(实际springboot项目可直接引入使用)
- Spring定时实际项目运用
- SpringBoot 整合SpringBatch实际项目改造
- springboot 集成 elasticsearch(maven项目)
- springboot2.0+spring-data-elasticsearch+elasticsearch集成开发项目示例
- elasticsearch?idea中如何创建springbootelasticsearch项目?
- SpringBoot继承es跑起项目的时候报Consider defining a been named ‘elasticsearchTemplate’ in you configuration
- 运用springboot搭建并部署web项目的示例
- springboot+RabbitMQ做延迟消息详解(二)--插件延时,已运用到公司项目中
- spring boot项目,Elasticsearch的一种使用方式
- springboot+RabbitMQ做延迟消息详解(一)死信延迟,已运用到公司项目中