spring boot 使用jest 操作 elasticsearch 完成索引管理 高亮分页搜索文档

tech2026-08-04  2

目的

添加索引删除索引添加文档删除文档批量添加批量删除搜索文档高亮搜索分页搜索获得文档

仓库链接

es基本概念、安装es

gitee仓库地址

yaml

spring: elasticsearch: jest: uris: http://127.0.0.1:9200/ read-timeout: 300s connection-timeout: 5s application: name: es-jest-api

依赖

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <!--导入jest依赖--> <dependency> <groupId>io.searchbox</groupId> <artifactId>jest</artifactId> <version>6.3.1</version> </dependency> <!-- jsoup --> <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.10.2</version> </dependency> <!-- jackson --> <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version>2.9.8</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-json</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.68</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>

配置

@Configuration public class EsConfig { @Bean public JestClient jestClient() { JestClientFactory factory = new JestClientFactory(); factory.setHttpClientConfig(new HttpClientConfig .Builder("http://localhost:9200") .defaultMaxTotalConnectionPerRoute(20) .maxTotalConnection(20) .build()); return factory.getObject(); } }

测试程序

@RunWith(SpringRunner.class) @SpringBootTest public class JestApiApplicationTest { @Autowired private JestClient client; @Autowired private TestEs test; /** * 创建索引 * * @throws IOException */ @Test public void createIndex1() throws IOException { /** * 创建索引 */ JestResult articles = client.execute(new CreateIndex.Builder("articles").build()); System.out.println(articles.getResponseCode()); } /** * 创建索引 * * @throws IOException */ @Test public void createIndex2() throws IOException { /** * 创建索引 */ Settings.Builder builder = Settings.builder(); /** * 基本设置 */ builder.put("number_of_shards", 5); builder.put("number_of_replicas", 1); System.out.println(client.execute(new CreateIndex.Builder("dianhun").settings(builder.build().toString()).build()).getResponseCode()); } /** * 创建文档信息 * * @throws IOException */ @Test public void createDocument() throws IOException { Article article = new Article(); article.setDocumentId(1L).setContent("测试").setDocumentVersion(1L); DocumentResult execute = client.execute(new Index.Builder(article).index("articles").type("test").build()); System.out.println(execute.getIndex()); System.out.println(execute.getResponseCode()); } /** * 搜索文档 高亮 分页 * * @throws IOException */ @Test public void searchDocument() throws IOException { SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(QueryBuilders.matchQuery("content", "测试")); /** * 设置高亮 */ HighlightBuilder highlightBuilder = new HighlightBuilder(); highlightBuilder.field("content");//高亮title highlightBuilder.preTags("<em>").postTags("</em>");//高亮标签 highlightBuilder.fragmentSize(500);//高亮内容长度 searchSourceBuilder.highlighter(highlightBuilder); /** * 分页 */ searchSourceBuilder.size(1); searchSourceBuilder.from(1); Search search = new Search.Builder(searchSourceBuilder.toString()) // multiple index or types can be added. .addIndex("articles") .addType("test") .build(); SearchResult result = client.execute(search); List<SearchResult.Hit<Article, Void>> hits = result.getHits(Article.class); for (SearchResult.Hit<Article, Void> hit : hits) { System.out.println(hit.source); } System.out.println(hits.size()); for (SearchResult.Hit<Article, Void> hit : hits) { Article source = hit.source; //获取高亮后的内容 Map<String, List<String>> highlight = hit.highlight; List<String> views = highlight.get("content");//高亮后的title if (views != null) { source.setContent(views.get(0)); } System.out.println(source.getContent()); System.out.println(source.getDocumentVersion()); System.out.println(source.getDocumentId()); // Article sourceAsObject = result.getSourceAsObject(Article.class, false); // System.out.println(sourceAsObject.toString()); } } /** * 删除文档 * * @throws IOException */ @Test public void deleteDocument() throws IOException { System.out.println(client.execute(new Delete.Builder("QLvqV3QBE58Ym5AMkovS") .index("articles") .type("test") .build()).getResponseCode()); } /** * 批量添加文档 * * @throws IOException */ @Test public void Bulk1() throws IOException { Article article1 = new Article(); article1.setDocumentId(11L).setContent("测试 ctr").setDocumentVersion(1L); Article article2 = new Article(); article2.setDocumentId(12L).setContent("测试 ccc").setDocumentVersion(1L); Article article3 = new Article(); article3.setDocumentId(13L).setContent("测试 dianhun").setDocumentVersion(1L); Bulk bulk = new Bulk.Builder() .defaultIndex("articles") .defaultType("test") .addAction(new Index.Builder(article1).build()) .addAction(new Index.Builder(article2).build()) .addAction(new Index.Builder(article3).build()) .build(); client.execute(bulk); } /** * 批量添加文档 * * @throws IOException */ @Test public void Bulk2() throws IOException { ArrayList<Index> list = new ArrayList<>(); for (int i = 0; i < 3; i++) { Article article = new Article().setContent(UUID.randomUUID().toString().substring(0, 3)) .setDocumentId(i * 12 + 2) .setDocumentVersion(i * 11); list.add(new Index.Builder(article).build()); } Bulk bulk = new Bulk.Builder() .defaultIndex("articles") .defaultType("test") .addAction(list) .build(); System.out.println(client.execute(bulk).getResponseCode()); } /** * 得到文档 * * @throws IOException */ @Test public void get() throws IOException { Get get = new Get.Builder("articles", "11").type("test").build(); JestResult result = client.execute(get); System.out.println(result.getSourceAsObject(Article.class)); } }

官方文档

https://github.com/searchbox-io/Jest/tree/master/jest
最新回复(0)