Windows下安装ElasticSearch
由于目前高版本的ES和springBoot兼容性不够好,所以我先下载了个低版本的学习。
1,文件准备
下载地址:
https://www.elastic.co/downloads
选择ElasticSearch相关版本, 然后选择后缀名为ZIP文件进行下载,下载之后自己选择一个目录解压。。
我下的版本是2.3.2
2,启动Elasticsearch
进入bin目录下,运行 elasticsearch.bat
然后在浏览上输入: localhost:9200
成功显示下面这个界面表示安装成功!
web管理界面head 安装
进入bin目录下,打开cmd,进入dos界面
输入:plugin install mobz/elasticsearch-head
进行下载
在安装head插件的过程中我的控制台抛了以下异常
但是好像不影响head插件的使用。
成功下载之后,在浏览器输入:http://localhost:9200/_plugin/head/
出现以下界面
4,注册服务
进入bin目录下,打开cmd,进入dos界面
依次输入:
service.bat install
service.bat start
成功之后,再输入
services.msc
跳转到Service服务界面,可以直接查看es的运行状态!
下面开始整合代码,我的springBoot版本是1.5.6
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!--elasticsearch-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
application.properties文件中添加以下两行代码
spring.data.elasticsearch.repositories.enabled = true
spring.data.elasticsearch.cluster-nodes =127.0.0.1:9300
userInfo类
@Data
@Document(indexName = "userindex", type = "user")
public class UserInfo implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* 编号
*/
private Long id;
/**
* 姓名
*/
private String name;
/**
* 年龄
*/
private Integer age;
/**
* 性别
*/
private String sex;
/**
* 电话
*/
private String tel;
/**
* 描述
*/
private String description;
/**
* 创建时间
*/
private String createtm;
}
上面的userInfo类使用了@Data注解,该注解是一个插件lombok里的,可以在IDEA里添加该插件,他的作用主要是使代码看起来更整洁干净,比如实体类的get、set方法。常用的注解主要还有这几个@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode。其中@Data注解的作用相当于 @Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode的合集,更详细的用法请去官网看一下。
UserInfoRepository类
public interface UserInfoRepository extends ElasticsearchRepository<UserInfo, Long> {
}
UserInfoRepository类只需继承ElasticsearchRepository即可,该类封装好了简单的增删改查接口。
UserInfoService 类
/**
* @Description: 用户信息业务逻辑接口类
*
* @author Created by wuzhangwei on 2018/7/21 14:44
*/
public interface UserInfoService {
/**
* @Description: 新增的用户信息
* @param
* @author Created by wuzhangwei on 2018/9/1 22:55
*/
public boolean insert(UserInfo user);
/**
* @Description: 通过用户输入的值去查询数据
* @param searchContent 查询的值
* @author Created by wuzhangwei on 2018/9/1 22:56
*/
public List<UserInfo> search(String searchContent);
/**
* @Description: 通过用户输入的值去查询数据 分页查询
* @param searchContent 查询的值
* @author Created by wuzhangwei on 2018/9/1 22:59
*/
public List<UserInfo> searchUser(Integer pageNumber, Integer pageSize,String searchContent) ;
/**
* @Description: 通过用户输入的值去查询数据 根据权重去搜索
* @param searchContent 查询的值
* @author Created by wuzhangwei on 2018/9/1 23:01
*/
public List<UserInfo> searchUserByWeight(String searchContent) ;
/**
* @Description: 通过用户输入的值去删除索引值
* @param user user主要是根据id去删除
* @author Created by wuzhangwei on 2018/9/1 23:01
*/
public void deleteUser(UserInfo user) ;
}
UserInfoServiceImpl类
@Service
public class UserInfoServiceImpl implements UserInfoService {
@Autowired
private UserInfoRepository userInfoRepository;
@Override
public boolean insert(UserInfo UserInfo) {
boolean falg=false;
try{
userInfoRepository.save(UserInfo);
falg=true;
}catch(Exception e){
e.printStackTrace();
}
return falg;
}
@Override
public List<UserInfo> search(String searchContent) {
QueryStringQueryBuilder builder = new QueryStringQueryBuilder(searchContent);
System.out.println("查询的语句:"+builder);
Iterable<UserInfo> searchResult = userInfoRepository.search(builder);
Iterator<UserInfo> iterator = searchResult.iterator();
List<UserInfo> list=new ArrayList<UserInfo>();
while (iterator.hasNext()) {
list.add(iterator.next());
}
return list;
}
@Override
public List<UserInfo> searchUser(Integer pageNumber, Integer pageSize, String searchContent) {
// 分页参数
Pageable pageable = new PageRequest(pageNumber, pageSize);
QueryStringQueryBuilder builder = new QueryStringQueryBuilder(searchContent);
SearchQuery searchQuery = new NativeSearchQueryBuilder().withPageable(pageable).withQuery(builder).build();
System.out.println("查询的语句:" + searchQuery.getQuery().toString());
Page<UserInfo> searchPageResults = userInfoRepository.search(searchQuery);
return searchPageResults.getContent();
}
@Override
public List<UserInfo> searchUserByWeight(String searchContent) {
// 根据权重进行查询
FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery()
.add(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("name", searchContent)),
ScoreFunctionBuilders.weightFactorFunction(10))
.add(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("description", searchContent)),
ScoreFunctionBuilders.weightFactorFunction(100)).setMinScore(2);
System.out.println("查询的语句:" + functionScoreQueryBuilder.toString());
Iterable<UserInfo> searchResult = userInfoRepository.search(functionScoreQueryBuilder);
Iterator<UserInfo> iterator = searchResult.iterator();
List<UserInfo> list=new ArrayList<UserInfo>();
while (iterator.hasNext()) {
list.add(iterator.next());
}
return list;
}
@Override
public void deleteUser(UserInfo user){
//根据id去删除对应的索引值
userInfoRepository.delete(user);
}
}
UserInfoController 类
/**
* @author Created by wuzhangwei on 2018/8/2620:01
* @Description: ES全文检索
*/
@Slf4j
@RestController
@RequestMapping("/elasticSearch")
public class UserInfoController {
// private static final Logger log = LoggerFactory.getLogger(UserInfoController.class);
@Autowired
private UserInfoService userInfoService;
/**
* @Description: 添加
* @param
* @author Created by wuzhangwei on 2018/8/26 20:03
*/
@RequestMapping("/add")
public String esSave(UserInfo user) throws Exception {
log.info("save"+user.toString());
try{
userInfoService.insert(user);
return "success";
}catch(Exception e){
log.error("入库失败");
return "fail";
}
}
/**
* @Description: 查询
* @param queryContent 前台传过来的查询内容
* @author Created by wuzhangwei on 2018/8/26 20:04
*/
@RequestMapping("/query")
public List<UserInfo> esSearch(@RequestParam(value = "queryContent", required = false) String queryContent) throws Exception{
log.info("query:"+queryContent);
List<UserInfo> userList= userInfoService.search(queryContent);
for(UserInfo user:userList){
System.out.println("query user:"+user.getName()+" "+user.getDescription());
}
return userList;
}
/**
* @Description: 更新
* @param
* @author Created by wuzhangwei on 2018/8/26 21:11
*/
@RequestMapping("/update")
public String esUpdate(UserInfo user) throws Exception {
log.info("update"+user.toString());
try{
userInfoService.insert(user);
return "success";
}catch(Exception e){
log.error("更新失败");
return "fail";
}
}
/**
* @Description: 删除
* @param
* @author Created by wuzhangwei on 2018/8/26 21:11
*/
@RequestMapping("/delete")
public String esDelete(@RequestParam(value = "id", required = true) Long id) throws Exception {
UserInfo user = new UserInfo();
user.setId(id);
try{
userInfoService.deleteUser(user);
log.info("delete "+id);
return "success";
}catch(Exception e){
log.error("删除失败");
return "fail";
}
}
}
下面开始测试,可以用postman这个工具来测试一下。首先检查elasticSearch服务是否启动成功,没有启动就先把服务启动,然后启动你的springBoot项目,用postman测试接口返回的数据。
由于我的springBoot添加了shiro权限控制,必须登录成功后来能访问该接口。
解决起来也很简单,只需把登录成功后的页面中的cookies值加进来就可以了,我是懒得去修改shiro的权限,所以直接这样干了。
测试添加数据接口
测试查询接口
如果你的工程中没有加权限验证,则可以跳过设置cookies的步骤。
查看一下http://localhost:9200/_plugin/head/
增加了一条数据。