Springboot 配置使用 Elasticsearch

这篇具有很好参考价值的文章主要介绍了Springboot 配置使用 Elasticsearch。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

elasticsearch:就是一个很快很快的搜索引擎,使用场景就是像网易词典这种,输入几个相关文字,就可以从几百万个单词中瞬间找到匹配的翻译,这种海量数据的模糊搜索在关系型数据库中是不可能的,所以这时候就要用到elasticsearch了,但是它和 MongoDB 这种文档型数据库有什么区别,有没有懂的可以在评论区教教我,我是没有搞懂


一、安装Elasticsearch

1、Windows安装

Windows安装比较简单,官网下载压缩包,解压出来,然后里面有个 bin 目录,里面有个elasticsearch.bat,双击,就运行起来了,然后在浏览器输入localhost:9200验证,成功会返回下面的图片

2、Linux安装

# 导入公钥,如果报错gpg,则先apt install gpg一下就可以了,如果报错sudo,则去掉命令中的sudo
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
# 添加elasticsearch到仓库
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
# 更新仓库,安装
sudo apt update
sudo apt install elasticsearch
# 需要修改成如下图,elasticsearch版本 7.0、8.0 以下可能没有我的截图里面的字段,不用管
sudo vim /etc/elasticsearch/elasticsearch.yml
# 启动服务
sudo systemctl start elasticsearch.service
# 设置开机启动(可选)
sudo systemctl enable elasticsearch.service

Springboot 配置使用 Elasticsearch
Springboot 配置使用 Elasticsearch

不要忘记开放防火墙端口,控制台输入curl -X GET "localhost:9200/"或浏览器访问 IP:9200

Springboot 配置使用 Elasticsearch

Springboot 配置使用 Elasticsearch

开放防火墙 9200 端口

# Debian/Ubuntu ufw
ufw allow 9200
ufw reload
# Debian/Ubuntu iptables(这个叼毛防火墙好麻烦,我没用过,不知道是不是这样)
iptables -A INPUT -p tcp --dport 9200 -j ACCEPT
iptables-restore
# CentOS
firewall-cmd --zone=public --add-port=9200/tcp --permanent
firewall-cmd --reload

二、开始写代码

先给你们看一下项目结构

Springboot 配置使用 Elasticsearch

1、引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

2、配置文件

两种方式选一种就可以了

(1) yml 方式

默认的 elasticsearch 不需要密码登录,所以不需要写

server:
  port: 8081
spring:
  elasticsearch:
  	# elasticsearch地址
    uris: 192.168.0.105:9200
#    username: elasticsearch
#    password: 3ve6fT0TQreeQslzkiojCA
    connection-timeout: 30000
    socket-timeout: 50000
    socket-keep-alive: false

(1) api 方式

新建ElasticSearchConfig,这里面的配置会覆盖掉yml里面的

package pers.xuyijie.elasticsearchdemo.config;

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;

/**
 * @author 徐一杰
 * @date 2022/9/20 17:39
 * @description
 */
@SpringBootConfiguration
public class ElasticSearchConfig {
    @Bean
    public ElasticsearchClient elasticsearchClient(){
        RestClient client = RestClient.builder(new HttpHost("192.168.0.105", 9200))
                .setRequestConfigCallback(requestConfigBuilder -> requestConfigBuilder
                        .setConnectTimeout(30000)
                        .setSocketTimeout(50000))
                        .build();
        ElasticsearchTransport transport = new RestClientTransport(client, new JacksonJsonpMapper());
        return new ElasticsearchClient(transport);
    }
}


3、新建 User 实体类

id这个字段一定要有,作为主键索引,这个@Document里面的indexName就相当于mysql里面的表名,在elasticsearch里面叫索引

package pers.xuyijie.elasticsearchdemo.document;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;

/**
 * @author 徐一杰
 * @date 2022/9/20 17:58
 * @description
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(indexName = "user")
public class User {
    @Id
    private String id;
    private String name;
    private String sex;
    private Integer age;
}


4、新建 UserRepository

这里就和 mybatis 一样了,继承一下可以使用内置方法

package pers.xuyijie.elasticsearchdemo.repository;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.annotations.Query;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import pers.xuyijie.elasticsearchdemo.document.User;

import java.util.List;

/**
 * @author 徐一杰
 * @date 2022/9/20 18:25
 * @description
 */
public interface UserRepository extends ElasticsearchRepository<User, String> {

}

5、新建 Controller

下面我把这3个controller的代码放出来,方法很简单,都是增删改查,都有写注释,等下测试用

Springboot 配置使用 Elasticsearch
DocumentTestController.java

