spring boot2.0 整合 ES 入门及异常记录

1、springboot版本

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <!--定义:srping-boot版本-->
        <version>2.0.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>


2、直接引入ES包

        <!--引入:Srping Boot Elasticsearch包-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>

还有添加配置文件

spring:
  data:
    elasticsearch:
      cluster-name: elasticsearch
      cluster-nodes: 127.0.0.1:9300


3、创建实体类

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;

import java.io.Serializable;
import java.util.List;

/**
 * @Author: HanYulong
 * @Description: 小程序的ES文章类
 * @Date: Created in 2018/4/12
 */
@Document(indexName = "dbb", type = "article", refreshInterval = "-1")
public class EsArticle implements Serializable {

    private static final long serialVersionUID = 2781450365843496563L;
    private @Id Long id;
    private String articleId;                                          //主键
    private Long publishDate;                                 //创建时间
    private String title;                                 //标题
    private String summary;                                 //摘要
    private String source;                                 //来源
    private String contentText;                                 //内容
    private String imgSrc;                                 //图片

@Document这个注解呢是配置了ES相关信息,包括索引、类型、分片、备份等。索引、类型必须定义、其他都有默认值,我只定义了刷新间隔。

@Document定义如下

@Persistent
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface Document {
 
String indexName();//索引库的名称,个人建议以项目的名称命名
 
String type() default "";//类型,个人建议以实体的名称命名
 
short shards() default 5;//默认分区数
 
short replicas() default 1;//每个分区默认的备份数
 
String refreshInterval() default "1s";//刷新间隔
 
String indexStoreType() default "fs";//索引文件存储类型
}

注意:【异常1】尝试了多次,不知道为什么,当Id为String时会报类型转换异常。String不能转换为Long。最后直接定义为Long。不管了, 先跑起来再说。

4、ES交互接口  直接继承ElasticsearchRepository  就完。

public interface ArticleSearchRepository extends ElasticsearchRepository<EsArticle, Long> {
}
5、接口调用

 Page<EsArticle> esArticlePage = articleSearchRepository.search(searchQuery);
        List<EsArticle> esArticles = esArticlePage.getContent();


分页方法封装

    public SearchQuery getSearchQuery(int page, int pageSize, String searchContent) {
        QueryStringQueryBuilder query = new QueryStringQueryBuilder(searchContent);
        Pageable pageable = new PageRequest(page, pageSize);
        return new NativeSearchQueryBuilder().withPageable(pageable).withQuery(query).build();
    }

基本完成。

在ES地址由本地改为远程docker部署后,调用测试方法,出现了异常:

NoNodeAvailableException[None of the configured nodes are available: [{#transport#-1}{e46X4eiGTiW6Fqr1-8SQzw}{172.19.20.5}{172.19.20.5:9301}]
]

很明显:该节点不可用,可是我验证过了,该节点无异常。可访问,容器无异常,iptables无异常。

首先我的远程dockerES将容器的9300映射到宿主9301端口上了。

我在怀疑是不是这个问题,可是修改端口映射还是错误,那就是说明不是这个问题。 

然后在网上各种搜,可是大多都说1、将配置文件9300写为9200.2、版本问题。可是都不是。最后终于我找到了它。

elasticsearch报错解决办法:NoNodeAvailableException[None of the configured nodes are available


关键问题:

你的application.yml 必需要与elasticsearch.yml 的数据相同




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值