spring 使用es

es 与 mysql 对比表如下:

在这里插入图片描述
PUT index/type --> update

spring操作es

  • 引入依赖
<!-- elasticsearch的spring-data包 -->
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-elasticsearch</artifactId>
    <version>x.y.z.RELEASE</version>
</dependency>

<!-- elasticsearch客户端,version填入本地安装好的ES版本号 -->
<dependency>
	<groupId>org.elasticsearch.client</groupId>
	<artifactId>transport</artifactId>
	<version>x.y.z</version>
</dependency>
  • 配置es
@Configuration
public class EsConfiguration {
    
    @Value("${elasticsearch.host}")
    private String elasticsearchHost;
    
    @Value("${elasticsearch.cluster.name}")
    private String clusterName;
    
    @Bean
    public Client transportClient() throws Exception {

        TransportClientFactoryBean factory = new TransportClientFactoryBean();
        factory.setClusterNodes(elasticsearchHost);
        factory.setClusterName(clusterName);
        factory.afterPropertiesSet();
        return factory.getObject();
    }
    
    @Bean
    public ElasticsearchTemplate elasticsearchTemplate() throws Exception {
        return new ElasticsearchTemplate(transportClient(), new EsCustomEntityMapper());
    }
}
  • 操作
    1.创建索引
// 1、直接用名称创建
elasticsearchTemplate.createIndex("book");

// 2、填入class对象
elasticsearchTemplate.createIndex(BookEntity.class);

2.创建数据

IndexQuery indexQuery = new IndexQueryBuilder()
				.withId(bookEntity.getId())
				.withObject(bookEntity)
				.build();
elasticsearchTemplate.index(indexQuery);

//多条数据
elasticsearchTemplate.bulkIndex(indexQueries);
  1. 更新
UpdateRequest updateRequest = new UpdateRequest();
updateRequest.doc(mapper.mapObject(chatMessageHistory));

UpdateQuery updateQuery = new UpdateQueryBuilder().withId(chatMessageHistory.getMsgId())
				.withClass(ChatMessageHistory.class).build();
updateQuery.setUpdateRequest(updateRequest);
updateQuery.setIndexName(getIndexNameByCreateDateTime(chatMessageHistory.getCreateDateTime()));

elasticsearchTemplate.update(updateQuery);

3.查询
单字符串查询

SearchQuery searchQuery = new NativeSearchQueryBuilder()
		.withQuery(QueryBuilders.queryStringQuery("菜鸟"))
		.withPageable(new PageRequest(0, 20))
		.build();
List<BookEntity> list = elasticsearchTemplate.queryForList(searchQuery, BookEntity.class);

分页+排序

Pageable pageable= new PageRequest(0, 20,new Sort(Sort.Direction.DESC, "name"));
SearchQuery searchQuery = new NativeSearchQueryBuilder()
		.withQuery(QueryBuilders.queryStringQuery("菜鸟"))
		.withPageable(pageable)
		.build();
Page<BookEntity> list = elasticsearchTemplate.queryForPage(searchQuery, BookEntity.class);

//排序
SortBuilder sortBuilder = SortBuilders.fieldSort("price")   //排序字段
           .order(SortOrder.DESC);   //排序方式

   SearchQuery searchQuery = new NativeSearchQueryBuilder()
           .withQuery(matchQuery("name", "gaolujie"))
           .withSort(sortBuilder)
           .build();

   return elasticsearchTemplate.queryForList(searchQuery, Product.class);

模糊查询

Pageable pageable = new PageRequest(0, 10);
SearchQuery searchQuery = new NativeSearchQueryBuilder()
		.withQuery(QueryBuilders.matchQuery("name", "菜鸟"))
		.withPageable(pageable)
		.build();
List<BookEntity> list = elasticsearchTemplate.queryForList(searchQuery, BookEntity.class);

其余匹配:类似mysql中like "%word%"的模糊匹配

Pageable pageable = new PageRequest(0, 10);
SearchQuery searchQuery = new NativeSearchQueryBuilder()
		.withQuery(QueryBuilders.matchPhraseQuery("name", "菜鸟"))
		.withPageable(pageable)
		.build();
List<BookEntity> list = elasticsearchTemplate.queryForList(searchQuery, BookEntity.class);

Term全等查询

Pageable pageable = new PageRequest(0, 10);
SearchQuery searchQuery = new NativeSearchQueryBuilder()
		.withQuery(QueryBuilders.termQuery("name", "菜鸟"))
		.withPageable(pageable)
		.build();
List<BookEntity> list = elasticsearchTemplate.queryForList(searchQuery, BookEntity.class);

组合查询
must代表返回的文档必须满足must子句的条件,会参与计算分值;
filter代表返回的文档必须满足filter子句的条件,但不会参与计算分值;
should代表返回的文档可能满足should子句的条件,也可能不满足,有多个should时满足任何一个就可以,通过minimum_should_match设置至少满足几个。
mustnot代表必须不满足子句的条件。

QueryBuilder filterQuery = QueryBuilders
				.boolQuery()
				.filter(QueryBuilders.termQuery("name", "菜鸟"))
				.filter(QueryBuilders.termQuery("author", "小菜"));
List<BookEntity> list = elasticsearchTemplate.queryForList(filterQuery, BookEntity.class);
  • 聚合操作
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(
                        matchQuery("name", "heiren")
                )
                .addAggregation(
                        AggregationBuilders
                                .terms("group_by_tags")
                                .field("tags")
                                .order(
                                        Terms.Order.aggregation("price", false)
                                )
                                .subAggregation(
                                        AggregationBuilders
                                                .avg("price")
                                                .field("price")
                                )
                )
                .build();


        return elasticsearchTemplate.query(searchQuery, response -> {

            //直接返回es原封结果到前端
            return JSONObject.parseObject(response.toString());
        });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值