SpringBoot整合elasticsearch实操

在这里插入图片描述
关于ES的简单介绍和基于Linux安装以及遇到的问题和解决方法,已经在Linux安装Elasticsearch这篇文章详细说过了,请参考该文章。这篇主要来说说如何在SpringBoot上整合elasticsearch,直接看下面的干货吧。

1、pom文件

引入elasticsearch依赖

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
 </dependency>

2、Config文件

SpringBoot方便的地方就是在于可以自动装配,几个注解就搞定了传统SSM那种繁琐的xml配置,@Configuration,@AutoConfigureBefore,@EnableCaching。

@Configuration
@AutoConfigureBefore(RedisConfig.class)
@EnableCaching
public class ElasticConfig {

    @PostConstruct
    void init() {
        System.setProperty("es.set.netty.runtime.available.processors", "false");
    }

    @Bean(name = "elasticsearchTemplate")
    public ElasticsearchTemplate elasticsearchTemplate(Client client,
                                                       ElasticsearchConverter converter) {
        try {
            return new ElasticsearchTemplate(client, converter);
        }
        catch (Exception ex) {
            throw new IllegalStateException(ex);
        }
    }

    @Bean
    public ElasticsearchConverter elasticsearchConverter(
            SimpleElasticsearchMappingContext mappingContext) {
        return new MappingElasticsearchConverter(mappingContext);
    }

    @Bean
    public SimpleElasticsearchMappingContext mappingContext() {
        return new SimpleElasticsearchMappingContext();
    }
}

注意,如果你的项目已经配置了redis,务必给AutoConfigureBefore这个注解传一个你的redis配置类,告诉spring,要在redis配置前先配置装载Elastic,否则会报错。

3、application.yml文件

在application.yml文件写以下几行

spring:
  data:
    elasticsearch:
      cluster-name: xxx-elastic
      cluster-nodes: 服务器ip地址:9300

注意,cluster-name的值要和config/elasticsearch.yml里面写的一致,如果config/elasticsearch.yml里面network.host是0.0.0.0,那么表示可以让任何计算机节点访问到。配置文件里端口是9200,这边是9300,这是因为9200是http访问的端口,9300是Java访问的端口,切记不要写错了哦。

4、Repository

创建Repository,继承ElasticsearchRepository,类似jpa。这样简单的CRUD就有了

public interface EsHotSentenceVideoRepository extends ElasticsearchRepository<HotSentenceVideoEntity,Long> {
}

在这里插入图片描述
5、接口Service

public interface EsHotSentenceVideoService {

    HotSentenceVideoEntity save(HotSentenceVideoEntity entity);

    void delete(HotSentenceVideoEntity entity);

    void deleteAll();

    Iterable<HotSentenceVideoEntity> getAll();

    List<HotSentenceVideoEntity> getByTitle(String title);

    Page<HotSentenceVideoEntity> pageQuery(Integer pageNo, Integer pageSize);

    Page<HotSentenceVideoEntity> pageQuery(Integer pageNo, Integer pageSize, String keyWord,String startTime,String endTime);
}

6、实现类ServiceImpl

@Service("esHotSentenceVideoService")
public class EsHotSentenceVideoServiceImpl implements EsHotSentenceVideoService {

    @Autowired
    private EsHotSentenceVideoRepository esHotSentenceVideoRepository;


    @Override
    public HotSentenceVideoEntity save(HotSentenceVideoEntity entity) {
        return esHotSentenceVideoRepository.save(entity);
    }

    @Override
    public void delete(HotSentenceVideoEntity entity) {
        esHotSentenceVideoRepository.delete(entity);
    }

    @Override
    public void deleteAll() {
        esHotSentenceVideoRepository.deleteAll();
    }

    @Override
    public Iterable<HotSentenceVideoEntity> getAll() {
        return esHotSentenceVideoRepository.findAll();
    }

    @Override
    public List<HotSentenceVideoEntity> getByTitle(String title) {
        List<HotSentenceVideoEntity> list = new ArrayList<>();
        MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("title", title);
        Iterable<HotSentenceVideoEntity> iterable = esHotSentenceVideoRepository.search(matchQueryBuilder);
        iterable.forEach(e->list.add(e));
        return list;
    }

    @Override
    public Page<HotSentenceVideoEntity> pageQuery(Integer pageNo, Integer pageSize) {
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
//                .withQuery(QueryBuilders.matchPhraseQuery("title", kw))
                .withPageable(PageRequest.of(pageNo, pageSize))
                .build();
        return esHotSentenceVideoRepository.search(searchQuery);
    }

    /**
     * @param pageNo
     * @param pageSize
     * @param keyWord
     * @param startTime
     * @param endTime
     * @return
     */
    @Override
    public Page<HotSentenceVideoEntity> pageQuery(Integer pageNo, Integer pageSize, String keyWord,String startTime,String endTime) {
        Pageable pageable = PageRequest.of(pageNo, pageSize);
        NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        //分页
        nativeSearchQueryBuilder.withPageable(pageable);
        //过滤
        if (StringUtils.isNotEmpty(startTime) && StringUtils.isNotEmpty(endTime)) {
            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
            Long startTimeLong = DateUtils.strToLong(startTime);
            Long endTimeLong = DateUtils.strToLong(endTime);
            boolQueryBuilder.must(QueryBuilders.rangeQuery("publicTime").from(startTimeLong).to(endTimeLong));
            nativeSearchQueryBuilder.withFilter(boolQueryBuilder);
        }
        //搜索
        if (StringUtils.isNotEmpty(keyWord)) {
            nativeSearchQueryBuilder.withQuery(QueryBuilders.matchPhraseQuery("sentence",keyWord));
        }
        nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("diggCount").order(SortOrder.DESC));
        NativeSearchQuery searchQuery = nativeSearchQueryBuilder.build();
        return esHotSentenceVideoRepository.search(searchQuery);
    }
}

7、总结

查询速度,一个字,快,两个字,很快,三个字,超级快,优越性不仅体现在速度上,更值得一提的是ES还可以做分词检索,很方便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空码字

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值