elasticsearch+springboot 集群环境集成

windows下部署

折腾了两天了,因为elasticsearch版本不同意,各种尝试,最后总结规律

elasticsearch的版本和springboot引入jar的版本最好一致,不然会出现各种疑难杂症。

本次使用elasticsearch5.5.0运行,jar也是5.5.0

集群搭建,可以不配置环境变量 方法com进入安装文件目录bin 启动elasticsearch.bat

本机搭建模拟三个服务器

主服务器config/下yml配置

http.cors.enabled: true
http.cors.allow-origin: "*"

#名字  主服务器和节点服务器必须一致
cluster.name: wali  

#master主服务器
node.name: master

#确认主服务器,此处还有另一个意思,就是备选主机,当主机死了时 如果有节点服务器设置 node.master:true时,可是当做备选主机
node.master: true

#本机ip
network.host: 127.0.0.1


节点服务器1

cluster.name: wali
node.name: serve1

#非备选主机
node.master: false

network.host: 127.0.0.1

#设置端口号,可以不设置端口号 默认9200
http.port: 8200

#主服务器地址
discovery.zen.ping.unicast.hosts: ["127.0.0.1"]

节点服务器2

cluster.name: wali
node.name: serve2
node.master: false

network.host: 127.0.0.1
http.port: 8000
discovery.zen.ping.unicast.hosts: ["127.0.0.1"]

安装elasticsearch-head-master插件,此处略

启动顺序 先启动主服务器  在启动节点服务器 启动之后  粗线框住分片  细线是备份


创建数据结构 创建脚本不多说,拿来直接上

put 127.0.0.1:9200/client

{


"mappings": {
"book": {
"properties": {
"name": {
"type": "text"
},
"author": {
"type": "text"
},
"typeworks": {
"type": "integer"
},
"typework": {
"type": "integer"
},
"workscount": {
"type": "long"
},
"store": {
"type": "integer"
},
"state": {
"type": "integer"
},
"createdate": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd"
},
"updatedate": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd"
}
}
}
}
}

返回值 表示创建成功


插入数据 注意细节 提交方式


查看es里已经插入的数据


接下来集成springboot里,首先pom文件

<properties>
    <elasticsearch.version>5.5.0</elasticsearch.version>
</properties>

<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>${elasticsearch.version}</version>
</dependency>
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>transport</artifactId>
    <version>${elasticsearch.version}</version>
</dependency>


yml文件配置,tcp端口号默认9300


clasticsearch注入 新建一个类即可,我这里把包也贴出来,防止导错包

package com.example.demo.config;


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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * Created by Alex on 2018/1/24.
 */
@Configuration
public class EsConfig {

    @Value("${spring.elasticsearch.host}")
    private String host;//elasticsearch的地址

    @Value("${spring.elasticsearch.port}")
    private Integer port;//elasticsearch的端口

    private static final Logger logger = LoggerFactory.getLogger(EsConfig.class);

    @Bean
    public TransportClient esclient() {

        InetSocketTransportAddress node = null;
        try {
//            node = new InetSocketTransportAddress(InetAddress.getByName(host), port);
            node = new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300);
        } catch (UnknownHostException e) {
            e.printStackTrace();
            logger.error("创建elasticsearch客户端失败");
        }
        logger.info("创建elasticsearch客户端成功");
        Settings settings = Settings.builder()
                .put("cluster.name", "wali")
                .build();
        TransportClient client = new PreBuiltTransportClient(settings);
        client.addTransportAddress(node);
        //集群可以new多个地址node 在add进去
        return client;

    }
}
下一步查询数据

package com.example.demo.controller;

import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 书籍控制器
 * 主要目的 实现elasticsearch的查询功能演练
 * Created by Alex on 2018/1/25.
 */
@RestController
@RequestMapping("/esbook")
public class ESClientBookController {

    /**
     * 注入es操作对象
     */
    @Autowired
    private TransportClient client;

    // TODO: 2018/1/26 http://127.0.0.1:9200/client/book/1 
    @GetMapping(value = "/get")
    public ResponseEntity get() {

        GetResponse result = client.prepareGet("client", "book", "1").get();
        if (!result.isExists()) {
            return new ResponseEntity(HttpStatus.NOT_FOUND);
        }
        return new ResponseEntity(result.getSource(), HttpStatus.OK);
    }


}

到此集成完毕

介绍下elasticsearch的一些基本查询语法

修改数据
people类型  man表  1数据  _update标识要更改id等于1的数据
127.0.0.1:9200/people/man/1/_update
关键字 doc  后面直接属性对应要修改的名字
{
"doc":{
"name": "谁是XXX"
}
}

1_update id号
127.0.0.1:9200/people/man/1_update/_update
脚本语言更新  "painless",
内置脚本语言
{
"script":{
"lang": "painless",
"inline": " ctx._source.date='2018-01-23' "
}
}
删除操作
1_update 是id
【delete 】127.0.0.1:9200/people/man/1_update/

查询操作1是id
get 127.0.0.1:9200/people/man/1
条件查询
【post】127.0.0.1:9200/people/_search
{
"query": {
"match_all":{}
}
}
{
"query": {
"match":{
 }
},
"from":1,
"size":1
}//from指定从哪里返回 size指定返回多少数据


{
"query": {
"match":{
"name": "谁是瓦力"
}
}
}指定条件查询


{
"query": {
"match":{
"name": "谁是瓦力"
}
},
"sort": {
"date": {"order": "asc"}
}
}指定字段排序查询


多聚合条件查询
aggs 聚合条件查询的关键字
group_by_age_count自定义名字 按照age聚合查询
group_by_date自定义名字 按照date聚合查询
{"aggs": {"group_by_age_count": {"terms":{"field":"age" }},"group_by_date": {"terms": {"field": "date"}}}


stats提取计算 按照age计算  也可以指定函数min max
{"aggs": {"grades_age_count": {"stats": {"field":"age"}}}}
结果 "aggregations": { "grades_age_count": {"count": 2,
 "min": 40, "max": 40,"avg": 40,
"sum": 80
}}


模糊匹配查询 关键字match
{"query": {"match": {"name":"力"}}}


短语匹配
{"query": {"match_phrase": {"name":"超重瓦"} }}


多条件匹配 name和country里都包含a的数据出来
{"query": {"multi_match": {"query":"a","fields": ["name","country"]}}}


语法查询 关键字query_string 查询name和country里包含 瓦力 或者or a的数据  or语法查询 或者and  "瓦力 or a"也可以加更多逻辑条件 "(瓦力 and a) or 重"
{"query": {"query_string": {"query":"瓦力 or a","fields": ["name","country"]}}}


具体项查询
{ "query": { "term": { "age":"40" } }
age大于等于30小于等于50的数据
{ "query": { "range": { "age":{"gte":30,"lte":"50"} } }}
date日期格式查询
{ "query": { "range": { "date":{"gt":"1980-03-03","lte":"1990-03-03"} } }}


filter context //比如女友问你爱不爱我,你的回答是爱或者不爱  query的结果是 很爱 特别爱 非常非常爱
关键词bool 字符串匹配
{ "query": { "bool": { "filter":{"term":{"name":"瓦力"}}} }}


  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值