栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 数据挖掘与分析

elasticsearch集成springboot全文检索实操

elasticsearch集成springboot全文检索实操

需求:根据用户简介和所在城市,全文检索出用户信息

(目前不考虑数据量大的情况,简单运用)

步骤:

  1. 导入依赖,配置文件写好配置
  2. 创建两个实体类,一个实体类对应mysql的用户表,一个es实体类对应es的用户索引库(数据自己存入)
  3. 先从es中根据关键字全文检索出数据,然后根据这些数据信息从mysql中查出对应的所有完整的数据。
  4. 将查询出的完整数据响应回浏览器
1、日常导入依赖

     org.springframework.boot
     spring-boot-starter-data-elasticsearch
2、配置文件(springboot默认有,不改的话也可以不写)
#elasticsearch
spring.elasticsearch.rest.uris=http://localhost:9200
3、写一个es实体类存储对应mysql表中需要搜索的字段(用户为例) MySQL对应的实体类的字段:
    private String nickname;  //昵称
    private String phone;  //手机
    private String email;  //邮箱

    @JsonIgnore
    private String password; //密码
    private Integer gender = GENDER_SECRET; //性别
    private Integer level = 0;  //用户级别
    private String city;  //所在城市
    private String headImgUrl; //头像
    private String info;  //个性签名
    private Integer state = STATE_NORMAL; //状态
Elasticsearch对应的es实体类
@Getter
@Setter
@document(indexName="userinfo")
public class UserInfoEs implements Serializable {
    public static final String INDEX_NAME = "userinfo";
    @Id
    //@Field 每个文档的字段配置(类型、是否分词、是否存储、分词器 )
    @Field(store=true, index = false,type = FieldType.Long)
    private Long id;  //用户id
    @Field(index=true,analyzer="ik_max_word",store=true,searchAnalyzer="ik_max_word",type = FieldType.Text)
    private String nickname;
    @Field(index=true,store=true,type = FieldType.Keyword)
    private String city;
    @Field(index=true,analyzer="ik_max_word",store=true,searchAnalyzer="ik_max_word",type = FieldType.Text)
    private String info;
}
4、repository,service及实现
public interface UserInfoEsRepository extends ElasticsearchRepository {
    
    @Query("{"multi_match":{"query":"?0","fields": ["info", "city"]}}")//?0表示替换下面的第几个形参
    @Highlight(
            fields = {
                    @HighlightField(name = "info"),
                    @HighlightField(name = "city"),
            },
            parameters = @HighlightParameters(
                    preTags = "",
                    postTags = ""
            )
    )
    List> findAllByInfoOrCity(String keyword);
}
public interface IUserInfoEsService {
    void save(UserInfoEs userInfoEs);
    void update(UserInfoEs userInfoEs);
    UserInfoEs get(Long id);
    List list();
    void delete(Long id);
    
    Map searchData(String keyword);
}
   //service实现类
    @Override
    public Map searchData(String keyword) {
        //从es全文检索出所有相关的数据 (查询结果都是SearchHit类型)
        List> userInfoEsList = userInfoEsRepository.findAllByInfoOrCity(keyword);
        List userInfoList = new ArrayList<>();
        //根据从es检索的数据查出mysql中对应的数据并封装
        for (SearchHit hit : userInfoEsList) {
            UserInfoEs userInfoEs = hit.getContent();
            UserInfo userInfo = userInfoService.getById(userInfoEs.getId());
            Map> highlightFields = hit.getHighlightFields();
            //将查出来的高亮信息修改到查出来的对象上
            for (String key : highlightFields.keySet()) {
                if (key.equals("info")) {
                    userInfo.setInfo(highlightFields.get(key).get(0));
                }
                if (key.equals("city")) {
                    userInfo.setCity(highlightFields.get(key).get(0));
                }
            }
            userInfoList.add(userInfo);
        }

        Map map = new HashMap<>();
        map.put("users",userInfoList);
        return map;
    }
5、controller
    @GetMapping("q")
    public JsonResult query(String keyword) {
        return JsonResult.success(userInfoEsService.searchData(keyword));
    }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/278649.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号