SpringBoot整合ElasticSearch
1.导入依赖
1.1 导入SpringBoot的基础相关依赖
注意再倒入相关依赖的时候需要导入一个Springboot管理依赖的parent,否则在导入其他依赖不写版本就会报错,因为在这个parent中,springboot内部自动帮我们固定了版本号等。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
1.2 导入ElasticSearch相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
2.配置ElasticSearch
2.1 配置文件中配置ElasticSearch
resources中创建applciation.yml配置文件
spring:
application:
name: ESApplication
data:
elasticsearch:
cluster-name: elasticsearch
cluster-nodes: 127.0.0.1:9300
3.创建ElasticSearch文档对象
3.1 创建UserDoc类
该类主要是,需要做文档映射的那张表对应的字段。
@Document(indexName = "hrm" , type = "user")
public class UserDoc {
@Id
private Long id;
@Field(type = FieldType.Keyword)
private String userName;
private int age;
@Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_max_word")
private String intro;
}
3.2 创建测试类映射文档
这里我们采用在测试类做文档映射的方式来简单学会对ElasticSearch在Springboot中的操作。创建了文档映射之后可以对其中的内容做查询、条件匹配等。
@SpringBootTest(classes = ESApplication.class)
@RunWith(SpringRunner.class)
public class ESTest {
@Autowired
public ElasticsearchTemplate elasticsearchTemplate;
@Test
public void testCreateIndex() {
elasticsearchTemplate.createIndex(UserDoc.class);
elasticsearchTemplate.putMapping(UserDoc.class);
}
}
4.SpringBoot中对Elasticsearch的基本操作
4.1 继承ElasticsearchRepository类
Springboot中已经封装好了一个类供我们使用,直接继承他然后就可以使用了。
@Repository
public interface UserElasticSearchRepository extends ElasticsearchRepository<UserDoc, Long> {}
4.2 基本的ElasticSearch操作
在前面的测试类中,注入UserElasticSearchRepository,然后操作已经创建好的文档
4.2.1 添加数据
添加好的数据可以通过Kibana可视化界面去查看数据是否添加成功。
@Test
public void testAdd() {
for (long i = 1; i < 10; i++) {
UserDoc userDoc = new UserDoc();
userDoc.setId(i);
if (i % 2 == 0) {
userDoc.setUserName("芜湖大司马");
userDoc.setAge(30);
} else {
userDoc.setUserName("烫嘴PDD");
userDoc.setAge(28);
}
userElasticSearchRepository.save(userDoc);
System.out.println("保存成功");
}
}
4.2.2 简单查询
查询出得到结果,这里只是简单查询。
@Test
public void testGet() {
Optional<UserDoc> user = userElasticSearchRepository.findById(5L);
UserDoc userDoc = user.get();
System.out.println(userDoc.getUserName());
}
4.2.3 删除数据
删除某条数据之后,在使用查询可以看到该条数据已经查询不到了。
@Test
public void testDelete() {
userElasticSearchRepository.deleteById(5L);
System.out.println("删除成功");
testGet();
}
4.3 ElasticSearch的高级查询
做高级查询我们采用另外一种封装好的工具对ElasticSearch做查询。
NativeSearchQueryBuilder:本地查询的builder
BoolQueryBuilder:组合查询的条件
withSort:排序
whithPageable:分页
NativeSearchQuery: 查询对象
使用查询对象将上述的所有可能用到的条件,调用repository方法进行查询
term表示精确匹配,value值不会被分词器拆分,按照倒排索引匹配 match表示全文检索,value值会被分词器拆分,然后去倒排索引中匹配 range表示范围检索,其value值是一个对象,如{ “range”: {field: {比较规则: value, …}} } 比较规则有gt / gte / lt / lte 等
@Test
public void testSearch(){
NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.matchQuery("intro","掌握"));
boolQueryBuilder.filter(QueryBuilders.rangeQuery("age").gte(10).lte(20));
builder.withQuery(boolQueryBuilder);
builder.withSort(new FieldSortBuilder("id").order(SortOrder.DESC));
builder.withPageable(PageRequest.of(0,5));
NativeSearchQuery searchQuery = builder.build();
Page<UserDoc> page = userElasticSearchRepository.search(searchQuery);
System.out.println("总条数:"+page.getTotalElements());
System.out.println("总页数:"+page.getTotalPages());
List<UserDoc> content = page.getContent();
content.forEach(userDoc -> {
System.out.println(userDoc);
});
}
上述java代码对应在kibana中的表达:
GET hrm/user/_search
{
"query": {
"bool": {
"filter": {
"range": {
"age": {
"gte": 10,
"lte": 20
}
}
},
"must": [
{
"match": {
"intro": "掌握"
}
}
]
}
}
, "sort": [
{
"id": {
"order": "desc"
}
}
]
}
注意:以上所有的测试默认ElasticSearch配置完成,并开启ElasticSearch。
|