springboot整合elasticsearch

准备

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容