1. 背景
在海量数据时代,高效的数据检索变得越来越重要。Elasticsearch作为当今最流行的分布式搜索和分析引擎,为开发者提供了强大的全文搜索能力。然而,复杂的查询构建DSL让开发者望而生畏。
2 easy-Elasticsearch诞生
这是一款基于Java注解的轻量级Elasticsearch搜索组件,旨在解决Elasticsearch使用难度较大的问题。开发者无需关心复杂的ES查询DSL语句的构建细节,只需根据业务需求在Java对象属性上添加相应的注解,就能轻松实现高效的搜索功能,大大减少开发难度和时间成本。
官方地址:https://github.com/xinchengzezhi/easy-elasticsearch
3.使用
@Data
public class EsSearchQuery implements Serializable {
/**
* equals 等于
*/
@EsEquals(name = "_id")
private String id;
/**
* not equals 不等于
*/
@EsNotEquals
private String tenantId;
/**
* like 模糊搜索 左右模糊可选 支持?*等特殊字符
*/
@EsLike(name = "orgName", leftLike = true, rightLike = true)
private String purOrgName;
/**
* es 分词匹配
*/
@EsMatch
private String context;
/**
* range 范围查询起
*/
@EsRange(name = "createTime", gt = true, includeLower = true)
private Long createTimeStart;
/**
* range 范围查询止
*/
@EsRange(name = "createTime", lt = true, includeUpper = true)
private Long createTimeEnd;
/**
* 嵌套子查询
*/
@EsMulti
private EsOrgMultiQuery esOrgMultiQuery;
/**
* nested
*/
@EsNested(name = "subList")
private EsNestedQuery nestedQuery;
}
@Service
public class Search{
@Autowired
private EsQueryClient esQueryService;
public String search() {
SearchPageRequest<Object> request = new SearchPageRequest<>();
EsSearchQuery query = new EsSearchQuery();
query.setId("123");
EsOrgMultiQuery orgMultiQuery = new EsOrgMultiQuery();
orgMultiQuery.setCode("10005767661");
orgMultiQuery.setOrgContainSub("13453460001");
request.setParam(query);
request.setPageSize(20);
request.setIndex("alias_idx_test");
SearchPageResult<Map> afterResult = esQueryService.search(request, Map.class);
return JsonUtils.writeAsJson(afterResult);
}
}
dsl日志如下:
{
"from": 0,
"size": 10,
"query": {
"bool": {
"filter": [
{
"terms": {
"status": [
"EFFECTIVE"
],
"boost": 1
}
},
{
"term": {
"deleted": {
"value": 0,
"boost": 1
}
}
},
{
"terms": {
"tenderRelStyle": [
"NONE"
],
"boost": 1
}
},
{
"term": {
"relTenderTaskFlag": {
"value": 0,
"boost": 1
}
}
},
{
"bool": {
"should": [
{
"bool": {
"filter": [
{
"term": {
"orgCode": {
"value": "000101009003",
"boost": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
{
"bool": {
"filter": [
{
"wildcard": {
"orgCode": {
"wildcard": "000101009003*",
"boost": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
{
"bool": {
"filter": [
{
"wildcard": {
"orgCode": {
"wildcard": "000101009003*",
"boost": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
{
"bool": {
"filter": [
{
"wildcard": {
"orgCode": {
"wildcard": "0001010000500002*",
"boost": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
{
"bool": {
"filter": [
{
"wildcard": {
"orgCode": {
"wildcard": "0001*",
"boost": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
{
"bool": {
"filter": [
{
"wildcard": {
"orgCode": {
"wildcard": "00010100*",
"boost": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
{
"bool": {
"filter": [
{
"wildcard": {
"orgCode": {
"wildcard": "0001*",
"boost": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
{
"bool": {
"filter": [
{
"wildcard": {
"orgCode": {
"wildcard": "000101009003*",
"boost": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
{
"bool": {
"should": [
{
"bool": {
"filter": [
{
"wildcard": {
"orgCode": {
"wildcard": "00010100*",
"boost": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
{
"term": {
"tenantId": {
"value": "cscec",
"boost": 1
}
}
}
],
"must_not": [
{
"term": {
"tenderType": {
"value": "OFFLINE",
"boost": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"_source": {
"includes": [
],
"excludes": [
]
},
"sort": [
{
"urgentFlag": {
"order": "desc"
}
},
{
"createTime": {
"order": "desc"
}
}
],
"track_total_hits": 2147483647
}