ES就不用我说了吧,如果是安装的话可以参考我这边blog《Centos7.9安装ElasticSearch6》,安装好ES,接下来我们配置SpringBoot.在配置之前,先看看版本对应表。
1.修改POM文件的依赖
<!-- ES 默认对应springboot的版本 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
2.增加application.properties配置文件属性值
spring.elasticsearch.uris=http://10.10.52.155:9200
spring.data.elasticsearch.repositories.enabled=true
spring.data.elasticsearch.repositories.cluster-name=elasticsearch
spring.data.elasticsearch.repositories.cluster-nodes=10.10.52.155:9300
紧接上一章的工程,我们在model层下增加一个po实体
package com.example.firstweb.model.po;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
@Getter
@Setter
@Data
@Document(indexName = "esinfoindex")
public class EsInfoPo {
@Id
private Long id;
@Field(type = FieldType.Keyword)
private String title;
@Field(type = FieldType.Text,analyzer = "ik_max_word")
private String content;
}
Spring Data通过注解来声明字段的映射属性,有下面的三个注解:
@Document 作用在类,标记实体类为文档对象,一般有两个属性
indexName:对应索引库名称
type:对应在索引库中的类型
shards:分片数量,默认5
replicas:副本数量,默认1
@Id 作用在成员变量,标记一个字段作为id主键
@Field 作用在成员变量,标记为文档的字段,并指定字段映射属性:
type:字段类型,是枚举:FieldType,可以是text、long、short、date、integer、object等
text:存储数据时候,会自动分词,并生成索引
keyword:存储数据时候,不会分词建立索引
Numerical:数值类型,分两类
基本数据类型:long、interger、short、byte、double、float、half_float
浮点数的高精度类型:scaled_float
需要指定一个精度因子,比如10或100。elasticsearch会把真实值乘以这个因子后存储,取出时再还原。
Date:日期类型
elasticsearch可以对日期格式化为字符串存储,但是建议我们存储为毫秒值,存储为long,节省空间。
index:是否索引,布尔类型,默认是true
store:是否存储,布尔类型,默认是false
analyzer:分词器名称,这里的ik_max_word即使用ik分词器
接下来编些DAO层的代码EsInfoDao
package com.example.firstweb.dao;
import com.example.firstweb.model.po.EsInfoPo;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface EsInfoDao extends ElasticsearchRepository<EsInfoPo, Long> {
}
在编写完Dao层代码后,开始编写Service代码
package com.example.firstweb.service;
import com.example.firstweb.dao.EsInfoDao;
import com.example.firstweb.model.po.EsInfoPo;
import org.elasticsearch.index.query.MultiMatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.stereotype.Service;
import java.util.stream.Collectors;
@Service
public class EsInfoService {
@Autowired
private EsInfoDao esInfoDao;
@Autowired
private ElasticsearchRestTemplate elasticsearchRestTemplate;
public EsInfoPo save(EsInfoPo esInfo){
return esInfoDao.save(esInfo);
}
public void searchContent(){
MultiMatchQueryBuilder multiMatchQuery = QueryBuilders.multiMatchQuery("长城","title","content");
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(multiMatchQuery)
.withPageable(PageRequest.of(0, 10))//分页
.build();
SearchHits<EsInfoPo> search = elasticsearchRestTemplate.search(searchQuery,EsInfoPo.class);
System.out.println("total hits:"+search.getTotalHits());
System.out.println(search.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList()));
}
}
Service代码写完后,直接写测试用例代码,然后运行测试用例。这里有个注意的地方就是在运行之前,要去建立索引,可以用ElasticSearch-Head去建立 一个esinfoindex的索引,并且运行的ES在elasticsearch.yml属性中加上xpack.security.enabled: false属性。
Elasticsearch现在的新版本已经弃用了ElasticsearchTemplate类,Repository里原来的search方法也已经弃用了。现在都是用ElasticsearchRestTemplate类实现。
package com.example.firstweb;
import com.example.firstweb.dao.EsInfoDao;
import com.example.firstweb.model.po.EsInfoPo;
import com.example.firstweb.service.EsInfoService;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;
import org.springframework.test.context.junit4.SpringRunner;
@SpringBootTest
class FirstwebApplicationTests {
@Autowired
private EsInfoService esInfoService;
@Test
void contextLoads() {
}
@Test
void testEs(){
EsInfoPo esi= new EsInfoPo();
esi.setId(new Long(1));
esi.setTitle("中国长城");
esi.setContent("姚明夺得男篮世界杯八强");
esInfoService.save(esi);
esInfoService.searchContent();
}
}
在Springboot中直接运行FirstwebApplicationTests ,得到如下结果
并且在ElasticSearch-Head中可以查看到建立的那条索引
工程源代码可以在这里获得:链接: https://pan.baidu.com/s/1hAvFotdKwXxg80tNVLOz4w 提取码: wz4a