SpringBoot整合ElasticSearch详解及相关使用方法

环境:springboot2.3.10.RELEASE + ElasticSearch7.8.0

相关依赖及应用配置

<dependency>  <groupId>org.springframework.bootgroupId>  <artifactId>spring-boot-starter-data-elasticsearchartifactId>dependency>
<dependency>  <groupId>org.springframework.bootgroupId>  <artifactId>spring-boot-starter-webartifactId>dependency>
<dependency>  <groupId>org.springframework.bootgroupId>  <artifactId>spring-boot-starter-testartifactId>  <scope>testscope>dependency>
spring:  elasticsearch:    rest:      uris:      - http://localhost:9201---logging:  level:    com.pack: debug    org.springframework.data.elasticsearch.core: debug

数据模型建立

@Document(createIndex = true, indexName = "products", shards = 3, replicas = 1)public class Product {
  @Id  private Long id ;  @Field(analyzer = "ik_max_word", type = FieldType.Text)  private String title ;  @Field(type= FieldType.Keyword)  private String category ;  @Field(type = FieldType.Double)  private Double price ;  @Field(type = FieldType.Keyword, index = false)  private String images ;  @Override  public String toString() {    return "Product [id=" + id + ", title=" + title + ", category=" + category + ", price=" + price + ", images="      + images + "]";  }
}

ProductRepository

这里我们只需要继承ElasticsearchRepository即可,是不是和data-jpa一样一样的的。

public interface ProductRepository extends ElasticsearchRepository<Product, Long> {}

继承ElasticsearchRepository后 我们也可以像data-jpa一样使用findBy*等语法来写相关查询方法。

  • 方法名中支持的关键字

  • 方法返回值类型
  1. List
  2. Stream
  3. SearchHits
  4. List>
  5. Stream>
  6. SearchPage

Repository中也支持@Query注解的方式自定义查询字符串。

public interface ProductRepository extends ElasticsearchRepository {    List findByTitle(String title) ;    @Query("{"fuzzy": {"title": "?0"}}")  Page findByTitle(String sex,Pageable pageable);  // 自定义查询  @Query("{"match": {"category": "?0"}}")  Page findByCategory(String category,Pageable pageable);    // 高亮设置  @Highlight(fields = {@HighlightField(name = "title"), @HighlightField(name = "category")})  List> findByTitleOrCategory(String title, String category,Pageable pageable) ;}

除了使用Repository方式,我们还可以使用ElasticsearchRestTemplate的方式请求服务。如下测试

测试

@Resourceprivate ProductRepository productRepository ;@Resourceprivate ElasticsearchRestTemplate elasticTemplate ;  @Testpublic void testCreate() {  Product product = new Product() ;  product.setId(3L) ;  product.setCategory("配件") ;  product.setPrice(299.5d) ;  product.setImages("http://www.pack.com/memory.jpg") ;  product.setTitle("很牛逼的内存条") ;  productRepository.save(product) ;}  @Testpublic void testQuery() {  Product product = productRepository.findById(1L).orElse(null) ;  System.out.println(product) ;}  @Testpublic void testFindAll() {  Pageable pageable = PageRequest.of(1, 2) ;  Page page = productRepository.findAll(pageable) ;  System.out.println(page.getTotalPages() + "n" + page.getContent()) ;}  @Testpublic void testTermSearch() {  for (Product p : productRepository.findByTitle("Java从入门到精通")) {    System.out.println(p) ;  }}  @Testpublic void testFindByTitle() {  Pageable pageable = PageRequest.of(0, 2) ;  Page page = productRepository.findByTitle("Java", pageable) ;  System.out.println(page.getTotalPages() + "n" + page.getContent()) ;}  @Testpublic void testFindByCategory() {  Pageable pageable = PageRequest.of(0, 2) ;  Page page = productRepository.findByCategory("书籍", pageable) ;  System.out.println(page.getTotalPages() + "n" + page.getContent()) ;}  @Testpublic void testCriteriaQuery() {  Criteria criteria = new Criteria("price").greaterThan(50).lessThan(80);  Query query = new CriteriaQuery(criteria);  SearchHits hits = elasticTemplate.search(query, Product.class, IndexCoordinates.of("products")) ;  for (SearchHit hit : hits) {    System.out.println(hit) ;  }}  @Testpublic void testStringQuery() {  Query query = new StringQuery("{ "match": { "category": { "query": "配件" } } } ");  SearchHits hits = elasticTemplate.search(query, Product.class);  for (SearchHit hit : hits) {    System.out.println(hit) ;  }}
@Testpublic void testStringQueryFuzzy() {  Query query = new StringQuery("{ "fuzzy":{"title":{"value":"Java"}} }");  HighlightQuery highlightQuery = null ;  HighlightBuilder highBuilder = new HighlightBuilder().preTags("").postTags("").field("title") ;  highlightQuery = new HighlightQuery(highBuilder) ;  query.setHighlightQuery(highlightQuery) ;  SearchHits hits = elasticTemplate.search(query, Product.class);  for (SearchHit hit : hits) {    System.out.println(hit + "n" + hit.getHighlightField("title")) ;  }}

在启动服务时会自动地为我们创建索引。

我们可以安装Chrome插件 ElasticSearch Head非常方便地查看es的状态及索引信息。

这里我是搭建的集群。

阅读全文
下载说明:
1、本站所有资源均从互联网上收集整理而来,仅供学习交流之用,因此不包含技术服务请大家谅解!
2、本站不提供任何实质性的付费和支付资源,所有需要积分下载的资源均为网站运营赞助费用或者线下劳务费用!
3、本站所有资源仅用于学习及研究使用,您必须在下载后的24小时内删除所下载资源,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担!
4、本站站内提供的所有可下载资源,本站保证未做任何负面改动(不包含修复bug和完善功能等正面优化或二次开发),但本站不保证资源的准确性、安全性和完整性,用户下载后自行斟酌,我们以交流学习为目的,并不是所有的源码都100%无错或无bug!如有链接无法下载、失效或广告,请联系客服处理!
5、本站资源除标明原创外均来自网络整理,版权归原作者或本站特约原创作者所有,如侵犯到您的合法权益,请立即告知本站,本站将及时予与删除并致以最深的歉意!
6、如果您也有好的资源或教程,您可以投稿发布,成功分享后有站币奖励和额外收入!
7、如果您喜欢该资源,请支持官方正版资源,以得到更好的正版服务!
8、请您认真阅读上述内容,注册本站用户或下载本站资源即您同意上述内容!
原文链接:https://www.shuli.cc/?p=15487,转载请注明出处。
0

评论0

显示验证码
没有账号?注册  忘记密码?