步骤 2 : 启动 elasticsearch 2.4.2 步骤 3 : 先运行,看到效果,再学习 步骤 4 : 模仿和排错 步骤 5 : 创建 springboot 项目 步骤 6 : pom.xml 步骤 7 : Application.java 步骤 8 : Category 步骤 9 : CategoryDAO 步骤 10 : 控制类 步骤 11 : listCategory.jsp 步骤 12 : editCategory.jsp 步骤 13 : application.properties 步骤 14 : 启动并测试 步骤 15 : kibana 步骤 16 : 启动 kibana 并访问 步骤 17 : 选择索引 步骤 18 : 查看数据
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 6.2.2。
然后下载并解压右上角的 elasticsearch 2.4.2,运行其中的 elasticsearch.bat 启动后,可以看到左上角的版本号。
老规矩,先下载右上角的可运行项目,配置运行起来,确认可用之后,再学习做了哪些步骤以达到这样的效果。
首先确保 启动 elasticsearch 2.4.2 这个步骤要做了,不然跑不起来。 然后运行 Application.java 启动项目 接着访问地址: http://127.0.0.1:8080/listCategory CRUD和分页效果都有。
在确保可运行项目能够正确无误地运行之后,再严格照着教程的步骤,对代码模仿一遍。
模仿过程难免代码有出入,导致无法得到期望的运行结果,此时此刻通过比较正确答案 ( 可运行项目 ) 和自己的代码,来定位问题所在。 采用这种方式,学习有效果,排错有效率,可以较为明显地提升学习速度,跨过学习路上的各个槛。 推荐使用diffmerge软件,进行文件夹比较。把你自己做的项目文件夹,和我的可运行项目文件夹进行比较。 这个软件很牛逼的,可以知道文件夹里哪两个文件不对,并且很明显地标记出来 这里提供了绿色安装和使用教程:diffmerge 下载和使用教程
各种jar包,主要是 spring-boot-starter-data-elastisearch 这个 jar包
<?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>
启动类
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);
}
}
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 实体类,其中的 @Document就表明了要连接到 ElasticSearch 的哪个索引和哪个 type 上
@Document(indexName = "how2java",type = "category") 索引相当于就是数据库,type 相当于就是表 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;
}
}
继承了,就什么东西都有了~
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>{
}
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 一套
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") int start,@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 文件,记得放在如图所示的位置。没有的目录,自己创建就好了。
<%@ 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 做编辑工作
<%@ 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>
<%@ 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>
配置 jsp 作为视图
配置spring端口 为8080 配置 elastic链接地址为 127.0.0.1:9300 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
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 版本不同,要连接本教材的 elasticsearch 2.4.2 版本,需要用到右上角提供的 kibana 4.6.3 版本。
注: 如果启动了前面提供的 kibana 6.2.2 ,请记得关闭。
启动之后,如图所示,是看不到版本信息的。。
然后访问地址: http://127.0.0.1:5601
刚开始是没有选定索引的,所以要自己指定索引。
1. 把默认勾选的 Index contians time-based evens 去掉 2. 输入 how2java 3. 点击 Create 按钮
然后点击上面的Discover,就可以看到左边是当前的索引 :how2java. 右边就是数据了。。。
HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。
问答区域
2021-03-29
这个elasticsearch被报有勒索病毒
2021-01-31
注意一开始访问的时候,应该添加start=0,不然会404
2020-04-16
站长能做一个ES 7.x.x 与springboot整合的版本吗? 毕竟都2020年了。
2020-01-29
导入的项目没有在数据库取数据,增加的数据也没有放到数据库
2020-01-29
kibana不能新建索引
提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 7 条以前的提问,请 点击查看
提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
|