前言
本文章可以直接复制粘贴,直接运行
步骤
1. maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
2.配置文件
我这边就简单配置下,自己的demo,就没有配置那么复杂。
search:
elasticsearch:
uris:
- http://localhost:9200
3.创建一个接口继承 ElasticsearchRepository<T,ID>
代码如下:
@NoRepositoryBean
public interface CustomElasticsearchRepository<T, ID> extends ElasticsearchRepository<T, ID> {
Page<T> searchPage(Pageable pageable, Query<?> esQuery);
}
4.实现CustomElasticsearchRepository,实现类继承 SimpleElasticsearchRepository
代码如下:
public class SimpleCustomElasticsearchRepository<T, ID> extends SimpleElasticsearchRepository<T, ID> implements CustomElasticsearchRepository<T, ID> {
private final ElasticsearchRestTemplate elasticsearchRestTemplate;
public SimpleCustomElasticsearchRepository(ElasticsearchEntityInformation<T, ID> metadata, ElasticsearchOperations elasticsearchOperations) {
super(metadata, elasticsearchOperations);
elasticsearchRestTemplate = (ElasticsearchRestTemplate) super.operations;
}
@Override
@SuppressWarnings("unchecked")
public Page<T> searchPage(Pageable pageable, Query<?> esQuery) {
NativeSearchQuery query = new NativeSearchQueryBuilder().withQuery(esQuery.getQuery()).withPageable(pageable).build();
SearchHits<T> searchHits = operations.search(query, getEntityClass(), this.getIndexCoordinates());
AggregatedPage<SearchHit<T>> page = SearchHitSupport.page(searchHits, query.getPageable());
return (Page<T>) SearchHitSupport.unwrapSearchHits(page);
}
}
Query<?> query 使我自己封装的一个lambda条件查询器。具体实现形式可以参考Mybatis-plus 谁能拒绝现成的代码cv呢?毕竟开头都说了本文章直接可以cv运行,做人要说话算数
代码如下:
public interface Query<T> {
String KEYWORD = ".keyword";
QueryBuilder getQuery();
}
/**
*
* must 查询 = mysql中 and
* should查询 = mysql中 or
*
* @author dys
* @date 2022/5/30 14:07
*/
public class BoolLambdaQuery<T> extends AbstractLambdaQuery<T> {
private final BoolQueryBuilder query;
public BoolLambdaQuery() {
this.query = QueryBuilders.boolQuery();
}
public <R> BoolLambdaQuery<T> eq(SFunction<T, R> func, Object param) {
query.must(QueryBuilders.termQuery(FunctionUtil.getName(func), param));
return this;
}
public <R> BoolLambdaQuery<T> orEq(SFunction<T, R> func, Object param) {
query.should(QueryBuilders.termQuery(FunctionUtil.getName(func), param));
return this;
}
public <R> BoolLambdaQuery<T> noEq(SFunction<T, R> func, Object param) {
query.mustNot(QueryBuilders.termQuery(FunctionUtil.getName(func), param));
return this;
}
public <R> BoolLambdaQuery<T> eqKw(SFunction<T, R> func, Object param) {
query.must(QueryBuilders.termQuery(FunctionUtil.getName(func) + KEYWORD, param));
return this;
}
public <R> BoolLambdaQuery<T> orEqKw(SFunction<T, R> func, Object param) {
query.should(QueryBuilders.termQuery(FunctionUtil.getName(func) + KEYWORD, param));
return this;
}
public <R> BoolLambdaQuery<T> noEqKw(SFunction<T, R> func, Object param) {
query.mustNot(QueryBuilders.termQuery(FunctionUtil.getName(func) + KEYWORD, param));
return this;
}
public <R> BoolLambdaQuery<T> like(SFunction<T, R> func, Object param) {
query.must(QueryBuilders.wildcardQuery(FunctionUtil.getName(func), "*" + param + "*"));
return this;
}
public <R> BoolLambdaQuery<T> orLike(SFunction<T, R> func, Object param) {
query.should(QueryBuilders.wildcardQuery(FunctionUtil.getName(func), "*" + param + "*"));
return this;
}
public <R> BoolLambdaQuery<T> noLike(SFunction<T, R> func, Object param) {
query.mustNot(QueryBuilders.wildcardQuery(FunctionUtil.getName(func), "*" + param + "*"));
return this;
}
public <R> BoolLambdaQuery<T> likeKw(SFunction<T, R> func, Object param) {
query.must(QueryBuilders.wildcardQuery(FunctionUtil.getName(func) + KEYWORD, "*" + param + "*"));
return this;
}
public <R> BoolLambdaQuery<T> orLikeKw(SFunction<T, R> func, Object param) {
query.should(QueryBuilders.wildcardQuery(FunctionUtil.getName(func) + KEYWORD, "*" + param + "*"));
return this;
}
public <R> BoolLambdaQuery<T> noLikeKw(SFunction<T, R> func, Object param) {
query.mustNot(QueryBuilders.wildcardQuery(FunctionUtil.getName(func) + KEYWORD, "*" + param + "*"));
return this;
}
public <R> BoolLambdaQuery<T> in(SFunction<T, R> func, Object... param) {
query.must(QueryBuilders.termsQuery(FunctionUtil.getName(func), param));
return this;
}
public <R> BoolLambdaQuery<T> orIn(SFunction<T, R> func, Object... param) {
query.should(QueryBuilders.termsQuery(FunctionUtil.getName(func), param));
return this;
}
public <R> BoolLambdaQuery<T> noIn(SFunction<T, R> func, Object... param) {
query.mustNot(QueryBuilders.termsQuery(FunctionUtil.getName(func), param));
return this;
}
public <R> BoolLambdaQuery<T> in(SFunction<T, R> func, Collection<Object> collection) {
query.must(QueryBuilders.termsQuery(FunctionUtil.getName(func), collection));
return this;
}
public <R> BoolLambdaQuery<T> orIn(SFunction<T, R> func, Collection<Object> collection) {
query.should(QueryBuilders.termsQuery(FunctionUtil.getName(func), collection));
return this;
}
public <R> BoolLambdaQuery<T> noIn(SFunction<T, R> func, Collection<Object> collection) {
query.mustNot(QueryBuilders.termsQuery(FunctionUtil.getName(func), collection));
return this;
}
public <R> BoolLambdaQuery<T> inKw(SFunction<T, R> func, Object... param) {
query.must(QueryBuilders.termsQuery(FunctionUtil.getName(func) + KEYWORD, param));
return this;
}
public <R> BoolLambdaQuery<T> orInKw(SFunction<T, R> func, Object... param) {
query.should(QueryBuilders.termsQuery(FunctionUtil.getName(func) + KEYWORD, param));
return this;
}
public <R> BoolLambdaQuery<T> noInKw(SFunction<T, R> func, Object... param) {
query.mustNot(QueryBuilders.termsQuery(FunctionUtil.getName(func) + KEYWORD, param));
return this;
}
public <R> BoolLambdaQuery<T> inKw(SFunction<T, R> func, Collection<Object> collection) {
query.must(QueryBuilders.termsQuery(FunctionUtil.getName(func) + KEYWORD, collection));
return this;
}
public <R> BoolLambdaQuery<T> orInKw(SFunction<T, R> func, Collection<Object> collection) {
query.should(QueryBuilders.termsQuery(FunctionUtil.getName(func) + KEYWORD, collection));
return this;
}
public <R> BoolLambdaQuery<T> noInKw(SFunction<T, R> func, Collection<Object> collection) {
query.mustNot(QueryBuilders.termsQuery(FunctionUtil.getName(func) + KEYWORD, collection));
return this;
}
public BoolLambdaQuery<T> must(Query<T> query) {
this.query.must(query.getQuery());
return this;
}
public BoolLambdaQuery<T> should(Query<T> query) {
this.query.must(query.getQuery());
return this;
}
public BoolLambdaQuery<T> mustNot(Query<T> query) {
this.query.mustNot(query.getQuery());
return this;
}
@Override
public QueryBuilder getQuery() {
return this.query;
}
@FunctionalInterface
public interface SFunction<T, R> extends Function<T, R>, Serializable {
}
public class FunctionUtil {
private static final String GET = "get";
private static final String WRITE_REPLACE = "writeReplace";
public static <T, R> String getName(SFunction<T, R> func) {
// 直接调用writeReplace
try {
Method writeReplace = func.getClass().getDeclaredMethod(WRITE_REPLACE);
writeReplace.setAccessible(true);
//反射调用
Object sl = writeReplace.invoke(func);
java.lang.invoke.SerializedLambda serializedLambda = (java.lang.invoke.SerializedLambda) sl;
return StringUtil.stringStartTrim(serializedLambda.getImplMethodName(), GET);
} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
5.Application上增加注释,指定SimpleCustomElasticsearchRepository
@SpringBootApplication
@EnableElasticsearchRepositories(repositoryBaseClass = SimpleCustomElasticsearchRepository.class)
public class EsDemoApplication {
public static void main(String[] args) {
SpringApplication.run(EsDemoApplication.class, args);
}
}
6.其他Repository接口继承CustomElasticsearchRepository
public interface CustomerInfoRepository extends CustomElasticsearchRepository<CustomerInfo, Long> {
}
示例结束,如果需要其他方法进行封装的话可以直接添加。
例如,手动扩展Query的功能,将排序,分页封装进去,lambda函数话编程就写到的多爽
BooLambdaQuery<CustomerInfo> lambdaQuery = new BooLambdaQuery<>();
lambdaQuery.MatchAll()
.pageBuilder(DefPageQuery.class)
.sort(CustomerInfo::getId, SortOrder.DESC)
.page(0)
.size(5);
Page<CustomerInfo> customerInfoPage = customerInfoService.pageByQuery(lambdaQuery);
customerInfoPage.getContent().forEach(System.out::println);
这样看着多舒服,还能一个分页接口实现elasticsearch中的三种分页。
皮一下 这个不发~~