这就是我踩过的坑

我们先去官网下载elasticsearch

Windows:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.2.0.zip

Linux:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.2.0.tar.gz

这就是我踩过的坑

我们先去官网下载elasticsearch

Windows:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.2.0.zip

Linux:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.2.0.tar.gz

解压后我们复制三份出来分别命名为:elasticsearch-5.5.2-noed1、elasticsearch-5.5.2-noed2、elasticsearch-5.5.2-noed3
然后我们进入各个里面的config文件夹里面找到 elasticsearch.yml 文件,在最后添加上如下配置,IP地址换为自己电脑的IP地址。

elasticsearch-5.5.2-noed1:

#节点1的配置信息:  
cluster.name: elasticsearch   #集群名称,保证唯一  
node.name: Elasticsearch-node1   #节点名称,必须不一样  
network.host: 192.168.0.103   #必须为本机的ip地址  
http.port: 9200   #服务端口号,在同一机器下必须不一样  
transport.tcp.port : 9300   #集群间通信端口号,在同一机器下必须不一样  
#设置集群自动发现机器ip集合  
discovery.zen.ping.unicast.hosts: ["192.168.0.103:9300", "192.168.0.103:9301", "192.168.0.103:9302"]

elasticsearch-5.5.2-noed2:

#节点1的配置信息:  
cluster.name: elasticsearch   #集群名称,保证唯一  
node.name: Elasticsearch-node1   #节点名称,必须不一样  
network.host: 192.168.0.103   #必须为本机的ip地址  
http.port: 9201   #服务端口号,在同一机器下必须不一样  
transport.tcp.port : 9301   #集群间通信端口号,在同一机器下必须不一样  
#设置集群自动发现机器ip集合  
discovery.zen.ping.unicast.hosts: ["192.168.0.103:9300", "192.168.0.103:9301", "192.168.0.103:9302"]

elasticsearch-5.5.2-noed3:

#节点1的配置信息:  
cluster.name: elasticsearch   #集群名称,保证唯一  
node.name: Elasticsearch-node1   #节点名称,必须不一样  
network.host: 192.168.0.103   #必须为本机的ip地址  
http.port: 9202   #服务端口号,在同一机器下必须不一样  
transport.tcp.port : 9302   #集群间通信端口号,在同一机器下必须不一样  
#设置集群自动发现机器ip集合  
discovery.zen.ping.unicast.hosts: ["192.168.0.103:9300", "192.168.0.103:9301", "192.168.0.103:9302"]

配置好之后就可以依次启动了,在bin目录下有启动脚本。

注意:IP地址别用localhost 或者 127.0.0.1 这是一个深坑w(゚Д゚)w

启动之后我们安装ElasticSearch Head这个插件,如果你用谷歌浏览器又能翻墙的话建议直接到谷歌商店去下载,这样很方便,如果你不具备以上条件请自行百度安装方法(以下截图为谷歌商店):

以下是测试安装是否正确:

接下来我们通过Spring Boot编写操作这个集群的Java代码,先看看我代码的目录结构:

