Spring-Data-Elasticsearch@4.3.1 集成Spring-Boot 使用NativeSearchQueryBuilder构建查询语句查询

最近有个需求,项目从之前的Spring-Data-Jest换成Spirng-Data-Elasticsearch,Client也换成了最新的7.16.2,这边query这边就需要微改一下。记录下

一开始想用Entity repository的方式,但是发现太麻烦了,需要建立过多的实体,而且query语句也需要大改,后面查看官方文档,看到了使用 org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate的查询方式。

https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#elasticsearch.misc.filter 

 pom

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

configuration

这边我是用的是jhipster生成的,所以直接贴出来默认的configuration

package com.damien.test.generated.config;

import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Arrays;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.convert.ReadingConverter;
import org.springframework.data.convert.WritingConverter;
import org.springframework.data.elasticsearch.config.ElasticsearchConfigurationSupport;
import org.springframework.data.elasticsearch.core.convert.ElasticsearchCustomConversions;

@Configuration
public class ElasticsearchConfiguration extends ElasticsearchConfigurationSupport {

    @Bean
    @Override
    public ElasticsearchCustomConversions elasticsearchCustomConversions() {
        return new ElasticsearchCustomConversions(
            Arrays.asList(
                new ZonedDateTimeWritingConverter(),
                new ZonedDateTimeReadingConverter(),
                new InstantWritingConverter(),
                new InstantReadingConverter(),
                new LocalDateWritingConverter(),
                new LocalDateReadingConverter()
            )
        );
    }

    @WritingConverter
    static class ZonedDateTimeWritingConverter implements Converter<ZonedDateTime, String> {

        @Override
        public String convert(ZonedDateTime source) {
            if (source == null) {
                return null;
            }
            return source.toInstant().toString();
        }
    }

    @ReadingConverter
    static class ZonedDateTimeReadingConverter implements Converter<String, ZonedDateTime> {

        @Override
        public ZonedDateTime convert(String source) {
            if (source == null) {
                return null;
            }
            return Instant.parse(source).atZone(ZoneId.systemDefault());
        }
    }

    @WritingConverter
    static class InstantWritingConverter implements Converter<Instant, String> {

        @Override
        public String convert(Instant source) {
            if (source == null) {
                return null;
            }
            return source.toString();
        }
    }

    @ReadingConverter
    static class InstantReadingConverter implements Converter<String, Instant> {

        @Override
        public Instant convert(String source) {
            if (source == null) {
                return null;
            }
            return Instant.parse(source);
        }
    }

    @WritingConverter
    static class LocalDateWritingConverter implements Converter<LocalDate, String> {

        @Override
        public String convert(LocalDate source) {
            if (source == null) {
                return null;
            }
            return source.toString();
        }
    }

    @ReadingConverter
    static class LocalDateReadingConverter implements Converter<String, LocalDate> {

        @Override
        public LocalDate convert(String source) {
            if (source == null) {
                return null;
            }
            return LocalDate.parse(source);
        }
    }
}

yml 

spring:
    elasticsearch:
        rest:
            uris:http://localhost:9200

service 

//import org.springframework.data.domain.Pageable;
//import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
//import org.springframework.data.elasticsearch.core.SearchHit;
//import org.springframework.data.elasticsearch.core.SearchHits;
//import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
//import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
//import org.springframework.data.elasticsearch.core.query.Query;
//import org.elasticsearch.index.query.TermQueryBuilder;
IndexCoordinates index = IndexCoordinates.of("some_index");

Query query  = new NativeSearchQueryBuilder()
        .withPageable(Pageable.unpaged())
        .withFilter(new TermQueryBuilder("column.keyword", "xxxxx"))
        .build();

SearchHits<HashMap> hit=template.search(query, HashMap.class, index);
for (SearchHit<HashMap> result : hit.getSearchHits()) {
    String somePropertie=(String)result.getContent().get("somePropertie");
     //.....
}

这样就可以构建NativeSearchQuery进行查询了。

当然你要使用repository的方式建立实体可以。 

就类似于JPA的查询方式,建立实体,通过repository进行查询就可以了,就不多赘述了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
spring-boot-starter-data-elasticsearch8是一个用于在Spring Boot应用中集成Elasticsearch的starter包。它提供了一组简化的API和配置,使得在应用中使用Elasticsearch进行数据存储和检索变得更加方便。 在该starter包中,模糊查询可以通过使用ElasticsearchQueryBuilders来实现。QueryBuilders是Elasticsearch提供的一个构建查询的工具类,可以用于构建各种类型的查询条件。 要实现模糊查询,可以使用QueryBuilders提供的模糊查询方法之一,比如fuzzyQuery()。该方法可以根据指定的字段和模糊度来进行模糊查询。以下是一个示例代码: ```java import org.elasticsearch.index.query.QueryBuilders; import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate; import org.springframework.data.elasticsearch.core.query.NativeSearchQuery; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; // 创建NativeSearchQueryBuilder对象 NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder(); // 添加模糊查询条件 queryBuilder.withQuery(QueryBuilders.fuzzyQuery("fieldName", "keyword")); // 创建NativeSearchQuery对象 NativeSearchQuery searchQuery = queryBuilder.build(); // 执行查询 List<YourEntity> results = elasticsearchRestTemplate.queryForList(searchQuery, YourEntity.class); ``` 在上述代码中,我们使用NativeSearchQueryBuilder构建查询条件,然后使用ElasticsearchRestTemplate执行查询。其中,"fieldName"是要进行模糊查询的字段名,"keyword"是要查询的关键词。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值