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 的数据相同