package pers.xuyijie.elasticsearchdemo.controller;

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch._types.SortOrder;
import co.elastic.clients.elasticsearch.core.*;
import co.elastic.clients.elasticsearch.core.bulk.BulkOperation;
import co.elastic.clients.elasticsearch.core.search.Hit;
import co.elastic.clients.transport.endpoints.BooleanResponse;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import pers.xuyijie.elasticsearchdemo.document.User;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 徐一杰
 * @date 2022/9/20 18:02
 * @description
 */
@RestController
@RequestMapping("/documentTest")
public class DocumentTestController {

    private final ElasticsearchClient elasticsearchClient;

    public DocumentTestController(ElasticsearchClient elasticsearchClient){
        this.elasticsearchClient = elasticsearchClient;
    }

    @RequestMapping("/insert")
    public void insert() throws IOException {
        User user = new User("1", "user1", "男", 18);
        IndexResponse indexResponse = elasticsearchClient.index(i -> i
                .index("user")
                //设置id
                .id("1")
                //传入user对象
                .document(user));
        System.out.println(indexResponse);
    }

    @RequestMapping("/update")
    public void update() throws IOException {
        UpdateResponse<User> updateResponse = elasticsearchClient.update(u -> u
                        .index("user")
                        .id("1")
                        .doc(new User("1", "user2", "男", 19))
                , User.class);
        System.out.println(updateResponse);
    }

    @RequestMapping("/isExists")
    public void isExists() throws IOException {
        BooleanResponse indexResponse = elasticsearchClient.exists(e -> e.index("user").id("1"));
        System.out.println(indexResponse.value());
    }

    @RequestMapping("/get")
    public void get() throws IOException {
        GetResponse<User> getResponse = elasticsearchClient.get(g -> g
                        .index("user")
                        .id("1")
                , User.class
        );
        System.out.println(getResponse.source());
    }

    @RequestMapping("/delete")
    public void delete() throws IOException {
        DeleteResponse deleteResponse = elasticsearchClient.delete(d -> d
                .index("user")
                .id("1")
        );
        System.out.println(deleteResponse.id());
    }

    @RequestMapping("/insertMultiple")
    public void insertMultiple() throws IOException {
        List<User> userList = new ArrayList<>();
        userList.add(new User("10", "user1", "男", 18));
        userList.add(new User("11", "user2", "男",19));
        userList.add(new User("12", "user3", "女",20));
        userList.add(new User("13", "user4", "女",21));
        userList.add(new User("14", "user5", "女",22));
        List<BulkOperation> bulkOperationArrayList = new ArrayList<>();
        //遍历添加到bulk中
        for(User user : userList){
            bulkOperationArrayList.add(BulkOperation.of(o->o.index(i->i.document(user))));
        }

        BulkResponse bulkResponse = elasticsearchClient.bulk(b -> b.index("user")
                .operations(bulkOperationArrayList));
        System.out.println(bulkResponse);
    }

    @RequestMapping("/getComplex")
    public void getComplex() throws IOException {
        SearchResponse<User> search = elasticsearchClient.search(s -> s
                .index("user")
                //查询name字段包含hello的document(不使用分词器精确查找)
                .query(q -> q
                        .term(t -> t
                                .field("name")
                                .value(v -> v.stringValue("hello"))
                        ))
                //分页查询,从第0页开始查询3个document
                .from(0)
                .size(3)
                //按age降序排序
                .sort(f->f.field(o->o.field("age").order(SortOrder.Desc))),User.class
        );
        for (Hit<User> hit : search.hits().hits()) {
            System.out.println(hit.source());
        }
    }

}

IndexTestController.java

package pers.xuyijie.elasticsearchdemo.controller;

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.indices.CreateIndexResponse;
import co.elastic.clients.elasticsearch.indices.DeleteIndexResponse;
import co.elastic.clients.elasticsearch.indices.GetIndexResponse;
import co.elastic.clients.transport.endpoints.BooleanResponse;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;

/**
 * @author 徐一杰
 * @date 2022/9/20 17:52
 * @description Index的增删查,Index类似于数据库名
 */
@RestController
@RequestMapping("/indexTest")
public class IndexTestController {

    private final ElasticsearchClient elasticsearchClient;

    public IndexTestController(ElasticsearchClient elasticsearchClient){
        this.elasticsearchClient = elasticsearchClient;
    }

    @GetMapping("/insert")
    public void insert() throws IOException {
        CreateIndexResponse createIndexResponse = elasticsearchClient.indices().create(c -> c.index("user"));
        System.out.println(createIndexResponse);
    }

    @GetMapping("/get")
    public void get() throws IOException {
        GetIndexResponse getIndexResponse = elasticsearchClient.indices().get(c -> c.index("user"));
        System.out.println(getIndexResponse);
    }

