栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Elasticsearch7.6 + SpringBoot

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Elasticsearch7.6 + SpringBoot

1.集成环境准备

1.导入spring-data-elasticsearch依赖

注意:依赖的版本与Elasticsearch版本一致,并且springBoot的版本一致

这里使用的springboot为2.4,elasticsearch依赖为7.9.3,elasticsearch也为7.9.3

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O0p64pZ5-1644290370095)(D:笔记Elasticsearch7.6 + SpringBoot1644285206.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HeP51Ix0-1644290370096)(D:笔记Elasticsearch7.6 + SpringBoot1644284886.png)]


        
            org.springframework.data
            spring-data-elasticsearch
            ${version}.RELEASE
        
2.elasticsearch配置文件
#elasticsearch配置
#配置es(配置es的地址)
spring.elasticsearch.rest.uris=192.168.1.100:9200

配置文件

@Configuration
public class EsConfig {
    //指向es地址
    @Value("${spring.elasticsearch.rest.uris}")
    private String edUrl;

    @Bean
    RestHighLevelClient client() {
        ClientConfiguration clientConfiguration = ClientConfiguration.builder()
                .connectedTo(edUrl)
                .build();

        return RestClients.create(clientConfiguration).rest();
    }
}
3.实体类准备
@Data
@document(indexName = "user")//索引名称 建议与实体类一致
public class User {
    @Id
    private Integer id;
    
    @Field(type = FieldType.Auto)//自动检测类型
    private Integer age;
    
    @Field(type = FieldType.Keyword)//手动设置为keyword  但同时也就不能分词
    private String name;
    
    @Field(type = FieldType.Text,analyzer = "ik_smart",searchAnalyzer = "ik_max_word")//设置为text  可以分词
    private String info;
}
4.Elasticsearch Service准备

ElasticsearchRepository<,>第一个就是所准备的实体类,第二个是id的类型

public interface EsUserService extends ElasticsearchRepository {
    //根据name查询
    List findByName(String name);

    //根据name和info查询
    List findByNameAndInfo(String name,String info);
}

继承完这个会提供最基本的增删改查方法,也可以自己定义一些,自己定义的方法命名需要符合规则,并不需要自己去实现

简单查询

elasticsearchTemplate需要采用ElasticsearchRestTemplate

简单的查询可以通过Elasticsearch Service来进行查询

@RestController
public class EsController {
    @Autowired
    private ElasticsearchRestTemplate elasticsearchTemplate;
    @Autowired
    private EsUserService esUserService;
	//存数据
    @GetMapping("saveUser")
    public ResultVO saveUser(){
     //添加索引mapping    索引会自动创建但mapping自只用默认的这会导致分词器不生效 所以这里我们手动导入mapping
        elasticsearchTemplate.putMapping(User.class);
        Random random = new Random();
        List users = new ArrayList<>();
        for (int i=0;i<20;i++){
            User user = new User();
            user.setId(i);
            user.setName(names[random.nextInt(9)]);
            user.setAge(random.nextInt(40)+i);
            user.setInfo(infos[random.nextInt(2)]);
            users.add(user);
        }
        Iterable users1 = esUserService.saveAll(users);
        return new ResultVO(users1);
    }

    //根据id查询数据
    @GetMapping("getDataById")
    public ResultVO getDataById(Integer id){
        return new ResultVO(esUserService.findById(id));
    }

    //分页查询所有数据
    @GetMapping("getAllDataByPage")
    public ResultVO getAllDataByPage(){
        //本该传入page和size,这里为了方便就直接写死了
        Pageable page = PageRequest.of(0,10, Sort.Direction.ASC,"id");
        Page all = esUserService.findAll(page);
        return new ResultVO(all.getContent());
    }

    //根据名字查询
    @GetMapping("getDataByName")
    public ResultVO getDataByName(String name){
        return new ResultVO(esUserService.findByName(name));
    }

    //根据名字和介绍查询
    @GetMapping("getDataByNameAndInfo")
    public ResultVO getDataByNameAndInfo(String name,String info){
        //这里是查询两个字段取交集,即代表两个条件需要同时满足
        return new ResultVO(esUserService.findByNameAndInfo(name,info));
    }
}
分词高亮查询(复杂查询)

复杂的查询可以通过ElasticsearchRestTemplate来实现

 //查询高亮显示
    @GetMapping("getHightByUser")
    public ResultVO getHightByUser(String value){
        //根据一个值查询多个字段  并高亮显示  这里的查询是取并集,即多个字段只需要有一个字段满足即可
        //需要查询的字段
        BoolQueryBuilder boolQueryBuilder= QueryBuilders.boolQuery()
                .should(QueryBuilders.matchQuery("info",value))
                .should(QueryBuilders.matchQuery("name",value));
  //构建高亮查询
        NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(boolQueryBuilder)
                .withHighlightFields(
                        new HighlightBuilder.Field("info")
                        ,new HighlightBuilder.Field("name"))
                .withHighlightBuilder(new HighlightBuilder().preTags("").postTags(""))
                .build();
        //查询
        SearchHits search = elasticsearchTemplate.search(searchQuery, User.class);
        //得到查询返回的内容
        List> searchHits = search.getSearchHits();
        //设置一个最后需要返回的实体类集合
        List users = new ArrayList<>();
        //遍历返回的内容进行处理
        for(SearchHit searchHit:searchHits){
            //高亮的内容
            Map> highlightFields = searchHit.getHighlightFields();
            //将高亮的内容填充到content中
            searchHit.getContent().setName(highlightFields.get("name")==null ? searchHit.getContent().getName():highlightFields.get("name").get(0));
            searchHit.getContent().setInfo(highlightFields.get("info")==null ? searchHit.getContent().getInfo():highlightFields.get("info").get(0));
            //放到实体类中
            users.add(searchHit.getContent());
        }
        return new ResultVO(users);
    }
多条件组合
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

当我们需要多条件去查询的时候,需要了解should、must、mustNot、filter区别,然后进行组合出想要的条件

should:如果满足这些语句中的任意语句,将增加 _score ,否则,无任何影响。它们主要用于修正每个文档的相关性得分。相当于sql中的or

must:必须 匹配这些条件才能被包含进来,相当于sql中的 and(会分词)

mustNot:必须不 匹配这些条件才能被包含进来,相当于sql中的 not

filter:必须 匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。

构造查询条件
    termQuery:精确查询(不分词)

使用termQuery要注意的是,Elasticsearch5之后,取消了string类型,将原来的string类型拆分为text和keyword两种类型,他们的区别在于text会对字段进行分词处理,而keyword则不会。

    matchQuery:匹配查询(分词)

match query搜索的时候,首先会解析查询字符串,进行分词,然后查询,所以假如我搜索的条件输入的是"六年级",则会把各个年级(一年级至九年级)的数据都查询出来,因为其中都包含’年级’ 。

    queryString:精确查询

    wildcardQuery:模糊查询
    keyword两种类型,他们的区别在于text会对字段进行分词处理,而keyword则不会。

    rangeQuery:范围查询

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

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

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