安装ES

1,首先安装ES,这里使用docker,拉取镜像,这里选择版本为6.7.1

docker pull elasticsearch:6.7.1

如果下载速度过慢,可配置一下阿里云的镜像加速,本人亲测,配置前后下载速度,是公交车和地铁的区别

2.下载完成后是这样的

ELK docker部署 docker elastic_ELK docker部署


3.接下来我们要启动它,ES默认启动需要2G的内存,这边需要设置参数限制一下:docker run -d -e ES_JAVA_POTS="-Xms128m -Xmx128m" --name es0 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" e2667f5db289 说明:9200默认为ES的数据交互端口,9300为管理端口,discovery.type=single-node表示为单节点启动,这里我们不做集群,最后面为刚才下载的镜像ID,-Xms128m -Xmx128m表示指定最大内存为128M,我的阿里云配置简陋,本次是做测试,给小一点,能出效果就行,各位根据自身机器配置定义即可 4.正常启动,是这个样子的:

ELK docker部署 docker elastic_Computer_02


5。正常启动后,我们在浏览器上访问一下:101.101.45.102:9200,成功返回数据:

ELK docker部署 docker elastic_Computer_03


出现如上数据,则说明elasticsearch部署初步成功,接下来我们进行springboot整合elasticsearch,实现简单的数据索引。

**

spring boot整合Elasticsearch

**
1.新建一个springboot项目,我选择的版本是2.1.13.RELEASE,初步选择web依赖,创建项目即可.
2.springboot可以使用两种方式与elasticsearch 进行交互,一种是使用SpringData Elasticsearch,另一种是使用Jest,其中Jest是默认不生效的,需要配置,依赖如下:

<dependency>
            <groupId>io.searchbox</groupId>
            <artifactId>jest</artifactId>
            <version>6.3.1</version>
        </dependency>

3.我们先来测试Jest,引入依赖后,新建一个entity,

package com.weige.entity;

import io.searchbox.annotations.JestId;

public class Student {
    //表明这是一个ES需要用到的id
    @JestId
    private int id;
    private String sname;
    private String interest;

    public Student(int id, String sname, String interest) {
        this.id = id;
        this.sname = sname;
        this.interest = interest;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public String getInterest() {
        return interest;
    }

    public void setInterest(String interest) {
        this.interest = interest;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", sname='" + sname + '\'' +
                ", interest='" + interest + '\'' +
                '}';
    }
}

4.创建一个测试类,测试试索引(添加)该对象,代码如下:

package com.weige;

import com.weige.entity.Student;
import io.searchbox.client.JestClient;
import io.searchbox.core.Index;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.io.IOException;

@RunWith(SpringRunner.class)
@SpringBootTest
public class JestTest {
    //引入jest模板
    @Autowired
    JestClient jestClient;

    @Test
    public void JestPutIndex() {
        //创建一个对象
        Student student=new Student(1,"李明","李明喜欢踢足球");
        //创建索引并把数据索引到elasticsearch指定的位置
        Index index=new Index.Builder(student).index("weige").type("students").build();
        //执行索引操作
        try {
            jestClient.execute(index);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

运行该方法后,控制台出现一抹翠绿,证明索引成功,我们在浏览器进行验证

ELK docker部署 docker elastic_elasticsearch_04


出现这个,说明数据索引成功,接下来我们通过Java方法查询一下,再编写一个测试类:

@Test
    public void JestGetIndex() {
        String json="{\n" +
                "\t\"query\": {\n" +
                "\t\t\"match\": {\n" +
                "\t\t\t\t\t\"sname\": \"李明\"\n" +
                "\t\t\t\t}\n" +
                "\t\t}\n" +
                "}";
        Search search=new Search.Builder(json).addIndex("weige").addType("students").build();
        try {
            SearchResult searchResult=jestClient.execute(search);
            System.out.println("搜寻结果为---->"+searchResult);
            JSONObject jsStr = JSONObject.parseObject(searchResult.getJsonString()); //将字符串{“id”:1}
            Object obret=jsStr.get("hits");
            JSONObject jsStr1 = JSONObject.parseObject(obret.toString());
            Object lm=jsStr1.get("hits");
            System.out.println("结果为---->"+lm);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

这里的查询json串是这个值:{
“query”: {
“match”: {
“sname”: “明”
}
}
}
查询出来的数据,包裹的挺严实,我们需要做适当的解析
具体更多的的查询语法规则,可以参考Elasticsearch,数据能存能取,测试初步成功。
接下来我们测试一下使用SpringData Elasticsearch
1.引入依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>

2.新建一个entity

package com.weige.entity;

import org.springframework.data.elasticsearch.annotations.Document;

import java.math.BigDecimal;
//这里指定了索引名称和type名称
@Document(indexName = "weigee",type = "computer")
public class Computer {
    private Integer id;
    private String cname;
    private BigDecimal price;

    public Computer() {
    }

    public Computer(Integer id, String cname, BigDecimal price) {
        this.id = id;
        this.cname = cname;
        this.price = price;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getCname() {
        return cname;
    }

    public void setCname(String cname) {
        this.cname = cname;
    }

    public BigDecimal getPrice() {
        return price;
    }

    public void setPrice(BigDecimal price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Computer{" +
                "id=" + id +
                ", cname='" + cname + '\'' +
                ", price=" + price +
                '}';
    }
}

3.新建一个mapper,继承ElasticsearchRepository<Computer ,Integer>,并自定义一个根据名称查询所有的方法;

package com.weige.mapper;

import com.weige.entity.Computer;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

import java.util.List;

public interface ComputerMapper extends ElasticsearchRepository<Computer,Integer> {
    public List<Computer> findComputerByCname(String cname);
}

4.测试索引数据

@Test
    public void testSpingDataPut(){
        //Computer computer=new Computer(1,"苹果",new BigDecimal("15500.00"));
        // Computer computer=new Computer(2,"三星",new BigDecimal("9500.00"));
        Computer computer=new Computer(3,"中星",new BigDecimal("7500.00"));
        computerMapper.index(computer);
    }

5.查询数据

@Test
    public void testSpingDataGet(){
        List<Computer> computers=computerMapper.findComputerByCname("星");//搜索名称中包含‘星’的对象打印出来
        for (Computer c:computers) {
            System.out.println(c.getCname());
        }
    }

控制台输出

ELK docker部署 docker elastic_elasticsearch_05


如此这般,springboot整合elasticsearch,实现简单的数据存取功能就实现了,更多功能特性尚在研究中,不足之处,欢迎大家指正