springBoot整合elasticSearch

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/
这里写图片描述
增加了一条数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值