springboot2.x集成Elasticsearch7.7.0

一、前言

elasticsearch安装就不做过多介绍了,网上一搜一大堆;最需要注意的就是Elasticsearch与spring版本,防止版本不兼容导致的后续的一系列问题。我这里springboot+spring-data-elasticsearch,他们的版本对照关系可以参照spring-data-elasticsearch官网版本对照
在这里插入图片描述

二、jar依赖及配置

  • pom.xml
<!--springboot版本-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
  <version>2.5.12</version>
</dependency>
<!--spring-data-elasticsearch版本-->
<dependency>
  <groupId>org.springframework.data</groupId>
  <artifactId>spring-data-elasticsearch</artifactId>
  <version>4.2.10</version>
</dependency>
  • application.yml
spring:
  elasticsearch:
    rest:
      uris: **
      username: **
      password: **

三、代码实现

3.1 实体类

@Document:对应一个文档记录
indexName:指定索引名称
@Id:用来将对象中id和ES中_id映射
@Field:用来指定ES中的字段对应Mapping
type:用来指定ES中存储类型
analyzer:用来指定使用哪种分词器

@Data
@Document(indexName = "user")
public class User {
    @Id
    private String id;
    @Field(type = FieldType.Text, analyzer = "ik_max_word")
    private String name;
    @Field(type = FieldType.Date)
    private Date bir;
	@Field(type = FieldType.Text,analyzer = "ik_max_word")
    private String content;
}

3.2 业务代码

@Service
public class EsService {
    @Autowired
    private ElasticsearchRestTemplate restTemplate;

    /**
     * 初始化es序列
     */
    public boolean initIndex() {
        IndexOperations indexOperations = restTemplate.indexOps(User.class);
        if (!indexOperations.exists()) {
            indexOperations.create();
            Document mapping = indexOperations.createMapping();
            indexOperations.putMapping(mapping);
            return true;
        }
        return false;
    }

    /**
     * 初始化es数据
     *
     */
    public void initEsData() {
        // 查询用户叔叔
        List<User> list = 查询数据
        restTemplate.save(list);
    }

    /**
     * 分页查询数据
     *
     * @param keyword
     * @param pageNo
     * @param pageSize
     * @throws IOException
     */
    public PageInfo<User> search(String keyword, Integer pageNo, Integer pageSize) throws IOException {
        PageInfo<User> pageInfo = new PageInfo<>();
        if (pageNo <= 0) {
            pageNo = 1;
        }
        if (pageSize <= 0) {
            pageSize = 10;
        }
        pageInfo.setPageNo(pageNo);
        pageInfo.setPageSize(pageSize);
        // 分页数据
        PageRequest pageRequest = PageRequest.of(pageNo - 1, pageSize, Sort.Direction.DESC, "bir");
        // 高亮字段
        HighlightBuilder highlightBuilder = new HighlightBuilder().field("*")
                .requireFieldMatch(false)
                .fragmentSize(30)
                .preTags("<span style='color:#799ed9'>")
                .postTags("</span>");
        // 查询条件
        QueryStringQueryBuilder queryBuilder = null;
        if (StringUtils.isNotBlank(keyword)) {
            keyword = QueryParser.escape(keyword);
            keyword = "\"" + keyword + "\"";
            queryBuilder = QueryBuilders.queryStringQuery(keyword)
                    .field("name").field("content")
                    .analyzer("ik_max_word");
        }
        NativeSearchQuery query = new NativeSearchQueryBuilder().withQuery(queryBuilder)
                .withPageable(pageRequest)
                .withHighlightBuilder(highlightBuilder)
                .build();
        SearchHits<User> searchHits = restTemplate.search(query, User.class);

        long totalHits = searchHits.getTotalHits();
        if (totalHits <= 0) {
            return pageInfo;
        }
        pageInfo.setCount(totalHits);
        List<User> list = new ArrayList<>();
        // 设置高亮数据
        for (SearchHit<User> hit : searchHits.getSearchHits()) {
            User content = hit.getContent();
            JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(content));
            Map<String, List<String>> highlightFields = hit.getHighlightFields();
            if (highlightFields.isEmpty()) {
                list.add(content);
                continue;
            }
            for (Map.Entry<String, List<String>> entry : highlightFields.entrySet()) {
                StringBuffer stringBuffer = new StringBuffer();
                for (int i = 0; i < entry.getValue().size(); i++) {
                    if (i > 0) {
                        stringBuffer.append(",");
                    }
                    stringBuffer.append(entry.getValue().get(i));
                }
                jsonObject.put(entry.getKey(), stringBuffer.toString());
            }
            content = JSONObject.parseObject(jsonObject.toJSONString(), User.class);
            list.add(content);
        }
        pageInfo.setList(list);
        return pageInfo;
    }
}
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Spring Boot 2.6.x中,可以使用Spring Data Elasticsearch整合Elasticsearch。Spring Data Elasticsearch提供了一组用于构建Elasticsearch应用程序的API,并且可以轻松地与Spring Boot集成。下面是整合步骤: 1. 添加Spring Data Elasticsearch依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> ``` 2. 配置Elasticsearch连接信息: 在application.properties中添加以下配置: ``` spring.data.elasticsearch.cluster-name=elasticsearch spring.data.elasticsearch.cluster-nodes=localhost:9300 ``` 其中,cluster-name为Elasticsearch集群名称,cluster-nodes为Elasticsearch节点地址。 3. 创建Elasticsearch实体类: ``` @Document(indexName = "user", type = "_doc") public class User { @Id private String id; private String name; private int age; // getters and setters } ``` 其中,@Document注解用于指定索引名称和类型,@Id注解用于指定文档ID。 4. 创建Elasticsearch仓库类: ``` @Repository public interface UserRepository extends ElasticsearchRepository<User, String> { } ``` 其中,UserRepository继承自ElasticsearchRepository,可以直接使用Spring Data Elasticsearch提供的方法进行数据操作。 5. 在Service中使用Elasticsearch仓库类: ``` @Service public class UserService { @Autowired private UserRepository userRepository; public void save(User user) { userRepository.save(user); } public User findById(String id) { return userRepository.findById(id).orElse(null); } public void deleteById(String id) { userRepository.deleteById(id); } public List<User> findAll() { return (List<User>) userRepository.findAll(); } } ``` 其中,save、findById、deleteById、findAll方法都是由ElasticsearchRepository提供的。 至此,Spring Boot 2.6.x整合Elasticsearch的步骤就完成了。通过使用Spring Data Elasticsearch,我们可以轻松地进行CRUD操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值