美文网首页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