ElasticSearch6.x 基于SpringBoot 实现ElasticSearch的多条件查询解析

你猜 阅读:229 2021-03-31 17:02:43 评论:0

SpringBoot 功能封装涉及ElasticSearch的多条件查询方法约定如下:

public SearchResponse searchConstantScoreQuery(String[] indexs, String[] types, String name, Object value, float boost)

public SearchResponse searchBoolQuery(String[] indexs, String[] types, List<QueryBuilder> musts, List<QueryBuilder> mustNots, List<QueryBuilder> shoulds, List<QueryBuilder> filters)

public SearchResponse searchDisMaxQuery(String[] indexs, String[] types, List<QueryBuilder> query, float boost, float breaker)

public SearchResponse searchFunctionScoreQuery(String[] indexs, String[] types, QueryBuilder matchQuery, String fieldName, Object origin, Object scale)

public SearchResponse searchBoostiQuery(String[] indexs, String[] types, QueryBuilder positiveQuery,  QueryBuilder negativeQuery, float boost)

在上一篇文中说到:ElasticSearch6.x 基于SpringBoot 实现ElasticSearch连接功能封装,将约定的方法填充到ElasticSearchIndexUtil.java 工具类中。

 
@Component 
public class ElasticSearchIndexUtil { 
	// 引入 Ela 连接实列化对象 
	@Autowired 
	private TransportClient client; 
 
/** 
	 * 功能描述:多条件检索之constant score query 
	 * @param indexs 索引数组 
	 * @param types  类型数组 
	 * @param name   文档属性名称 
	 * @param value  文档属性值 
	 * @param boost  权重值 
	 * @return 
	 * @throws InterruptedException 
	 * @throws ExecutionException 
	 */ 
	public SearchResponse searchConstantScoreQuery(String[] indexs, String[] types, String name, Object value, float boost) throws InterruptedException, ExecutionException{ 
		TermQueryBuilder termQuery = QueryBuilders.termQuery(name, value); 
		 
		ConstantScoreQueryBuilder constantScoreQuery = QueryBuilders.constantScoreQuery(termQuery).boost(boost); 
		SearchResponse response = client.prepareSearch(indexs).setTypes(types).setQuery(constantScoreQuery).execute().get(); 
		return response; 
	} 
	 
	 
	/** 
	 * 功能描述:多条件查询之bool query 
	 * @param indexs 索引数组 
	 * @param types  类型数组 
	 * @param musts  必须查询 
	 * @param mustNots 不能查询 
	 * @param shoulds  应查询 
	 * @param filters  拦截条件 
	 * @return 
	 * @throws InterruptedException 
	 * @throws ExecutionException 
	 */ 
	public SearchResponse searchBoolQuery(String[] indexs, String[] types, List<QueryBuilder> musts, List<QueryBuilder> mustNots, List<QueryBuilder> shoulds, List<QueryBuilder> filters) throws InterruptedException, ExecutionException{ 
		BoolQueryBuilder boolQuery =  QueryBuilders.boolQuery(); 
		 
		musts.stream().forEach(item->{ 
			boolQuery.must(item); 
		}); 
		mustNots.stream().forEach(item->{ 
			boolQuery.mustNot(item); 
		}); 
		shoulds.stream().forEach(item ->{ 
			boolQuery.should(item); 
		}); 
		filters.stream().forEach(item->{ 
			boolQuery.filter(item); 
		}); 
		 
		SearchResponse response = client.prepareSearch(indexs).setTypes(types).setQuery(boolQuery).execute().get(); 
		return response; 
	} 
	 
	/** 
	 * 功能描述:多条件查询之dis max query 
	 * @param indexs   索引数组 
	 * @param types    类型数组 
	 * @param query    查询条件对列 
	 * @param boost    权重值 
	 * @param breaker  判断值 
	 * @return 
	 * @throws ExecutionException  
	 * @throws InterruptedException  
	 */ 
	public SearchResponse searchDisMaxQuery(String[] indexs, String[] types, List<QueryBuilder> query, float boost, float breaker) throws InterruptedException, ExecutionException{ 
		DisMaxQueryBuilder disMaxQuery = QueryBuilders.disMaxQuery(); 
		query.stream().forEach(item ->{ 
			disMaxQuery.add(item); 
		}); 
		disMaxQuery.boost(boost).tieBreaker(breaker); 
		SearchResponse response = client.prepareSearch(indexs).setTypes(types).setQuery(disMaxQuery).execute().get(); 
		return response; 
	} 
	 
	/** 
	 *  功能描述:多条件查询之function score query 
	 * @param indexs 索引数组 
	 * @param types  类型数组 
	 * @param matchQuery  条件 
	 * @param fieldName   文档属性名称 
	 * @param origin   
	 * @param scale 
	 * @return 
	 * @throws InterruptedException 
	 * @throws ExecutionException 
	 */ 
	public SearchResponse searchFunctionScoreQuery(String[] indexs, String[] types, QueryBuilder matchQuery, String fieldName, Object origin, Object scale) throws InterruptedException, ExecutionException{ 
		FilterFunctionBuilder[] functions = { 
				new FunctionScoreQueryBuilder.FilterFunctionBuilder(matchQuery,  ScoreFunctionBuilders.randomFunction().seed(Math.round(Math.random() * 100))), 
				new FunctionScoreQueryBuilder.FilterFunctionBuilder(ScoreFunctionBuilders.exponentialDecayFunction(fieldName, origin, scale)) 
		}; 
		SearchResponse response = client.prepareSearch(indexs).setTypes(types).setQuery(QueryBuilders.functionScoreQuery(functions)).execute().get(); 
		return response; 
	} 
	 
	/** 
	 * 功能描述:多条件查询之boost query 
	 * @param indexs 索引数组 
	 * @param types  类型数组 
	 * @param positiveQuery   条件 
	 * @param negativeQuery   条件 
	 * @param boost  权重值 
	 * @return 
	 * @throws ExecutionException  
	 * @throws InterruptedException  
	 */ 
	public SearchResponse searchBoostiQuery(String[] indexs, String[] types, QueryBuilder positiveQuery,  QueryBuilder negativeQuery, float boost) throws InterruptedException, ExecutionException{ 
		BoostingQueryBuilder boostingQuery = QueryBuilders.boostingQuery(positiveQuery, negativeQuery); 
		boostingQuery.boost(boost); 
		 
		SearchResponse response = client.prepareSearch(indexs).setTypes(types).setQuery(boostingQuery).execute().get(); 
		return response; 
	} 
}

 

声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

发表评论
搜索
排行榜
KIKK导航

KIKK导航

关注我们