    @GetMapping("/delete")
    public void delete() throws IOException {
        DeleteIndexResponse deleteIndexResponse = elasticsearchClient.indices().delete(c -> c.index("user"));
        System.out.println(deleteIndexResponse.acknowledged());
    }

    @GetMapping("/isExists")
    public void isExists() throws IOException {
        BooleanResponse booleanResponse = elasticsearchClient.indices().exists(c -> c.index("user"));
        System.out.println(booleanResponse.value());
    }

}

UserController.java

package pers.xuyijie.elasticsearchdemo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import pers.xuyijie.elasticsearchdemo.document.User;
import pers.xuyijie.elasticsearchdemo.repository.UserRepository;

/**
 * @author 徐一杰
 * @date 2022/9/20 18:28
 * @description
 */
@RestController
@RequestMapping("/user")
public class UserController {

    private final UserRepository userRepository;

    public UserController(UserRepository userRepository){
        this.userRepository = userRepository;
    }

    /**
     * 添加
     */
    @RequestMapping("/insert")
    public String insert() {
        User user = new User();
        user.setId("1");
        user.setName("徐一杰");
        user.setSex("男");
        user.setAge(22);
        userRepository.save(user);
        return "success";
    }

    /**
     * 删除
     */
    @RequestMapping("/delete")
    public String delete() {
        User user = userRepository.getUserById("1");
        userRepository.delete(user);
        return "success";
    }

    /**
     * 局部更新
     */
    @RequestMapping("/update")
    public String update() {
        User user = userRepository.getUserById("1");
        user.setName("泡泡");
        userRepository.save(user);
        return "success";
    }
    /**
     * 查询
     */
    @RequestMapping("/get")
    public User get() {
        User user = userRepository.getUserById("1");
        System.out.println(user);
        return user;
    }

	@RequestMapping("/findByQuery")
    public Page<User> findByQuery() {
        Pageable pageable = PageRequest.of(1,20, Sort.by(new Sort.Order(Sort.Direction.ASC, "age")));
        Page<User> userList = userRepository.findByName("1", pageable);
        System.out.println(userList);
        return userList;
    }

}


6、开始测试

(1) 启动项目

可以看到,我们的user索引自动添加到elasticsearch里面了

Springboot 配置使用 Elasticsearch

(2) 查询索引

我们调用 http://127.0.0.1:8081/indexTest/get,可以看到,控制台打印出 user 的信息

Springboot 配置使用 Elasticsearch

IndexTestController里面的方法都是操作索引的,删除、新增等

(3) 新增数据

我们先调用http://127.0.0.1:8081/documentTest/insert,往user里面添加一条数据,这是DocumentTestController里面的方法,这个controller里面的方法可以操作没有继承 ElasticsearchRepository 的实体类

Springboot 配置使用 Elasticsearch

下面我们查询出来我们刚刚插入的数据,这次我们调用 repository里面的内置方法,http://127.0.0.1:8081/user/get,查询成功

Springboot 配置使用 Elasticsearch


7、复杂查询条件

对于多条件查询,我们可以使用ElasticsearchRepository自带的衍生查询,关键词 find by 等等,有代码提示

Springboot 配置使用 Elasticsearch

package pers.xuyijie.elasticsearchdemo.repository;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.annotations.Query;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import pers.xuyijie.elasticsearchdemo.document.User;

import java.util.List;

/**
 * @author 徐一杰
 * @date 2022/9/20 18:25
 * @description
 */
public interface UserRepository extends ElasticsearchRepository<User, String> {

    /**
     * 衍生查询,直接指定查询方法名称便可查询,无需进行实现
     * 以下为根据用户名字和年龄不超过多少,并按年龄正序排列的例子
     * @param name
     * @param age
     * @return
     */
    List<User> findUsersByNameAndAgeBeforeOrderByAgeAsc(String name, int age);

    /**
     * 衍生查询,根据id查询
     * @param id
     * @return
     */
    User getUserById(String id);

    /**
     * 使用@Query注解可以用Elasticsearch的DSL语句进行查询
     * 根据名字查找(分页)
     * @param name
     * @param pageable
     * @return
     */
    @Query("'{\"bool\" : {\"must\" : {\"field\" : {\"name\" : \"?0\"}}}}'")
    Page<User> findByName(String name, Pageable pageable);

}

然后还有在DocumentTestController 里面的getComplex方法,也可以和构建复杂条件文章来源地址https://www.toymoban.com/news/detail-407599.html

@RequestMapping("/getComplex")
    public void getComplex() throws IOException {
        SearchResponse<User> search = elasticsearchClient.search(s -> s
                .index("user")
                //查询name字段包含hello的document(不使用分词器精确查找)
                .query(q -> q
                        .term(t -> t
                                .field("name")
                                .value(v -> v.stringValue("hello"))
                        ))
                //分页查询,从第0页开始查询3个document
                .from(0)
                .size(3)
                //按age降序排序
                .sort(f->f.field(o->o.field("age").order(SortOrder.Desc))),User.class
        );
        for (Hit<User> hit : search.hits().hits()) {
            System.out.println(hit.source());
        }
    }

