1.准备工作
在集成es之前,我们需要选择springboot对应的es版本,版本一定要选择正确,否则后面可能会出现各种各样的问题。
下图是springboot与es客户端版本对应关系:
我的springboot版本是2.4.10,所以这里我选择es客户端7.9.3的版本
es下载链接:Download Elasticsearch | Elastic
ik分词器下载链接:
https://github.com/medcl/elasticsearch-analysis-ik/releases
注:ik分词器版本需要与es客户端版本对应,这里同样选择7.9.3版本。
下载完成后,将下载的ik分词器文件放在es的plugins文件夹下并解压
随后在es的bin目录下双击elasticsearch.bat即可运行,可以看到分词器加载成功,es启动成功
2.导入maven依赖
<!-- elasticsearch-server -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
3.配置ES
spring:
elasticsearch:
rest:
host: localhost
port: 9200
connection-timeout: 5000
read-timeout: 60000
设置一下es的ip、端口以及超时时间,因为我没有给elasticsearch设置用户名和密码,如果设置了还需要加上username和password。
@Configuration
public class ElasticSearchClientConfig {
@Value("${spring.elasticsearch.rest.host}")
private String host;
@Value("${spring.elasticsearch.rest.port}")
private int port;
@Value("${spring.elasticsearch.rest.connection-timeout}")
private int connTimeout;
@Value("${spring.elasticsearch.rest.read-timeout}")
private int socketTimeout;
@Bean
public RestHighLevelClient restHighLevelClient() {
RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
RestClient.builder(
new HttpHost(host,port, "http")
).setRequestConfigCallback(requestConfigBuilder -> requestConfigBuilder
.setConnectTimeout(connTimeout)
.setSocketTimeout(socketTimeout))
);
return restHighLevelClient;
}
}
注入一下es的bean,如果需要高级客户端的操作需要其他的配置。
4.创建ES实体
@Data
@ToString(callSuper = true)
@Document(indexName = EsConstant.GOODS_INDEX_NAME)
@ApiModel(value = "商品索引信息实体")
public class EsGoods {
private static final long serialVersionUID = -2124485309475024490L;
@Id
@ApiModelProperty(value = "商品ID")
private String id;
@Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart")
@ApiModelProperty(value = "商品名称")
private String goodsName;
@Field(type = FieldType.Text, analyzer = "ik_smart", searchAnalyzer = "ik_smart")
@ApiModelProperty(value = "商品简介")
private String goodsDesc;
@Field(type = FieldType.Text, analyzer = "ik_smart", searchAnalyzer = "ik_smart")
@ApiModelProperty(value = "详情")
private String intro;
@Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart")
@ApiModelProperty(value = "商品关键字")
private String keyWords;
}
以上有几个需要注意的地方:
1.indexName(索引名称)必须为小写
2.es客户端7.x以后不在@Document中用type的方式来指定类型了
3.@Document注解有一个属性createIndex,可选值true or false;代表是否在项目启动时创建索引。
4.@Field注解:type属性为指定索引字段的类型,具体可以自行去了解一下。
5.@Field注解:analyzer属性为指定创建索引时使用的分词器
6.@Field注解:searchAnalyzer属性为指定查找索引时使用的分词器
7.分词器我使用的是ik分词器,ik_smart代表粗粒度分词,ik_max_word代表细粒度分词,这里根据自己的业务去灵活使用。
5.创建repository类
public interface EsGoodsRepository extends ElasticsearchRepository<EsGoods, String> {
/**
* 检索商品
*
* @param goodsName 商品名称
* @param goodsDesc 商品简介
* @param intro 商品详情
* @param keywords 商品关键字
* @return 检索商品结果
*/
List<EsGoods> findAllByGoodsNameOrGoodsDescOrIntroOrKeyWords(String goodsName, String goodsDesc, String intro, String keywords);
}
到这一步就完成了,对索引的基本操作都可以通过jpa自带的方法去实现。
6.启动项目遇到的问题
1.如果启动不成功,查看是否是es客户端未启动。
2.如果启动抛出Caused by: java.lang.NoSuchFieldError: LUCENE_*_*_*异常,这个是由于依赖冲突引起的,看看自己的项目中是否有Lucene依赖,自己进行取舍。