依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId><version>3.3.0</version></dependency>
如果我们定义一个存储库接口来扩展 Spring Data Elasticsearch 提供的 ElasticsearchRepository 接口*,*则默认情况下,相应文档类的 CRUD 操作将变为可用。
此外,方法实现只需以预定义格式声明具有名称的方法即可为我们生成。无需编写存储库接口的实现。
搭建 一个spring项目后引入依赖;
es配置类:
/*** @EnableElasticsearchRepositories将使* Spring Data Elasticsearch 扫描提供的* Spring Data 存储库包*/
@Configuration
@EnableElasticsearchRepositories(basePackages = "com.gavin.elasticSearch.repository")
@ComponentScan(basePackages = "com.gavin.elasticSearch.service")
public class ESConfig extends AbstractElasticsearchConfiguration {@Bean@Overridepublic RestHighLevelClient elasticsearchClient() {ClientConfiguration clientConfiguration = ClientConfiguration.builder().connectedTo("172.21.114.22:9200").build();return RestClients.create(clientConfiguration).rest();}
}
实体映射:
@Data
@Document(indexName = "book")
public class Book {@Field("id")private String id;@Field("name")private String name;@Field("price")private int price;}
crud服务:
Spring Data Elasticsearch 通常会根据项目中的实体自动创建索引,当然这需要我们配置一下,在实体类上添加相应的注解;
新增索引:
@RestController
@RequestMapping("/elastic")
public class ElasticController {@Autowiredprivate BookInfoRepository bookInfoRepository;@PostMapping("/addIndex")public String addIndex(@RequestBody Book book) throws IOException {Book save = bookInfoRepository.save(book);System.out.println(save);return "添加成功";}}
查询:
/*** 基于名称的查询* @return*/@GetMapping("/findBookByName")public Book getBookInfoByName(String name) {Page<Book> elastic = bookInfoRepository.findBookByName(name, Pageable.ofSize(1));Book book = elastic.get().findFirst().get();return book;}
自定义查询:
@GetMapping("/test")public Book filterBook() {//构造一个查询器MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("name", "ElasticSearch");NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder().withFilter(matchQueryBuilder).build();ElasticsearchRestTemplate elasticsearchRestTemplate = new ElasticsearchRestTemplate(restHighLevelClient);SearchHits<Book> search = elasticsearchRestTemplate.search(nativeSearchQuery, Book.class);search.getSuggest();long totalHits = search.getTotalHits();String s = String.valueOf(totalHits);Integer i = Integer.valueOf(s);Book content = search.getSearchHit(i-1).getContent();return content;}