美文网首页springboot技术相关
springboot整合elasticsearch

springboot整合elasticsearch

作者: kafeimao | 来源:发表于2019-05-03 21:23 被阅读0次

准备

jdk1.8
elasticsearch 5.5.2
springboot 1.5.6RELEASE
maven 3.5.0
node.js 8.11.4
postman工具
jdk,maven,node,postman的安装就不管了

1、安装elasticsearch

下载压缩包

到elastic官网:https://www.elastic.co/cn/downloads/past-releases下载
我这里下载的是5.5.2windows版本的

image.png
修改配置文件

解压后,修改config文件夹下的配置文件jvm.options,默认jvm的内容是2g,我修改为256m,测试嘛我就搞小点,不改也行,只要电脑的内存够用就行


image.png

修改之后


image.png
启动

在bin目录下,点击elasticsearch.bat文件启动,看到关键字started就是启动成功了


image.png

elastic默认端口是9200,到浏览器访问localhost:9200


image.png

2、elasticsearch的head插件(es界面)

下载

下载地址:https://github.com/mobz/elasticsearch-head

启动

进入elasticsearch-head-master文件夹
下载依赖: npm install
启动:npm run start


image.png

访问localhost:9100


image.png
结果是未连接,暂时不知道什么原因,以后知道了再补充上,但是建立起elasticsearch的集群后他就连接成功了,就先放着了,接着看安装elastic的集群搭建

3、elasticsearch集群安装

主节点

修改配置文件elasticsearch.yml,将下面这些配置添加进去

#指定集群的名称
cluster.name: syf
#节点名称
node.name: master
#是不是主节点
node.master: true
node.attr.rack: r1
#最大集群节点数
node.max_local_storage_nodes: 3
#网关地址
network.host: 127.0.0.1
#端口
http.port: 9200
#内部节点之间沟通端口
transport.tcp.port: 9300
# 开启安全防护(启用跨域访问)
http.cors.enabled: true
http.cors.allow-origin: "*"
#时间放长,防止脑裂
discovery.zen.ping_timeout: 120s
client.transport.ping_timeout: 60s
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type
#配置有机会参与选举为master的节点
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300","127.0.0.1:9301","127.0.0.1:9302"]
#elasticSearch服务器的数据目录和日志目录,可以自行新建后配置路径使elasticSearch服务启动后将运行数据和日志生成到指定目录下
path.data: E:\syf\down\elasticsearch-5.5.2\data
path.logs: E:\syf\down\elasticsearch-5.5.2\logs

其中path.data和path.logs换成你自己的路径,

从节点

将主节点复制两份作为两个从节点


image.png

分别修改elasticsearch.yml配置文件

#指定集群的名称
cluster.name: syf
#节点名称
node.name: slave1
#是不是主节点
node.master: false
node.attr.rack: r1
#最大集群节点数
node.max_local_storage_nodes: 3
#网关地址
network.host: 127.0.0.1
#端口
http.port: 9201
#内部节点之间沟通端口
transport.tcp.port: 9301
# 开启安全防护(启用跨域访问)
http.cors.enabled: true
http.cors.allow-origin: "*"
#时间放长,防止脑裂
discovery.zen.ping_timeout: 120s
client.transport.ping_timeout: 60s
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type
#配置有机会参与选举为master的节点
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300","127.0.0.1:9301","127.0.0.1:9302"]
#elasticSearch服务器的数据目录和日志目录,可以自行新建后配置路径使elasticSearch服务启动后将运行数据和日志生成到指定目录下
path.data: E:\syf\down\elasticsearch-5.5.2.1\data
path.logs: E:\syf\down\elasticsearch-5.5.2.1\logs
#指定集群的名称
cluster.name: syf
#节点名称
node.name: slave2
#是不是主节点
node.master: false
node.attr.rack: r1
#最大集群节点数
node.max_local_storage_nodes: 3
#网关地址
network.host: 127.0.0.1
#端口
http.port: 9202
#内部节点之间沟通端口
transport.tcp.port: 9302
# 开启安全防护(启用跨域访问)
http.cors.enabled: true
http.cors.allow-origin: "*"
#时间放长,防止脑裂
discovery.zen.ping_timeout: 120s
client.transport.ping_timeout: 60s
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type
#配置有机会参与选举为master的节点
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300","127.0.0.1:9301","127.0.0.1:9302"]
#elasticSearch服务器的数据目录和日志目录,可以自行新建后配置路径使elasticSearch服务启动后将运行数据和日志生成到指定目录下
path.data: E:\syf\down\elasticsearch-5.5.2.2\data
path.logs: E:\syf\down\elasticsearch-5.5.2.2\logs
启动集群

