ElasticSearch学习笔记2---SpringBoot集成

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手动分页是最骚的。

猜你喜欢

转载自blog.csdn.net/qq_42372017/article/details/111333701