SpringBoot整合ElasticSearch快速入门

SpringBoot整合ElasticSearch

1.导入依赖

1.1 导入SpringBoot的基础相关依赖

注意再倒入相关依赖的时候需要导入一个Springboot管理依赖的parent,否则在导入其他依赖不写版本就会报错,因为在这个parent中,springboot内部自动帮我们固定了版本号等。

 <parent>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-parent</artifactId>
     <version>2.0.5.RELEASE</version>
</parent>

<dependencies>
    <!-- springBoot支持 web基础依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!--测试依赖导入-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

1.2 导入ElasticSearch相关依赖

 <!--ES依赖包导入-->
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
 </dependency>

2.配置ElasticSearch

2.1 配置文件中配置ElasticSearch

resources中创建applciation.yml配置文件

spring:
  application:
    name: ESApplication
  data:
    elasticsearch:
      cluster-name: elasticsearch
      cluster-nodes: 127.0.0.1:9300 #9200是图形界面端,9300代码端

3.创建ElasticSearch文档对象

3.1 创建UserDoc类

该类主要是,需要做文档映射的那张表对应的字段。

/**
 * 针对于  User 表的文档映射
 * indexName:索引库
 * type:类型(表类型)
 */
@Document(indexName = "hrm" , type = "user")
public class UserDoc {
    
    

    //对应文档的id  PUT  /index/type/id
    @Id
    private Long id;

    @Field(type = FieldType.Keyword)    //指定为 不分词
    private String userName;

    private int age;

    @Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_max_word")
    private String intro;
}

3.2 创建测试类映射文档

这里我们采用在测试类做文档映射的方式来简单学会对ElasticSearch在Springboot中的操作。创建了文档映射之后可以对其中的内容做查询、条件匹配等。

// 指定启动类
@SpringBootTest(classes = ESApplication.class)
@RunWith(SpringRunner.class)
public class ESTest {
    
    
    @Autowired
    public ElasticsearchTemplate elasticsearchTemplate;


    @Test
    public void testCreateIndex() {
    
    
        // 创建索引
        elasticsearchTemplate.createIndex(UserDoc.class);

        // 做文档映射
        elasticsearchTemplate.putMapping(UserDoc.class);
    }

}

4.SpringBoot中对Elasticsearch的基本操作

4.1 继承ElasticsearchRepository类

Springboot中已经封装好了一个类供我们使用,直接继承他然后就可以使用了。

// 继承了一个SringBoot中封装好的可以对ES进行操作的类
@Repository
public interface UserElasticSearchRepository extends ElasticsearchRepository<UserDoc, Long> {
    
    }

4.2 基本的ElasticSearch操作

在前面的测试类中,注入UserElasticSearchRepository,然后操作已经创建好的文档

4.2.1 添加数据

添加好的数据可以通过Kibana可视化界面去查看数据是否添加成功。

// 文档的添加
@Test
public void testAdd() {
    
    
    for (long i = 1; i < 10; i++) {
    
    
        UserDoc userDoc = new UserDoc();
        userDoc.setId(i);
        if (i % 2 == 0) {
    
    
            userDoc.setUserName("芜湖大司马");
            userDoc.setAge(30);
        } else {
    
    
            userDoc.setUserName("烫嘴PDD");
            userDoc.setAge(28);
        }
        userElasticSearchRepository.save(userDoc);
    	System.out.println("保存成功");
    }
}

4.2.2 简单查询

查询出得到结果,这里只是简单查询。

// 查询
@Test
public void testGet() {
    
    
    Optional<UserDoc> user = userElasticSearchRepository.findById(5L);
    UserDoc userDoc = user.get();
    System.out.println(userDoc.getUserName());
}

4.2.3 删除数据

删除某条数据之后,在使用查询可以看到该条数据已经查询不到了。

 // 删除操作
 @Test
 public void testDelete() {
    
    
     // 通过ID删除ES中的这条数据
     userElasticSearchRepository.deleteById(5L);
     System.out.println("删除成功");
     testGet();
 }

4.3 ElasticSearch的高级查询

做高级查询我们采用另外一种封装好的工具对ElasticSearch做查询。

NativeSearchQueryBuilder:本地查询的builder

BoolQueryBuilder:组合查询的条件

withSort:排序

whithPageable:分页

NativeSearchQuery: 查询对象

使用查询对象将上述的所有可能用到的条件,调用repository方法进行查询

term表示精确匹配,value值不会被分词器拆分,按照倒排索引匹配
match表示全文检索,value值会被分词器拆分,然后去倒排索引中匹配
range表示范围检索,其value值是一个对象,如{ “range”: {field: {比较规则: value, …}} } 比较规则有gt / gte / lt / lte 等

@Test
    public void testSearch(){
    
    

        //创建一个本机查询builder
        NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();
        //=================================================
        //1.查询条件
        //组合查询
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

        //查询 username 中包含 pd : DSL查询 - must - match
        boolQueryBuilder.must(QueryBuilders.matchQuery("intro","掌握"));

        // Age 在 10 - 20 : DSL过滤 - filter - range
        boolQueryBuilder.filter(QueryBuilders.rangeQuery("age").gte(10).lte(20));

        builder.withQuery(boolQueryBuilder);

        //2.排序 按照id倒排
        builder.withSort(new FieldSortBuilder("id").order(SortOrder.DESC));
        //3.分页
        builder.withPageable(PageRequest.of(0,5));
        //=================================================
        //构建一个查询对象
        NativeSearchQuery searchQuery  = builder.build();

        //执行查询,得到结果
        Page<UserDoc> page = userElasticSearchRepository.search(searchQuery);
        //page  -> PageList

        System.out.println("总条数:"+page.getTotalElements());
        System.out.println("总页数:"+page.getTotalPages());

        //结果列表
        List<UserDoc> content = page.getContent();

        content.forEach(userDoc -> {
    
    
            System.out.println(userDoc);
        });
    }

上述java代码对应在kibana中的表达:

GET hrm/user/_search
{
    
    
  "query": {
    
    
    "bool": {
    
    
      "filter": {
    
    
        "range": {
    
    
          "age": {
    
    
            "gte": 10,
            "lte": 20
          }
        }
      },
      "must": [
        {
    
    
          "match": {
    
    
            "intro": "掌握"
          }
        }
      ]
    }
  }
  , "sort": [
    {
    
    
      "id": {
    
    
        "order": "desc"
      }
    }
  ]

}

注意:以上所有的测试默认ElasticSearch配置完成,并开启ElasticSearch。

Guess you like

Origin blog.csdn.net/qq_42859722/article/details/121866954