依次启动三个节点,再访问localhost:9100,直接访问可能还得不到效果,需要等一会儿,这里我在搭建的时候等了大概3分钟,所有节点才启动了完了,


image.png

4、elasticsearch的CRUD

直接使用head插件进行操作的话,似乎只能进行创建索引这样的操作,所以我们使用工具,postman,elasticsearch提供了restful的api,postman是一个调试接口的利器
在进行crud操作前,先说明几个概念

概念 描述
索引(index) 可以简单理解为数据库中的 库(database)
类型(type) 就相当于数据库中 表(table)
文档(doc) 就相当于一条数据
分片 es创建索引时默认5个分片,5个分片共同存放一个索引
备份 es默认一个分片一个备份

打开postman创建一个book索引,其中给一个novel类型并定义文档的结构


image.png

创建索引的json

{
    "settings":{
        "number_of_shards":5,
        "number_of_replicas":1
    },
    "mappings":{
        "novel":{
            "properties":{
                "title":{
                    "type":"text"
                },
                "price":{
                    "type":"integer"
                },
                "date":{
                    "type":"date",
                    "format":"yyyy-MM-dd"
                }
            }
        }
    }
}

下图表示成功


image.png

访问localhost:9100


image.png
其中细线的代表备份,比如细线0为粗线0的备份,以此类推
增加一个文档
image.png
image.png
修改文档
image.png
image.png

书名成功修改为了西游记

获取文档
image.png
image.png
删除文档

5、springboot整合elasticsearch

创建一个maven项目

目录结构
image.png
pom依赖
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.6.RELEASE</version>
  </parent>
  <properties>
    <elasticsearch.version>5.5.2</elasticsearch.version>
    <java.version>1.8</java.version>
  </properties>
  <dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>transport</artifactId>
        <version>${elasticsearch.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.7</version>
    </dependency>
  </dependencies>
Config.java
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class Config {
    @SuppressWarnings("resource")
    @Bean
    public TransportClient getTransportClient() throws UnknownHostException{
        InetSocketTransportAddress node = new InetSocketTransportAddress(
                InetAddress.getByName("localhost"),
                9300//9300是elastic的transport使用的端口
        );
        Settings settings = Settings.builder().put("cluster.name","syf").build();
        TransportClient client = new PreBuiltTransportClient(settings);
        client.addTransportAddress(node);
        return client;
    }
}
BookController.java
@RestController
@RequestMapping("/book")
public class BookController {
    @Autowired
    private TransportClient client;
    
    @RequestMapping("/novel/get")
    public Object get(String id){
        GetResponse result = client.prepareGet("book","novel",id).get();
        return result.getSource();
    }
    @RequestMapping("/novel/add")
    public Object add(String title,String price,String date){
        try {
            XContentBuilder content = XContentFactory.jsonBuilder()
                    .startObject()
                    .field("title",title)
                    .field("price",price)
                    .field("date",date)
                    .endObject();
            IndexResponse result = client.prepareIndex("book", "novel").setSource(content).get();
            return result.getResult();
        } catch (Exception e) {
            // TODO: handle exception
        }
        return null;
    }
    @RequestMapping("/novel/delete")
    public Object delete(String id){
        DeleteResponse result = client.prepareDelete("book", "novel", id).get();
        return result.getResult();
    }
    @RequestMapping("/novel/update")
    public Object update(String id,String title,String price,String date){
        UpdateRequest update = new UpdateRequest("book", "novel", id);
        try {
            XContentBuilder content = XContentFactory.jsonBuilder().startObject();
            content.field("title", title).field("price",price).field("date",date);
            content.endObject();
            update.doc(content);
            UpdateResponse result = client.update(update).get();
            return result.getResult();
        } catch (Exception e) {
            // TODO: handle exception
        }
        return null;
    }
    @RequestMapping("/novel/query")
    public Object query(String title,String price){
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        if(title!=null){
            boolQuery.must(QueryBuilders.matchQuery("title", title));
        }
        SearchRequestBuilder search = client.prepareSearch("book").setTypes("novel")
        .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
        .setQuery(boolQuery);
        List<Map<String, Object>> result = new ArrayList<Map<String,Object>>();
        SearchResponse response = search.get();
        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            result.add(hit.getSource());
        }
        return result;
    }
}

springboot默认监听8080,增删改查自己测试,我测试过是可以的
完整代码下载地址:https://gitee.com/shyf2019/springboot_elasticsearch

相关文章

网友评论

    本文标题:springboot整合elasticsearch

    本文链接:https://www.haomeiwen.com/subject/frbnnqtx.html