Springboot整合Elasticsearch新版分页查询
其它插入、删除、简单查询都可以通过Repository调用方法查询。
分页查询
我在Springboot中集成的Elasticsearch的jar包版本是4.4.2。该版本版本已经弃用了ElasticsearchTemplate类,Repository里原来的search方法也已经弃用了。可以使用ElasticsearchRestTemplate类实现分页查询(包含高亮、搜索条件)
代码
package com.lzl.community;
import com.lzl.community.entity.DiscussPost;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.*;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@SpringBootTest
public class ElasticsearchTest {
@Autowired
private ElasticsearchRestTemplate elasticSearchRestTemplate;
//搜索
@Test
public void testSearchByRepository() throws IOException {
//构建搜索条件
NativeSearchQuery build = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.multiMatchQuery("互联网寒冬", "title", "content"))
.withSorts(SortBuilders.fieldSort("type").order(SortOrder.DESC))
.withSorts(SortBuilders.fieldSort("score").order(SortOrder.DESC))
.withSorts(SortBuilders.fieldSort("createTime").order(SortOrder.DESC))
.withPageable(PageRequest.of(0, 10))
.withHighlightFields(
new HighlightBuilder.Field("title").preTags("<em>").postTags("</em>"),
new HighlightBuilder.Field("content").preTags("<em>").postTags("</em>")
)
.build();
SearchHits<DiscussPost> search = elasticSearchRestTemplate.search(build, DiscussPost.class);
SearchPage<DiscussPost> page = SearchHitSupport.searchPageFor(search, build.getPageable());
System.out.println(page.getTotalElements());
System.out.println(page.getTotalPages());
System.out.println(page.getNumber());
System.out.println(page.getSize());
for (SearchHit<DiscussPost> discussPostSearchHit : page) {
System.out.println(discussPostSearchHit.getHighlightFields()); //高亮
System.out.println(discussPostSearchHit.getContent());
}
//下面是将高亮部分封装到Page里边,好像也可以不用,要用到高亮内容时直接使用上边的discussPostSearchHit.getHighlightFields()应该也可以
System.out.println("==============================================");
List<DiscussPost> list = new ArrayList<>();
for (SearchHit<DiscussPost> discussPostSearchHit : page) {
DiscussPost discussPost = discussPostSearchHit.getContent();
//discussPostSearchHit.getHighlightFields() //高亮
if (discussPostSearchHit.getHighlightFields().get("title") != null) {
discussPost.setTitle(discussPostSearchHit.getHighlightFields().get("title").get(0));
}
if (discussPostSearchHit.getHighlightFields().get("content") != null) {
discussPost.setContent(discussPostSearchHit.getHighlightFields().get("content").get(0));
}
//System.out.println(discussPostSearchHit.getContent());
list.add(discussPost);
}
PageImpl<DiscussPost> pageInfo = new PageImpl<DiscussPost>(list, build.getPageable(), search.getTotalHits());
System.out.println(pageInfo.getTotalElements());
System.out.println(pageInfo.getTotalPages());
System.out.println(pageInfo.getNumber());
System.out.println(pageInfo.getSize());
for (DiscussPost discussPost : pageInfo) {
System.out.println(discussPost);
}
}
}
结果:总共输出两次,以===============分界

