1 springboot整合elasticsearch入门例子
记录一下最入门的例子。
一:安装elasticsearch。
在mac上很简单,brew install elasticsearch。安装完成后启动,brew services start ElasticSearch就可以了。然后访问http://localhost:9200/,出现一个json串的界面就OK了。9200是http的端口,9300是给java用户的端口。 如果是linux,看看这篇http://blog.csdn.net/cwenao/article/details/54943505,包括修改cluster.name和network.host的作用。如果不修改cluster.name那么系统是有默认的值,在第三步设置application.yml时可以看到。如果是配置远程elasticsearch集群,则设置cluster.nodes为远程的地址。 这里我们什么都不改,默认就是本机。
二:新建spring boot的elasticsearch项目。
用idea新建,勾选web和nosql里的elasticsearch选项,等待创建完成即可。 起初我用spring boot1.5.3创建的,运行时死活报一个类找不到,后改用最新的2.0.0创建的就好了。
<?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.example</groupId>
<artifactId>testelasticaearch</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>testelasticaearch</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.M1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>3.0.9</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
除了net.java.dev.jna那个是新加的,别的都是项目勾选elasticsearch后自动创建的,新加的这个依赖是因为启动后也是报类不存在,后来在网上找个jna依赖加上后就好了。
三:配置yml文件。
spring:
data:
elasticsearch:
#cluster-name: #默认为elasticsearch
#cluster-nodes: 127.0.0.1: #配置es节点信息,逗号分隔,如果没有指定,则启动ClientNode
properties:
path:
logs: ./elasticsearch/log #elasticsearch日志存储目录
data: ./elasticsearch/data #elasticsearch数据存储目录
四:创建javaBean文件。
我直接用http://www.tianshouzhi.com/api/tutorials/springboot/101这篇文章里的类。 把Author类和Tutorial类复制过来,还有Article类。简单说一下Article类。
package com.example.demo.pojo;
import org.springframework.data.elasticsearch.annotations.Document;
import java.io.Serializable;
import java.util.Date;
/**
* Created by admin on 17/6/1.
*/
@Document(indexName="projectname",type="article",indexStoreType="fs",shards=5,replicas=1,refreshInterval="-1")
public class Article implements Serializable {
@Id
private Long id;
/**标题*/
private String title;
/**摘要*/
private String abstracts;
/**内容*/
private String content;
/**发表时间*/
private Date postTime;
/**点击率*/
private Long clickCount;
/**作者*/
private Author author;
/**所属教程*/
private Tutorial tutorial;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAbstracts() {
return abstracts;
}
public void setAbstracts(String abstracts) {
this.abstracts = abstracts;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Date getPostTime() {
return postTime;
}
public void setPostTime(Date postTime) {
this.postTime = postTime;
}
public Long getClickCount() {
return clickCount;
}
public void setClickCount(Long clickCount) {
this.clickCount = clickCount;
}
public Author getAuthor() {
return author;
}
public void setAuthor(Author author) {
this.author = author;
}
public Tutorial getTutorial() {
return tutorial;
}
public void setTutorial(Tutorial tutorial) {
this.tutorial = tutorial;
}
@Override
public String toString() {
return "Article{" +
"id=" + id +
", title='" + title + ''' +
", abstracts='" + abstracts + ''' +
", content='" + content + ''' +
", postTime=" + postTime +
", clickCount=" + clickCount +
", author=" + author +
", tutorial=" + tutorial +
'}';
}
}
@Document注解里面的几个属性,类比mysql的话是这样: index –> DB type –> Table Document –> row @Id注解加上后,在Elasticsearch里相应于该列就是主键了,在查询时就可以直接用主键查询,后面一篇会讲到。其实和mysql非常类似,基本就是一个数据库。
@Persistent
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface Document {
String indexName();//索引库的名称,个人建议以项目的名称命名
String type() default "";//类型,个人建议以实体的名称命名
short shards() default 5;//默认分区数
short replicas() default 1;//每个分区默认的备份数
String refreshInterval() default "1s";//刷新间隔
String indexStoreType() default "fs";//索引文件存储类型
}
加上了@Document注解之后,默认情况下这个实体中所有的属性都会被建立索引、并且分词。 我们通过@Field注解来进行详细的指定,如果没有特殊需求,那么只需要添加@Document即可。
@Field注解的定义如下:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
@Inherited
public @interface Field {
FieldType type() default FieldType.Auto;#自动检测属性的类型
FieldIndex index() default FieldIndex.analyzed;#默认情况下分词
DateFormat format() default DateFormat.none;
String pattern() default "";
boolean store() default false;#默认情况下不存储原文
String searchAnalyzer() default "";#指定字段搜索时使用的分词器
String indexAnalyzer() default "";#指定字段建立索引时指定的分词器
String[] ignoreFields() default {};#如果某个字段需要被忽略
boolean includeInParent() default false;
}
五:dao和controller
Dao:
public interface ArticleSearchRepository extends ElasticsearchRepository<Article, Long> {
}
controller:
package com.example.demo;
import com.example.demo.pojo.Article;
import com.example.demo.pojo.Author;
import com.example.demo.pojo.Tutorial;
import com.example.demo.repository.ArticleSearchRepository;
import org.elasticsearch.index.query.QueryStringQueryBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
import java.util.Iterator;
/**
* Created by admin on 17/6/1.
*/
@RestController
public class TestController {
@Autowired
private ArticleSearchRepository articleSearchRepository;
@RequestMapping("/add")
public void testSaveArticleIndex() {
Author author = new Author();
author.setId(1L);
author.setName("tianshouzhi");
author.setRemark("java developer");
Tutorial tutorial = new Tutorial();
tutorial.setId(1L);
tutorial.setName("elastic search");
Article article = new Article();
article.setId(1L);
article.setTitle("springboot integreate elasticsearch");
article.setAbstracts("springboot integreate elasticsearch is very easy");
article.setTutorial(tutorial);
article.setAuthor(author);
article.setContent("elasticsearch based on lucene,"
+ "spring-data-elastichsearch based on elaticsearch"
+ ",this tutorial tell you how to integrete springboot with spring-data-elasticsearch");
article.setPostTime(new Date());
article.setClickCount(1L);
articleSearchRepository.save(article);
}
@RequestMapping("/query")
public void testSearch() {
String queryString = "springboot";//搜索关键字
QueryStringQueryBuilder builder = new QueryStringQueryBuilder(queryString);
Iterable<Article> searchResult = articleSearchRepository.search(builder);
Iterator<Article> iterator = searchResult.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
启动项目,先执行add,往elasticsearch添加一条数据,然后再访问query即可看到结果了。 其实非常类似于普通的DB查询,还支持很多条件查询,findAll,findTop之类的,就是JPA那一套可以直接用,因为继承的ElasticsearchRepository本身就是一个PagingAndSortingRepository。 参考:http://www.cnblogs.com/softidea/p/6102796.html
- ASP.NET Core的配置(4):多样性的配置来源[下篇]
- 数据结构 图
- ASP.NET Core的配置(5):配置的同步[ 实例篇]
- TensorFlow 深度学习笔记 卷积神经网络
- 利用EntLib授权机制实现对ASP.NET页面的自动授权
- ASP.NET Core的配置(5):配置的同步[设计篇]
- 详解Redis内部运作机制
- TensorFlow深度学习笔记 循环神经网络实践
- 从客户端Web应用程序访问Bluemix服务
- 云改变传统银行业面貌的5种方式
- ASP.NET MVC中的ActionFilter是如何执行的?
- C语言嵌入式系统编程修炼之屏幕操作
- max-width:100%在td或者table-cell里渲染不符合预期小笔记
- ASP.NET Core中的依赖注入(2):依赖注入(DI)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- CSS 实现文本超出容器范围用省略号显示(单行+多行)
- ESP8266和ROS收发消息读取模拟量控制LED亮度
- 纯 CSS 实现下拉菜单尖角图标(实心+空心)
- 3分钟短文:书接上回,Laravel数据库迁移的那些个小技巧
- 解密 Docker 挂载文件,宿主机修改后容器里文件没有修改
- SAP Spartacus的单元测试目录结构
- 突击并发编程JUC系列-并发工具 CyclicBarrier
- 详解 | Linux系统是如何实现存储并读写文件的?
- Angular单元测试的一个错误消息
- Python进行特征提取
- dotnet OpenXML 元素 cNvPr NonVisual Drawing Properties 的属性作用
- Java 对象相关面试题
- 【每日一题】【vue2源码学习】VUE中模版编译原理
- 【每日一题】【vue2源码学习】对VUE响应式数据的理解
- ApacheCN 深度学习译文集 2020.9