SpringBoot 整合 ElasticSearch

  前面使用ES的基本命令操作,接下来就将ES整合到springboot项目中,与ES的交互有两种方式:
方式一
  通过9300端口使用TCP连接,但是不推荐这种方式,因为在springboot的整合中还没更新到7.0版本,它的jar包并不适配新版本的ES,并且官方不推荐我们使用这种方式,在以后的8.0版本中将要废弃这种方式
方式二
  通过9200端口使用http连接,也就是说,只要能发送http请求的jar包都能来使用,区别就在于谁更简单方便,而官方也给我封装了一个包—ElasticSearch-Rest-Client,既然是官方推荐,说明它适合实际开发,更贴合项目使用,并且是官方推荐的,基本上是同步更新ES的版本
  1. 创建项目啥的就不用多说了,创建一个Springboot项目,然后导入jar包,注意jar包的版本和自己的ES对应

<-- ES 版本 -->
<elasticsearch.version>7.10.1</elasticsearch.version>

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>${elasticsearch.version}</version>
</dependency>

注意:springboot默认管理了ES的版本,但是版本可能和我们的不一致,所以建议将版本在项目里重新定义
  2. 配置ES服务器,配置方式官方文档是通过配置类来配置的,我看源码发现可以通过yaml配置,但是官方文档没有,我测试时是能测试通过的

# 配置ES服务器地址
spring:
  elasticsearch:
    rest:
      uris: http://192.168.0.109:9200
//通过代码配置
@Configuration
public class GulimaillElasticSearchConfig {
    //请求设置项
    public static final RequestOptions COMMON_OPTIONS;
    static {
        RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
        COMMON_OPTIONS = builder.build();
    }
    @Bean
    public RestHighLevelClient restHighLevelClient() {
        return new RestHighLevelClient(RestClient.builder(new HttpHost("192.168.0.109", 9200, "http")));
    }
}

  然后进行测试

@SpringBootTest
class GulimallSearchApplicationTests {
    //请求设置项
    public final RequestOptions COMMON_OPTIONS;

    {
        RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
        COMMON_OPTIONS = builder.build();
    }

    @Autowired
    private RestHighLevelClient client;

    /**
     * 存储数据,再次执行则变为更新操作
     */
    @Test
    public void indexData() throws IOException {
        //构建要保存的数据对象
        Map<String, Object> data = new HashMap<String, Object>();
        data.put("name", "Peach-D");
        data.put("age", 180);
        data.put("sex", "男");
        //创建索引对象并指定索引名
        IndexRequest indexRequest = new IndexRequest("user");
        //设置唯一索引,可以不用设置,默认会生成
        indexRequest.id("1");
        //索引要保存的数据
        indexRequest.source(data);
        //执行保存操作
        IndexResponse index = client.index(indexRequest, COMMON_OPTIONS);
        System.out.println(index);
    }

    /**
     * 普通检索
     */
    @Test
    public void getData() throws IOException {
        //创建检索对象
        GetRequest getRequest = new GetRequest();
        getRequest.index("user");//检索条件--索引名
        getRequest.id("1");//检索条件--唯一ID
        GetResponse fields = client.get(getRequest, COMMON_OPTIONS);
        Map<String, Object> map = fields.getSourceAsMap();
        System.out.println(map.toString());
    }

    /**
     * 删除索引或数据
     */
    @Test
    public void deleteData() throws Exception {
        DeleteRequest deleteRequest = new DeleteRequest();
        deleteRequest.index("user");
        deleteRequest.id("1");
        DeleteResponse delete = client.delete(deleteRequest, COMMON_OPTIONS);
        System.out.println(delete);
    }

    /**
     * 更新索引
     */
    @Test
    public void updateData() throws Exception {
        Map<String, Object> data = new HashMap<String, Object>();
        data.put("name", "张三");
        data.put("age", 22);
        data.put("sex", "男");
        UpdateRequest updateRequest = new UpdateRequest();
        updateRequest.index("user");
        updateRequest.id("1");
        updateRequest.doc(data);
        UpdateResponse update = client.update(updateRequest, COMMON_OPTIONS);
        System.out.println(update);
    }

    /**
     * 高级检索
     */
    @Test
    public void searchData() throws Exception {
        //创建检索请求
        SearchRequest searchRequest = new SearchRequest();
        //指定要检索的索引
        searchRequest.indices("bank");
        //指定检索条件
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        //构建检索条件
        sourceBuilder.query(QueryBuilders.matchQuery("address", "mill"));//全文检索条件
        sourceBuilder.aggregation(AggregationBuilders.terms("ageAgg").field("age"));
        sourceBuilder.aggregation(AggregationBuilders.avg("ageAvg").field("age"));
        searchRequest.source(sourceBuilder);
        //执行检索
        SearchResponse response = client.search(searchRequest, COMMON_OPTIONS);
        System.out.println(response.toString());
        //解析结果
        SearchHits hits = response.getHits();//查询到的记录
        // 查询到的数据转为实体类
        List<User> users = Arrays.asList(hits.getHits()).stream().map(hit -> {
            String data = hit.getSourceAsString();//查询到的数据
            return JSON.parseObject(data, User.class);
        }).collect(Collectors.toList());
        users.forEach(System.out::println);
    }
}

@Data
class User {
    private String firstname;
    private String lastname;
    private String city;
    private String state;
    private String email;
    private String employer;
    private String gender;
    private String address;
    private Integer age;
    private Integer account_number;
    private Integer balance;
}

  具体的使用还是需要去参考官方文档,并且要对ES的命令比较熟悉,总的来说感觉和Redis差不多,只要你熟悉了命令操作,剩下的都是基于命令去封装的方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,下面是SpringBoot整合elasticsearch的步骤: 1. 引入elasticsearch和spring-boot-starter-data-elasticsearch的依赖: ``` <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>7.12.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> <version>2.4.5</version> </dependency> ``` 2. 配置elasticsearch连接信息: ``` spring.data.elasticsearch.cluster-nodes=localhost:9200 ``` 3. 创建实体类: ``` @Document(indexName = "my_index") public class MyEntity { @Id private String id; private String name; // getter and setter } ``` 4. 创建es的Repository: ``` public interface MyRepository extends ElasticsearchRepository<MyEntity, String> { } ``` 5. 在service中使用Repository: ``` @Service public class MyService { @Autowired private MyRepository myRepository; public void save(MyEntity entity) { myRepository.save(entity); } public List<MyEntity> search(String name) { return myRepository.findByName(name); } } ``` 6. 在controller中调用service: ``` @RestController public class MyController { @Autowired private MyService myService; @PostMapping("/save") public void save(@RequestBody MyEntity entity) { myService.save(entity); } @GetMapping("/search") public List<MyEntity> search(@RequestParam String name) { return myService.search(name); } } ``` 这样就可以通过SpringBoot整合elasticsearch实现数据的增删改查了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

華小灼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值