以下是我们的代码和配置文件,使用maven工程构建,我的maven版本为:apache-maven-3.3.9,JDK版本:jdk1.8.0_111
代码如下:

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.yi</groupId>
  <artifactId>spring-boot-elasticsearch</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>spring-boot-elasticsearch</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <spring-boot.version>2.0.0.RELEASE</spring-boot.version>
    <hutool-all.version>4.0.2</hutool-all.version>
    <log4j.version>2.11.0</log4j.version>
    <spring-data-elasticsearch.version>3.0.3.RELEASE</spring-data-elasticsearch.version>
    <jna.version>4.5.1</jna.version>
    <junit.version>4.12</junit.version>
  </properties>

  <dependencies>
    <!--spring boot框架-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <version>${spring-boot.version}</version>
    </dependency>

    <!--Spring Boot视图模板-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-freemarker</artifactId>
      <version>${spring-boot.version}</version>
    </dependency>

    <!--配置文件读取-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-configuration-processor</artifactId>
      <version>${spring-boot.version}</version>
    </dependency>

    <!--elasticsearch -->
    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-elasticsearch</artifactId>
      <version>${spring-data-elasticsearch.version}</version>
    </dependency>

    <dependency>
      <groupId>net.java.dev.jna</groupId>
      <artifactId>jna</artifactId>
      <version>${jna.version}</version>
    </dependency>

    <!--elasticsearch 必须依赖日志才能启动-->
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-api</artifactId>
      <version>${log4j.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
      <version>${log4j.version}</version>
    </dependency>

    <!--hutool 工具类-->
    <dependency>
      <groupId>cn.hutool</groupId>
      <artifactId>hutool-all</artifactId>
      <version>${hutool-all.version}</version>
    </dependency>

    <!--单元测试工具-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>${junit.version}</version>
    </dependency>

  </dependencies>
</project>

application.properties

# ELASTICSEARCH (ElasticsearchProperties})
#集群名。(默认值: elasticsearch)
spring.data.elasticsearch.cluster-name=elasticsearch
#集群其他节点地址列表,用逗号分隔。如果没有指定,就启动一个客户端节点。默认 9300 是 Java 客户端的端口。
spring.data.elasticsearch.cluster-nodes=192.168.0.103:9300
#是否开启本地(我本地测试用就启用本地了)
spring.data.elasticsearch.local=true
#开启 Elasticsearch 仓库。(默认值:true。)
spring.data.elasticsearch.repositories.enabled=true
#存储索引的位置
#spring.data.elasticsearch.properties.path.home=data/elasticsearch
#日志存储目录
#spring.data.elasticsearch.properties.path.logs=./elasticsearch/log
#数据存储目录
#spring.data.elasticsearch.properties.path.data=./elasticsearch/data
#连接超时的时间
#spring.data.elasticsearch.properties.transport.tcp.connect_timeout=120s

Book.java

package com.yi.model;

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

@Document(indexName = "book_index", type = "books")
public class Book {

    @Id
    private String id;

    private String title;

    private String content;

    private String author;

    private String releaseDate;

    public Book() {
    }

    public Book(String id, String title, String content, String author, String releaseDate) {
        this.id = id;
        this.title = title;
        this.content = content;
        this.author = author;
        this.releaseDate = releaseDate;
    }

    忽略get和set方法,自己加上
}

BookRepository.java

package com.yi.repository;

import com.yi.model.Book;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

import java.util.List;

/**
 * 描述:
 *
 * @author YI
 * @date 2018-3-21 12:08:48
 **/
public interface BookRepository extends ElasticsearchRepository<Book, String> {

    Page<Book> findByAuthor(String author, Pageable pageable);

    List<Book> findByTitle(String title);

    Book save(Book book);
}

BookService.java

package com.yi.service;

import com.yi.model.Book;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;

import java.util.List;

/**
 * 描述:
 *
 * @author YI
 * @date 2018-3-21 12:08:48
 **/
public interface BookService {

    Book save(Book book);

    void delete(Book book);

    Iterable<Book> findAll();

    Page<Book> findByAuthor(String author, PageRequest pageRequest);

    List<Book> findByTitle(String title);
}

BookServiceImpl.java

package com.yi.service.impl;

import com.yi.model.Book;
import com.yi.repository.BookRepository;
import com.yi.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 描述:
 *
 * @author YI
 * @date 2018-3-21 12:08:48
 **/
@Service
public class BookServiceImpl implements BookService {

    @Autowired
    private BookRepository bookRepository;

    @Override
    public Book save(Book book) {
        return bookRepository.save(book);
    }

    @Override
    public void delete(Book book) {
        bookRepository.delete(book);
    }

    @Override
    public Iterable<Book> findAll() {
        return bookRepository.findAll();
    }

    @Override
    public Page<Book> findByAuthor(String author, PageRequest pageRequest) {
        return bookRepository.findByAuthor(author, pageRequest);
    }

    @Override
    public List<Book> findByTitle(String title) {
        return bookRepository.findByTitle(title);
    }

}

ElasticSearchController.java

package com.yi.controller;

import com.yi.model.Book;
import com.yi.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.List;

/**
 * ElasticSearch操作
 * @author YI
 * @date 2018-3-21 12:08:48
 */
@Controller
@RequestMapping("/elasticsearch")
public class ElasticSearchController {

    @Autowired
    private BookService bookService;

    /**
     * 保存到elasticsearch中
     */
    @RequestMapping("/save")
    public void save(){
        for (int i = 0; i < getTitle().size(); i++) {
            bookService.save(new Book(String.valueOf(i), getTitle().get(i), getContent().get(i), "黄文懿", i + "-FEB-2017"));
        }
    }

    /**
     * 通过作者查找
     * http://localhost:8080/elasticsearch/findByAuthor?name=黄文懿
     * @param name
     * @return
     */
    @RequestMapping("/findByAuthor")
    @ResponseBody
    public Page<Book> findByAuthor(String name){
        return bookService.findByAuthor(name, new PageRequest(0, 10));
    }

    /**
     * 通过标题查找
     * @return
     */
    @RequestMapping("/findByTitle")
    @ResponseBody
    public List<Book> findByTitle(){
        return bookService.findByTitle("如梦令");
    }

    private List<String> getTitle() {
        List<String> list = new ArrayList<>();

        list.add("《如梦令·常记溪亭日暮》");
        list.add("《醉花阴·薄雾浓云愁永昼》");
        list.add("《声声慢·寻寻觅觅》");
        list.add("《永遇乐·落日熔金》");
        list.add("《如梦令·昨夜雨疏风骤》");
        list.add("《渔家傲·雪里已知春信至》");
        list.add("《点绛唇·蹴[1]罢秋千》");
        list.add("《点绛唇·寂寞深闺》");
        list.add("《蝶恋花·泪湿罗衣脂粉满》");
        list.add("《蝶恋花 离情》");
        list.add("《浣溪沙》");
        list.add("《浣溪沙》");
        list.add("《浣溪沙》");
        list.add("《浣溪沙》");
        list.add("《浣溪沙》");
        list.add("《减字木兰花·卖花担上》");
        list.add("《临江仙·欧阳公作《蝶恋花》");
        list.add("《临江仙·庭院深深深几许》");
        list.add("《念奴娇·萧条庭院》");
        list.add("《菩萨蛮·风柔日薄春犹早》");
        list.add("《菩萨蛮·归鸿声断残云碧》");
        list.add("《武陵春·风住尘香花已尽》");
        list.add("《一剪梅·红藕香残玉蕈秋》");
        list.add("《渔家傲·天接云涛连晓雾》");
        list.add("《鹧鸪天·暗淡轻黄体性柔》");
        list.add("《鹧鸪天·寒日萧萧上锁窗》");
        list.add("《一剪梅·红藕香残玉簟秋》");
        list.add("《如梦令·常记溪亭日暮》");
        list.add("《浣溪沙》");
        list.add("《浣溪沙》");
        list.add("《浣溪沙》");
        list.add("《蝶恋花·泪湿罗衣脂粉满》");
        list.add("《蝶恋花·暖日晴风初破冻》");
        list.add("《鹧鸪天·寒日萧萧上锁窗》");
        list.add("《醉花阴·薄雾浓云愁永昼》");
        list.add("《鹧鸪天·暗淡轻黄体性柔》");
        list.add("《蝶恋花·永夜恹恹欢意少》");
        list.add("《浣溪沙》");
        list.add("《浣溪沙》");
        list.add("《如梦令·谁伴明窗独坐》");

        return list;
    }

    private List<String> getContent() {
        List<String> list = new ArrayList<>();

        list.add("初中 宋·李清照 常记溪亭日暮,沉醉不知归路,兴尽晚回舟,误入藕花深处。争渡,争渡");
        list.add("重阳节 宋·李清照 薄雾浓云愁永昼,瑞脑消金兽。佳节又重阳,玉枕纱厨,半夜凉初透。东");
        list.add("闺怨诗 宋·李清照 寻寻觅觅,冷冷清清,凄凄惨惨戚戚。乍暖还寒时候,最难将息。三杯两");
        list.add("元宵节 宋·李清照 落日熔金,暮云合璧,人在何处。染柳烟浓,吹梅笛怨,春意知几许。元");
        list.add("婉约诗 宋·李清照 昨夜雨疏风骤,浓睡不消残酒,试问卷帘人,却道海棠依旧。知否,知否");
        list.add("描写梅花 宋·李清照 雪里已知春信至,寒梅点缀琼枝腻,香脸半开娇旖旎,当庭际,玉人浴出");
        list.add(" 宋·李清照 蹴罢秋千,起来慵整纤纤手。露浓花瘦,薄汗轻衣透。见客入来,袜刬金");
        list.add("闺怨诗 宋·李清照 寂寞深闺,柔肠一寸愁千缕。惜春春去。几点催花雨。倚遍阑干,只是无");
        list.add("婉约诗 宋·李清照 泪湿罗衣脂粉满。四叠阳关,唱到千千遍。人道山长水又断。萧萧微雨闻");
        list.add("描写春天 宋·李清照 暖雨晴风初破冻,柳眼梅腮,已觉春心动。酒意诗情谁与共?泪融残粉花");
        list.add("寒食节 宋·李清照 淡荡春光寒食天,玉炉沈水袅残烟,梦回山枕隐花钿。海燕未来人斗草,");
        list.add(" 宋·李清照 髻子伤春慵更梳,晚风庭院落梅初,淡云来往月疏疏,玉鸭薰炉闲瑞脑,");
        list.add(" 宋·李清照 莫许杯深琥珀浓,未成沉醉意先融。疏钟已应晚来风。瑞脑香消魂梦断,");
        list.add("闺怨诗 宋·李清照 小院闲窗春已深,重帘未卷影沉沉。倚楼无语理瑶琴,远岫出山催薄暮。");
        list.add("爱情诗 宋·李清照 绣幕芙蓉一笑开,斜偎宝鸭亲香腮,眼波才动被人猜。一面风情深有韵,");
        list.add("描写春天 宋·李清照 卖花担上,买得一枝春欲放。泪染轻匀,犹带彤霞晓露痕。怕郎猜道,奴");
        list.add("》 宋·李清照 欧阳公作《蝶恋花》,有“深深深几许”之句,予酷爱之。用其语作“庭");
        list.add("描写梅花 宋·李清照 庭院深深深几许,云窗雾阁春迟,为谁憔悴损芳姿。夜来清梦好,应是发");
        list.add("寒食节 宋·李清照 萧条庭院,又斜风细雨,重门须闭。宠柳娇花寒食近,种种恼人天气。险");
        list.add("思乡诗 宋·李清照 风柔日薄春犹早,夹衫乍著心情好。睡起觉微寒,梅花鬓上残。故乡何处");
        list.add("描写春天 宋·李清照 归鸿声断残云碧,背窗雪落炉烟直。烛底凤钗明,钗头人胜轻。角声催晓");
        list.add("闺怨诗 宋·李清照 风住尘香花已尽,日晚倦梳头。物是人非事事休,欲语泪先流。闻说双溪");
        list.add(" 宋·李清照 红藕香残玉蕈秋,轻解罗裳,独上兰舟。云中谁寄锦书来?雁字回时,月");
        list.add("豪放诗 宋·李清照 天接云涛连晓雾。星河欲转千帆舞。仿佛梦魂归帝所。闻天语。殷勤问我");
        list.add("描写花 宋·李清照 暗淡轻黄体性柔。情疏迹远只香留。何须浅碧深红色,自是花中第一流。");
        list.add("描写秋天 宋·李清照 寒日萧萧上琐窗,梧桐应恨夜来霜。酒阑更喜团茶苦,梦断偏宜瑞脑香。");
        list.add("闺怨诗 宋·李清照 红藕香残玉簟秋。轻解罗裳,独上兰舟。云中谁寄锦书来?雁字回时,月");
        list.add(" 宋·李清照 常记溪亭日暮。沈醉不知归路。兴尽晚回舟,误入藕花深处。争渡。争渡");
        list.add(" 宋·李清照 莫许杯深琥珀浓。未成沈醉意先融。已应晚来风。瑞脑香消魂梦断,");
        list.add(" 宋·李清照 小院闲窗春色深。重帘未卷影沈沈。倚楼无语理瑶琴。远岫出山催薄暮,");
        list.add(" 宋·李清照 淡荡春光寒食天。玉炉沈水袅残烟。梦回山枕隐花钿。海燕未来人斗草,");
        list.add(" 宋·李清照 泪湿罗衣脂粉满。四叠阳关,唱到千千遍。人道山长山又断。萧萧微雨闻");
        list.add(" 宋·李清照 暖日晴风初破冻。柳眼眉腮,已觉春心动。酒意诗情谁与共。泪融残粉花");
        list.add(" 宋·李清照 寒日萧萧上锁窗。梧桐应恨夜来霜。酒阑更喜团茶苦,梦断偏宜瑞脑香。");
        list.add(" 宋·李清照 薄雾浓云愁永昼。瑞脑消金兽。佳节又重阳,玉枕纱厨,半夜凉初透。东");
        list.add(" 宋·李清照 暗淡轻黄体性柔。情疏迹远只香留。何须浅碧深红色,自是花中第一流。");
        list.add(" 宋·李清照 永夜恹恹欢意少。空梦长安,认取长安道。为报今年春色好。花光月影宜");
        list.add(" 宋·李清照 髻子伤春慵更梳。晚风庭院落梅初。淡云来往月疏疏。玉鸭熏炉闲瑞脑,");
        list.add(" 宋·李清照 绣面芙蓉一笑开。斜飞宝鸭衬香腮。眼波才动被人猜。一面风情深有韵,");
        list.add(" 宋·李清照 谁伴明窗独坐,我共影儿俩个。灯尽欲眠时,影也把人抛躲。无那,无那");

        return list;
    }
}

Application.java

package com.yi;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * Spring boot 启动程序
 * @author YI
 * @date 2018-3-15 15:49:59
 */
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

写好之后启动吧,通过浏览器或者其他工具访问你想访问的接口吧,下图就会访问保存数据接口后elasticsearch中的数据,可以通过elasticsearch-head访问: