十三、SPRINGBOOT 1.5.9 整合 ELASTICSEARCH 2.4.2 做 增删改查 CRUD以及分页

版本问题

 
springboot 有一个 spring data 组件,可以用来连接各种数据源。 用来连接 elasticsearch 的是 spring-data-elasticsearch。 
但是呢。。。 截止现在(2018-9-17),spring-data-elasticsearch 更新比较慢,其最高版本无法支持教程里的 elasticsearch的6.x 版本。 
为了支持 6.x 版本,需要用要用奇怪的 transportclient 来连接, 这就不是 spring-data 系列里的内容了。
考虑到将来,spring data 总会支持最新版本的 elasticsearch的,所以我们还是使用 spring-data 来进行链接。 只是,elasticsearch 的版本,我们换成了 2.4.2, kibana 版本,也换成了能够连接 elasticsearch 2.4.2 的 4.6.3 版本。
elasticsearch-2.4.2.zip:http://download.how2j.cn/1833/elasticsearch-2.4.2.zip
kibana-4.6.3-windows-x86.zip : http://download.how2j.cn/1834/kibana-4.6.3-windows-x86.zip
版本问题

启动 elasticsearch 2.4.2

 
首先关闭本系列教材可能启动的 elasticsearch 6.2.2。
然后下载并解压右上角的 elasticsearch 2.4.2,运行其中的 elasticsearch.bat
启动后,可以看到左上角的版本号。
启动 elasticsearch 2.4.2

创建 springboot 项目

pom.xml

 
各种jar包,主要是 spring-boot-starter-data-elastisearch 这个 jar包
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<?xml version="1.0" encoding="UTF-8"?>
<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.how2java</groupId>
  <artifactId>springboot</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>springboot</name>
  <description>springboot</description>
  <packaging>war</packaging>
   
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
    </parent>
 
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
             
        </dependency>
        <dependency>
              <groupId>junit</groupId>
              <artifactId>junit</artifactId>
              <version>3.8.1</version>
              <scope>test</scope>
        </dependency>
        <!-- servlet依赖. -->
        <dependency>
              <groupId>javax.servlet</groupId>
              <artifactId>javax.servlet-api</artifactId>
               
        </dependency>
              <dependency>
                     <groupId>javax.servlet</groupId>
                     <artifactId>jstl</artifactId>
              </dependency>
        <!-- tomcat的支持.-->
        <dependency>
               <groupId>org.apache.tomcat.embed</groupId>
               <artifactId>tomcat-embed-jasper</artifactId>
                
        </dependency>    
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional<!-- 这个需要为 true 热部署才有效 -->
        </dependency>
         
        <!-- mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.21</version>
        </dependency>
 
        <!-- jpa-->
<!--         <dependency> -->
<!--             <groupId>org.springframework.boot</groupId> -->
<!--             <artifactId>spring-boot-starter-data-jpa</artifactId> -->
<!--         </dependency>         -->
         
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>       
         
    </dependencies>
 
    <properties>
        <java.version>1.8</java.version>
    </properties>
 
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
 
</project>

Application.java

 
启动类
1
2
3
4
5
6
7
8
9
10
11
package com.how2java.springboot;
  
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
  
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Category

 
Category 实体类,其中的 @Document就表明了要连接到 ElasticSearch 的哪个索引和哪个 type 上
 
@Document(indexName = "how2java",type = "category")
 

索引相当于就是数据库,type 相当于就是表
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.how2java.springboot.pojo;
 
import org.springframework.data.elasticsearch.annotations.Document;
 
@Document(indexName = "how2java",type = "category")
public class Category {
 
    private int id;
    private String name;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
     
}

CategoryDAO

 
1
2
3
4
5
6
7
8
9
package com.how2java.springboot.dao;
 
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
 
import com.how2java.springboot.pojo.Category;
 
public interface CategoryDAO extends ElasticsearchRepository<Category,Integer>{
 
}

控制类

 
控制类提供 CRUD 一套
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package com.how2java.springboot.web;
import java.text.SimpleDateFormat;
import java.util.Date;
 
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;
import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.core.query.SearchQuery;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
 
import com.how2java.springboot.dao.CategoryDAO;
import com.how2java.springboot.pojo.Category;
   
@Controller
public class CategoryController {
    @Autowired CategoryDAO categoryDAO;
 
    //每页数量
 
    @GetMapping("/listCategory")
    public String listCategory(Model m,@RequestParam(value = "start", defaultValue = "0"intstart,@RequestParam(value = "size", defaultValue = "5"int size){
        String query = "商品"//查询条件,但是并未使用,放在这里,为的是将来使用,方便参考,知道如何用
        SearchQuery searchQuery=getEntitySearchQuery(start,size,query);
        Page<Category> page = categoryDAO.search(searchQuery);
        m.addAttribute("page", page);
        return "listCategory";       
    }
 
    private SearchQuery getEntitySearchQuery(int start, int size, String searchContent) {
        FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery()
                .add(QueryBuilders.matchAllQuery(), //查询所有
                        ScoreFunctionBuilders.weightFactorFunction(100))
 
//                查询条件,但是并未使用,放在这里,为的是将来使用,方便参考,知道如何用
//                .add(QueryBuilders.matchPhraseQuery("name", searchContent),
//                      ScoreFunctionBuilders.weightFactorFunction(100))
                //设置权重分 求和模式
                .scoreMode("sum")
                //设置权重分最低分
                .setMinScore(10);
 
        // 设置分页
        Sort sort  = new Sort(Sort.Direction.DESC,"id");
        Pageable pageable = new PageRequest(start, size,sort);
        return new NativeSearchQueryBuilder()
                .withPageable(pageable)
                .withQuery(functionScoreQueryBuilder).build();
    }   
     
    @RequestMapping("/addCategory")
    public String addCategory(Category c) throws Exception {
        int id = currentTime();
        c.setId(id);
        categoryDAO.save(c);
        return "redirect:listCategory";
    }
    private int currentTime() {
        SimpleDateFormat sdf = new SimpleDateFormat("MMddHHmmss");
        String time= sdf.format(new Date());
        return Integer.parseInt(time);
    }
 
    @RequestMapping("/deleteCategory")
    public String deleteCategory(Category c) throws Exception {
        categoryDAO.delete(c);
        return "redirect:listCategory";
    }
    @RequestMapping("/updateCategory")
    public String updateCategory(Category c) throws Exception {
        categoryDAO.save(c);
        return "redirect:listCategory";
    }
    @RequestMapping("/editCategory")
    public String ediitCategory(int id,Model m) throws Exception {
        Category c= categoryDAO.findOne(id);
        m.addAttribute("c", c);
        return "editCategory";
    }
}

listCategory.jsp

 
listCategory.jsp 文件,记得放在如图所示的位置。没有的目录,自己创建就好了。
listCategory.jsp
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
   
<div align="center">
 
</div>
 
<div style="width:500px;margin:20px auto;text-align: center">
    <table align='center' border='1' cellspacing='0'>
        <tr>
            <td>id</td>
            <td>name</td>
            <td>编辑</td>
            <td>删除</td>
        </tr>
        <c:forEach items="${page.content}" var="c" varStatus="st">
            <tr>
                <td>${c.id}</td>
                <td>${c.name}</td>
                <td><a href="editCategory?id=${c.id}">编辑</a></td>
                <td><a href="deleteCategory?id=${c.id}">删除</a></td>
            </tr>
        </c:forEach>
         
    </table>
    <br>
    <div>
                <a href="?start=0">[首  页]</a>
            <a href="?start=${page.number-1}">[上一页]</a>
            <a href="?start=${page.number+1}">[下一页]</a>
            <a href="?start=${page.totalPages-1}">[末  页]</a>
    </div>
    <br>
    <form action="addCategory" method="post">
     
    name: <input name="name"> <br>
    <button type="submit">提交</button>
     
    </form>
</div>

editCategory.jsp

 
editCategory.jsp 做编辑工作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<%@ page language="java" contentType="text/html; charset=UTF-8"
 pageEncoding="UTF-8" isELIgnored="false"%>
 
<div style="margin:0px auto; width:500px">
 
<form action="updateCategory" method="post">
 
name: <input name="name" value="${c.name}"> <br>
 
<input name="id" type="hidden" value="${c.id}">
<button type="submit">提交</button>
 
</form>
</div>

application.properties

 
配置 jsp 作为视图
配置spring端口 为8080
配置 elastic链接地址为 127.0.0.1:9300
application.properties
 
 
1
2
3
4
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
server.port=8080
spring.data.elasticsearch.cluster-nodes = 127.0.0.1:9300

启动并测试

 
运行 Application.java 启动项目
接着访问地址:
 
http://127.0.0.1:8080/listCategory
 
启动并测试

 

kibana

 
下面用 kibana 来查看数据。 和前面的 kibana 版本不同,要连接本教材的 elasticsearch 2.4.2 版本,需要用到右上角提供的 kibana 4.6.3 版本。

注: 如果启动了前面提供的 kibana 6.2.2 ,请记得关闭。
 
kibana

启动 kibana 并访问

 
启动之后,如图所示,是看不到版本信息的。。
然后访问地址:
 
http://127.0.0.1:5601
 
启动 kibana 并访问

选择索引

 
刚开始是没有选定索引的,所以要自己指定索引。
1. 把默认勾选的 Index contians time-based evens 去掉
2. 输入 how2java
3. 点击 Create 按钮
选择索引

查看数据

 
然后点击上面的Discover,就可以看到左边是当前的索引 :how2java. 右边就是数据了。。。
查看数据
以上就是Elasticsearch 的常用做法,更多的内容请访问 Elasticsearch 官方学习文档: 
https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html 
Java API 
https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-api.html
下载地址:http://download.how2j.cn/1973/springboot.rar

posted on 2019-01-04 13:43  我是司  阅读(1270)  评论(0)    收藏  举报

导航