5、SpringBoot 集成
1、导入maven配置
<properties>
<java.version>1.8</java.version>
<elasticsearch.version>7.6.1</elasticsearch.version> <!--注意设定为自己的ES版本-->
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2、编写配置类
@Configuration
public class ElasticSearchConfig {
@Bean
public RestHighLevelClient restHighLevelClient() {
RestHighLevelClient restHighLevelClient = new RestHighLevelClient(RestClient.builder(
new HttpHost("127.0.0.1", 9200, "http")
));
return restHighLevelClient;
}
}
3、测试
3.1、索引操作
@SpringBootTest
class ElasticsearchApplicationTests {
@Autowired
@Qualifier("restHighLevelClient")
private RestHighLevelClient client;
// 创建索引
@Test
void testCreateIndex() throws IOException {
// 1、创建索引请求
CreateIndexRequest request = new CreateIndexRequest("cqupt");
// 2、执行请求,获得响应
CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
System.out.println(createIndexResponse);
}
// 获取索引
@Test
void testExistIndex() throws IOException {
GetIndexRequest request = new GetIndexRequest("cqupt");
boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
System.out.println(exists);
}
// 删除索引
@Test
void testDeleteIndex() throws IOException {
DeleteIndexRequest request = new DeleteIndexRequest("cqupt");
AcknowledgedResponse acknowledgedResponse = client.indices().delete(request, RequestOptions.DEFAULT);
System.out.println(acknowledgedResponse.isAcknowledged());
}
}
3.2、文档操作
@Test // 添加文档
void testAddDocument() throws IOException {
User user = new User("张三", 20);
IndexRequest request = new IndexRequest("cqupt");
// 规则 put /cqupt/_doc/1
request.id("1");
request.timeout(TimeValue.timeValueSeconds(1));
request.timeout("1s");
request.source(JSON.toJSONString(user), XContentType.JSON);
IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);
System.out.println(indexResponse.toString());
System.out.println(indexResponse.status());
}
@Test // 判断文档是否存在 get /index/_doc/1
void testIsExists() throws IOException {
GetRequest request = new GetRequest("cqupt", "1");
boolean exists = client.exists(request, RequestOptions.DEFAULT);
System.out.println(exists);
}
@Test // 获取文档
void testGetDocument() throws IOException {
GetRequest request = new GetRequest("cqupt", "1");
GetResponse response = client.get(request, RequestOptions.DEFAULT);
System.out.println(response.getSourceAsString());
System.out.println(response);
}
@Test // 更新文档
void testUpdateDocument() throws IOException {
UpdateRequest request = new UpdateRequest("cqupt", "1");
request.timeout("1s");
User user = new User("李四", 39);
request.doc(JSON.toJSONString(user), XContentType.JSON);
UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
System.out.println(response.status());
}
@Test // 删除文档
void testDeleteDocument() throws IOException {
DeleteRequest request = new DeleteRequest("cqupt", "1");
request.timeout("1s");
DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
System.out.println(response.status());
}
@Test // 批量插入数据
void testBulkRequest() throws IOException {
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout("10s");
ArrayList<User> users = new ArrayList<>();
users.add(new User("张三", 20));
users.add(new User("李四", 40));
users.add(new User("王五", 20));
users.add(new User("李四", 40));
for (int i = 0; i < users.size(); i++) {
bulkRequest.add(new IndexRequest("cqupt").id(""+(i+1)).source(JSON.toJSONString(users.get(i)), XContentType.JSON));
}
BulkResponse bulk = client.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(bulk.status());
}
3.3、查询
@Test // 查询
void testSearch() throws IOException {
SearchRequest request = new SearchRequest("cqupt");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("name", "张三");
sourceBuilder.query(queryBuilder);
sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
sourceBuilder.from(0);
sourceBuilder.size(4);
request.source(sourceBuilder);
SearchResponse search = client.search(request, RequestOptions.DEFAULT);
System.out.println(JSON.toJSONString(search.getHits()));
System.out.println("====================================");
for (SearchHit hit : search.getHits().getHits()) {
System.out.println(hit.getSourceAsMap());
}
}
6、个人博客集成
{
"query": {
"bool": {
"should": [{
"match": {
"title": "mysql"
}},
{
"match_phrase": {
"content": "mysql"
}
}]
}
},
"from": 4,
"size": 4,
"highlight" : {
"fields" : {
"title" : {
}
}
}
}
代码实现
public void searchBlog(String query, int pagenum, Model model) {
if ("".equals(query)) {
List<Blog> blogs = listBlog(new Condition(), 1);
PageInfo<Blog> pageInfo = new PageInfo<>(blogs);
model.addAttribute("pageInfo", pageInfo);
}
List<Blog> blogs = new ArrayList<>();
SearchRequest request = new SearchRequest("blog");
HighlightBuilder highlightBuilder = new HighlightBuilder(); // 高亮
highlightBuilder.field("title")
.preTags("<b><font color='red'>")
.postTags("</font></b>");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); // 查询
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery()
.should(QueryBuilders.matchQuery("title", query))
.should(QueryBuilders.matchPhraseQuery("content", query));
sourceBuilder.query(queryBuilder);
sourceBuilder.highlighter(highlightBuilder);
sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
sourceBuilder.from(pagenum * 4);
sourceBuilder.size(4);
request.source(sourceBuilder);
long total=0;
try {
SearchResponse search = client.search(request, RequestOptions.DEFAULT);
total = search.getHits().getTotalHits().value;
for (SearchHit hit : search.getHits().getHits()) {
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
Blog blog = JSON.parseObject(JSON.toJSONString(sourceAsMap), Blog.class);
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
if (highlightFields != null && !highlightFields.isEmpty()) {
// 判断是否有高亮字段
Text title = highlightFields.get("title").getFragments()[0];
blog.setTitle(title.toString());
}
Long typeId = blog.getTypeId();
blog.setType(typeService.getType(typeId));
Long userId = blog.getUserId();
blog.setUser(userService.findByUserId(userId));
blogs.add(blog);
}
} catch (IOException e) {
e.printStackTrace();
}
PageInfo<Blog> pageInfo = new PageInfo<>(blogs); // 手动分页
pageInfo.setPageNum(pagenum+1);
pageInfo.setTotal(total);
int pages = (int)total / 4 + 1;
pageInfo.setPages(pages);
int prePage = pagenum -1;
pageInfo.setPrePage(prePage);
if (prePage < 0) {
pageInfo.setIsFirstPage(true);
pageInfo.setHasPreviousPage(false);
} else {
pageInfo.setIsFirstPage(false);
pageInfo.setHasPreviousPage(true);
}
int nextPage = pagenum + 1;
pageInfo.setNextPage(nextPage);
if (nextPage >= pages) {
pageInfo.setIsLastPage(true);
pageInfo.setHasNextPage(false);
} else {
pageInfo.setIsLastPage(false);
pageInfo.setHasNextPage(true);
}
model.addAttribute("pageInfo", pageInfo);
}
不会前端,ES手动分页是最骚的。