SpringBoot整合elasticsearch
本文内容纲要:
在这一篇文章开始之前,你需要先安装一个ElasticSearch,如果你是mac或者linux可以参考https://www.jianshu.com/p/e47b451375ea,如果是windows可以自定百度一下。
下面是官方套话介绍elasticsearch:
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTfulweb接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
我们建立一个网站或应用程序,并要添加搜索功能,但是想要完成搜索工作的创建是非常困难的。我们希望搜索解决方案要运行速度快,我们希望能有一个零配置和一个完全免费的搜索模式,我们希望能够简单地使用JSON通过HTTP来索引数据,我们希望我们的搜索服务器始终可用,我们希望能够从一台开始并扩展到数百台,我们要实时搜索,我们要简单的多租户,我们希望建立一个云的解决方案。因此我们利用Elasticsearch来解决所有这些问题及可能出现的更多其它问题。
具体elasticsearch相关问题可以去elastic中文社区查看。
这一篇文章将介绍springboot如何简单整合elasticsearch。
1.启动elasticsearch。
2.新建项目,pom文件中加入elasticsearch依赖,完整pom如下:
<?xmlversion="1.0"encoding="UTF-8"?>
<projectxmlns="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.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dalaoyang</groupId>
<artifactId>springboot_elasticsearch</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springboot_elasticsearch</name>
<description>springboot_elasticsearch</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath/><!--lookupparentfromrepository-->
</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>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</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>
</project>
配置文件如下:
##端口号
server.port=8888
##es地址
spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300
新建一个商品实体类GoodsInfo,其中需要注意:
indexName:索引名称可以理解为数据库名必须为小写不然会报org.elasticsearch.indices.InvalidIndexNameException异常
type:类型可以理解为表名
packagecom.dalaoyang.entity;
importorg.springframework.data.elasticsearch.annotations.Document;
importjava.io.Serializable;
/**
*@authordalaoyang
*@Description
*@projectspringboot_learn
*@packagecom.dalaoyang.entity
*@emailyangyang@dalaoyang.cn
*@date2018/5/4
*/
@Document(indexName="testgoods",type="goods")
//indexName索引名称可以理解为数据库名必须为小写不然会报org.elasticsearch.indices.InvalidIndexNameException异常
//type类型可以理解为表名
publicclassGoodsInfoimplementsSerializable{
privateLongid;
privateStringname;
privateStringdescription;
publicLonggetId(){
returnid;
}
publicvoidsetId(Longid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicStringgetDescription(){
returndescription;
}
publicvoidsetDescription(Stringdescription){
this.description=description;
}
publicGoodsInfo(Longid,Stringname,Stringdescription){
this.id=id;
this.name=name;
this.description=description;
}
publicGoodsInfo(){
}
}
创建GoodsRepository,继承ElasticsearchRepository,代码如下:
packagecom.dalaoyang.repository;
importcom.dalaoyang.entity.GoodsInfo;
importorg.springframework.data.elasticsearch.repository.ElasticsearchRepository;
importorg.springframework.stereotype.Component;
/**
*@authordalaoyang
*@Description
*@projectspringboot_learn
*@packagecom.dalaoyang.repository
*@emailyangyang@dalaoyang.cn
*@date2018/5/4
*/
@Component
publicinterfaceGoodsRepositoryextendsElasticsearchRepository<GoodsInfo,Long>{
}
最后新建一个controller进行测试,其中包含简单的增删改查以及一个搜索,增删改查这里不做解释了。需要注意es的第一页页码是0
packagecom.dalaoyang.controller;
importcom.dalaoyang.entity.GoodsInfo;
importcom.dalaoyang.repository.GoodsRepository;
importorg.elasticsearch.index.query.QueryBuilders;
importorg.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;
importorg.elasticsearch.index.query.functionscore.ScoreFunctionBuilders;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.data.domain.Page;
importorg.springframework.data.domain.PageRequest;
importorg.springframework.data.domain.Pageable;
importorg.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
importorg.springframework.data.elasticsearch.core.query.SearchQuery;
importorg.springframework.web.bind.annotation.GetMapping;
importorg.springframework.web.bind.annotation.RestController;
importjava.util.List;
/**
*@authordalaoyang
*@Description
*@projectspringboot_learn
*@packagecom.dalaoyang.controller
*@emailyangyang@dalaoyang.cn
*@date2018/5/4
*/
@RestController
publicclassGoodsController{
@Autowired
privateGoodsRepositorygoodsRepository;
//http://localhost:8888/save
@GetMapping("save")
publicStringsave(){
GoodsInfogoodsInfo=newGoodsInfo(System.currentTimeMillis(),
"商品"+System.currentTimeMillis(),"这是一个测试商品");
goodsRepository.save(goodsInfo);
return"success";
}
//http://localhost:8888/delete?id=1525415333329
@GetMapping("delete")
publicStringdelete(longid){
goodsRepository.delete(id);
return"success";
}
//http://localhost:8888/update?id=1525417362754&name=修改&description=修改
@GetMapping("update")
publicStringupdate(longid,Stringname,Stringdescription){
GoodsInfogoodsInfo=newGoodsInfo(id,
name,description);
goodsRepository.save(goodsInfo);
return"success";
}
//http://localhost:8888/getOne?id=1525417362754
@GetMapping("getOne")
publicGoodsInfogetOne(longid){
GoodsInfogoodsInfo=goodsRepository.findOne(id);
returngoodsInfo;
}
//每页数量
privateIntegerPAGESIZE=10;
//http://localhost:8888/getGoodsList?query=商品
//http://localhost:8888/getGoodsList?query=商品&pageNumber=1
//根据关键字"商品"去查询列表,name或者description包含的都查询
@GetMapping("getGoodsList")
publicList<GoodsInfo>getList(IntegerpageNumber,Stringquery){
if(pageNumber==null)pageNumber=0;
//es搜索默认第一页页码是0
SearchQuerysearchQuery=getEntitySearchQuery(pageNumber,PAGESIZE,query);
Page<GoodsInfo>goodsPage=goodsRepository.search(searchQuery);
returngoodsPage.getContent();
}
privateSearchQuerygetEntitySearchQuery(intpageNumber,intpageSize,StringsearchContent){
FunctionScoreQueryBuilderfunctionScoreQueryBuilder=QueryBuilders.functionScoreQuery()
.add(QueryBuilders.matchPhraseQuery("name",searchContent),
ScoreFunctionBuilders.weightFactorFunction(100))
.add(QueryBuilders.matchPhraseQuery("description",searchContent),
ScoreFunctionBuilders.weightFactorFunction(100))
//设置权重分求和模式
.scoreMode("sum")
//设置权重分最低分
.setMinScore(10);
//设置分页
Pageablepageable=newPageRequest(pageNumber,pageSize);
returnnewNativeSearchQueryBuilder()
.withPageable(pageable)
.withQuery(functionScoreQueryBuilder).build();
}
}
启动项目,先调用http://localhost:8888/save方法,插入几条数据,然后去es管理页面http://localhost:9200/_plugin/head/,如下图
访问http://localhost:8888/getGoodsList?query=商品,如图:
源码下载:大老杨码云
个人网站:https://www.dalaoyang.cn
本文内容总结:
原文链接:https://www.cnblogs.com/dalaoyang/p/8990989.html