Elasticsearch的部署和使用

首先对java来说,我们可用的有原生elasticsearch和经过spring二次封装的spring data elasticsearch.

后者自带了一些方法,类似于mybatisplus,可以直接使用,十分方便.

如果是spring项目都建议使用第二种,除非你要深度使用.

首先是服务器的部署.部署之前要知道版本,我在部署时遇到一个问题,我的demo使用的springboot2.5.5版本.对应的spring data elasticsearch会自动跟随springboot的版本进行下载依赖,

它对应的elasticsearch版本为7.1,7.1在服务器运行时至少需要jdk11.

所以为了保持一致,我降低了demo的springboot版本为2.2.6.

对应的spring data elasticsearch所用的elasticsearch版本为6.8,在服务器部署的时候支持jdk8.

先去下载,官网地址为https://www.elastic.co/downloads/past-releases/elasticsearch-6-8-23,

如果需要别的版本在这里选择https://www.elastic.co/downloads/past-releases#elasticsearch.

下载完上传至服务器.我放在/data/elasticsearch.然后解压

解压后cd到对应文件夹下./bin/elasticsearch报错,提示不能用root启动

遂单独建了一个账号叫elasticsearch

sudo adduser elasticsearch

更改该文件夹的所有权

sudo chown -R elasticsearch:elasticsearch /data/elasticsearch/elasticsearch-6.8.23

切换用户

sudo -i -u elasticsearch

进到对应文件夹

cd /data/elasticsearch/elasticsearch-6.8.23

启动项目报新的错误,max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

该报错表示你需要增加 vm.max_map_count 参数,这个参数设置可以提高 Elasticsearch 的性能。

切换到root账号,临时性的增加该参数

sudo sysctl -w vm.max_map_count=262144

如果想永久生效,可以将其添加到 /etc/sysctl.conf 文件中:

echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf

后台启动项目并保存日志

nohup ./bin/elasticsearch > elasticsearch.log 2>&1 &

至此项目启动成功,但是通过ip:端口无法访问,本地项目也无法连接至es

原因是默认只允许本地访问,如果要修改需要改配置文件

在/data/elasticsearch/elasticsearch-6.8.23/config的elasticsearch.yml中,

有一个参数network.host: 是被注释的状态,被注释就采用默认值.

放开注释,修改为network.host: 0.0.0.0允许全部IP访问

或者修改为固定IP 允许固定IP访问,然后重新启动项目即可.

最后放开阿里云/腾讯云服务器的9200端口,放开宝塔9200端口,就可以直接IP:端口访问,看到如此页面就是成功了

接下来就是项目配置使用来连接服务器的es

首先是依赖,注意直接使用ES和使用spring data elasticsearch的依赖是不同的,我这里是后者

java 复制代码
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>

然后就是一个大坑,chatgpt告诉我的配置层级是这样的

但是idea就已经提醒该uris不可达,导致项目怎么启动都是默认连接localhost的

后来研究出来配置层级是这样

如果是直接用原生ES 需要去配置一个配置类,但是使用spring data的只需要配置yml就可以 无需配置类.

然后就是代码相关:

java 复制代码
@Data
@Document(indexName = "user")
public class User {
    @Id
    private Long id;
    //type = FieldType.Text代表需要全文检索的字段,会被分词
    @Field(type = FieldType.Text)
    private String name;
    //type = FieldType.Keyword意思是精确匹配 不需要分词
    @Field(type = FieldType.Keyword)
    private String phone;
    @Field(type = FieldType.Text)
    private String remark;
}

@Document就是ES的注解,indexName带上表名.

@Id是import org.springframework.data.annotation.Id;

@Field(type=里面是一个枚举,有很多ES支持的格式,该格式会影响到存到ES之后的索引格式.

如果你提前创建索引则以你的为准,不提前创建索引则会根据对象里的@Field字段以及第一条数据去自动创建对应的索引

service层的代码

java 复制代码
public interface UserService {
    public User findByName(String email);
    public User saveClient(User client);
    public User getClientById(String id);
    public void deleteClient(String id);
    public Iterable<User> getAllClients();
}

impl的代码

java 复制代码
@Service
public class UserServiceImpl implements UserService{
    @Autowired
    private UserRepository userRepository;
    /**
     * 回参为单个对象,类似于mp的getOne,查出多个结果会报错
     * 回参为list 则可以查出多个结果
     */
    @Override
    public User findByName(String name) {
        return userRepository.findByName(name);
    }
    public User saveClient(User client) {
        return userRepository.save(client);
    }
    public User getClientById(String id) {
        return userRepository.findById(id).orElse(null);
    }
    public void deleteClient(String id) {
        userRepository.deleteById(id);
    }
    public Iterable<User> getAllClients() {
        return userRepository.findAll();
    }
}

Repository层,在我理解类似于mysql的mapper层

java 复制代码
@Component
public interface UserRepository extends ElasticsearchRepository<User, String> {
    //这里会根据查询方法名称解析法自动去创建对应的方法
    //findBy...: 根据指定字段查找。例如 findByEmail 会查找 email 字段。
    //findFirstBy...: 查找符合条件的第一个记录。如果有多个结果会报错
    //countBy...: 统计符合条件的记录数量。
    //existsBy...: 判断是否存在符合条件的记录。
    //Spring Data Elasticsearch 还支持多种查询条件关键词,例如:
    //And: 组合条件查询。
    //Or: 或条件查询。
    //Between: 范围查询。
    //LessThan: 小于查询。
    //GreaterThan: 大于查询。
    //findByAgeGreaterThan: 查找 age 大于指定值的文档。
    //findByEmailLike: 查找 email 包含指定字符串的文档。

    /**
     * 例:这个方法会自动根据name去查询,必须有name字段否则会报错!
     */
    User findByName(String name);
    List<User> findByNameLike(String name);
    List<User> findByNameLikeAndPhoneLike(String name,String phone);
    List<User> findByNameLikeOrPhoneLike(String name,String phone);
}

这个Repository有点东西,他会根据方法名称自动去根据字段进行查询,不需要再写额外的类似于sql的东西,如果需要更复杂的查询可以手动构建query去查.

至此over~

相关推荐
你觉得2056 小时前
哈尔滨工业大学DeepSeek公开课:探索大模型原理、技术与应用从GPT到DeepSeek|附视频与讲义下载方法
大数据·人工智能·python·gpt·学习·机器学习·aigc
啊喜拔牙6 小时前
1. hadoop 集群的常用命令
java·大数据·开发语言·python·scala
Elasticsearch7 小时前
Elasticsearch:使用机器学习生成筛选器和分类标签
elasticsearch
别惊鹊7 小时前
MapReduce工作原理
大数据·mapreduce
8K超高清7 小时前
中国8K摄像机:科技赋能文化传承新图景
大数据·人工智能·科技·物联网·智能硬件
2401_871290588 小时前
MapReduce 的工作原理
大数据·mapreduce
SelectDB技术团队9 小时前
Apache Doris 2025 Roadmap:构建 GenAI 时代实时高效统一的数据底座
大数据·数据库·数据仓库·人工智能·ai·数据分析·湖仓一体
你觉得2059 小时前
浙江大学朱霖潮研究员:《人工智能重塑科学与工程研究》以蛋白质结构预测为例|附PPT下载方法
大数据·人工智能·机器学习·ai·云计算·aigc·powerpoint
益莱储中国10 小时前
世界通信大会、嵌入式展及慕尼黑上海光博会亮点回顾
大数据
Loving_enjoy10 小时前
基于Hadoop的明星社交媒体影响力数据挖掘平台:设计与实现
大数据·hadoop·数据挖掘