总结

到了这里,关于Springboot 配置使用 Elasticsearch的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot使用ElasticSearch

    ES官网:https://www.elastic.co/cn/downloads/elasticsearch ES下载地址:https://www.elastic.co/cn/downloads/past-releases#elasticsearch kibana官网:https://www.elastic.co/cn/downloads/kibana kibana下载地址:https://www.elastic.co/cn/downloads/past-releases#kibana 下载完成后,进入到 bin 目录下 双击即可运行 运行完成后访问地

    2024年02月08日
    浏览(23)
  • springboot整合elasticsearch使用案例

    完成搜索和分页 添加品牌、城市、星级、价格等过滤功能 搜索我附近的酒店    让指定的酒店在搜索结果中排名置顶 添加isAD字段

    2024年02月09日
    浏览(34)
  • SpringBoot 使用 Elasticsearch 搜索引擎

    作者:禅与计算机程序设计艺术 Spring Boot 是由 Pivotal 团队提供的一套用于开发基于 Spring 框架的应用的工具包。其主要目标是通过提供简单易用的starter包来简化开发流程。Spring Boot 极大的地方在于其依赖自动配置,可以很好的满足开发人员的开发需求。Spring Boot 提供了数据访

    2024年02月09日
    浏览(48)
  • Elasticsearch解析和基于SpringBoot使用

    全文搜索(检索),工作原理:计算机索引程序,扫描文章中的每一个词,对每一个词建立一个索引,指明出现次数和位置。查询时通过索引进行查找,类似于查字典。 因为是通过索引在查,速度较于通过sql查,会快很多。 具体过程如下: 1、建文本库 2、建立索引 3、执行

    2024年02月19日
    浏览(21)
  • elasticsearch使用SpringBoot 连接Https问题

    SpringBoot整合elasticsearch初探:  导入相关的jar包。然后在配置文件中配置es的相关属性: 然后新建一个客户端工具类,将与es交互的所有基础操作写进工具类中,工具类注入连接es的客户端:  client直接注入就好,因为SpringBoot已经将客户端自动注册到Spring容器中了。 客户端尝

    2024年02月14日
    浏览(39)
  • SpringBoot集成elasticsearch使用(增删改查)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Elasticsearch 是一个实时的分布式存储、搜索、分析的引擎。(全文引擎) 系统 :windows 10 elasticsearch官网下载地址链接: 下载好对应的windows版本,解压到任意工作目录,es的安装非常方便,解压即用。 刚下载

    2024年02月06日
    浏览(59)
  • 项目中使用es(一):使用springboot操作elasticsearch

    写在前面 对于elasticsearch的搭建,前面写了一篇文章有简单描述如何搭建es,本次主要介绍如何在项目里使用,主要使用ElasticsearchRepository和ElasticsearchRestTemplate操作es。 搭建项目环境和选择合适版本 首先选择合适的项目组件版本,因为es版本和springboot版本有对应,如果不合适会

    2024年02月08日
    浏览(37)
  • Elasticsearch 7.6.1 安装和SpringBoot 使用

    下载地址 :Elasticesearch 7.6.1 双击bin目录下的elasticsearch.bat 原因:java 版本过低,建议使用jdk11 解决1:升级jdk11 解决2:找到config/jvm.options,编辑; 在最后一行添加: 配置后,再次启动elasticsearch,就只会提示建议使用jdk11 参考地址:AwuAwu Elasticsearch启动报错:future versions of Ela

    2023年04月09日
    浏览(32)
  • elasticsearch 8.2.3 安装及springboot简单使用

    一、下载安装 官网下载地址 https://www.elastic.co/cn/downloads/elasticsearch   解压 elasticsearch-8.2.3-windows-x86_64   修改配置 elasticsearch-8.2.3configelasticsearch.yml 启动服务 双击elasticsearch-8.2.3binelasticsearch.bat 运行 9300:Java程序访问的端口 9200:浏览器、HTTP访问的端口   二、客户端elastics

    2024年02月11日
    浏览(36)
  • SpringBoot整合Elasticsearch(最新最全,高效安装到使用)

    为了避免使用的Elasticsearch版本和SpringBoot采用的版本不一致导致的问题,尽量使用一致的版本。下表是对应关系: 我的SpringBoot版本: 所以选择对应Elasticsearch版本为7.12.0。 Elasticsearch各版本下载 Elasticsearch7.12.0官网下载 下载上面链接的安装包 解压到任意目录 启动es /bin/elasti

    2024年02月07日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包