NumberServiceImpl.java
5.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package com.uccc.number.service.impl;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.uccc.number.domain.*;
import com.uccc.number.mapper.NumberMapper;
import com.uccc.number.service.NumberService;
import com.uccc.pretty.common.Result;
import io.searchbox.client.JestClient;
import io.searchbox.core.Search;
import io.searchbox.core.SearchResult;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@Service
public class NumberServiceImpl implements NumberService {
final private Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private NumberMapper numberMapper;
@Autowired
private JestClient jestClient;
@Value("${elasticsearch.index}")
private String indexName;
@Override
public Result getESNumbers(NumberQuery query) {
logger.info("indexName:{}", indexName);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().trackTotalHits(true);
;
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
queryBuilder.must(QueryBuilders.matchPhraseQuery("is_delete", false));
//已售出和未售出的号码,其他不显示
queryBuilder.must(QueryBuilders.rangeQuery("status").gte(1));
queryBuilder.must(QueryBuilders.rangeQuery("status").lte(2));
if (!StringUtils.isEmpty(query.getProvince()) && !"归属地".equals(query.getProvince())) {
if (!StringUtils.isEmpty(query.getCity()))
queryBuilder.must(QueryBuilders.matchPhraseQuery("city", query.getCity()));
else queryBuilder.must(QueryBuilders.matchPhraseQuery("province", query.getProvince()));
}
if (query.getMinPrice() > 0) queryBuilder.must(QueryBuilders.rangeQuery("price").gte(query.getMinPrice()));
if (query.getMaxPrice() > 0) queryBuilder.must(QueryBuilders.rangeQuery("price").lte(query.getMaxPrice()));
if (!StringUtils.isEmpty(query.getNetwork()))
queryBuilder.must(QueryBuilders.matchPhraseQuery("service", query.getNetwork()));
if (!StringUtils.isEmpty(query.getVague()))
queryBuilder.must(QueryBuilders.wildcardQuery("number", "*" + query.getVague() + "*"));
String tags = "";
if (!StringUtils.isEmpty(query.getPosition())) {
if (Position.AFTER.toString().equals(query.getPosition())) tags = Position.AFTER.toString();
if (Position.LATER.toString().equals(query.getPosition())) tags = Position.LATER.toString();
}
if (!StringUtils.isEmpty(query.getLaw())) {
tags = tags + query.getLaw();
queryBuilder.must(QueryBuilders.matchPhraseQuery("tags", tags));
}
//遍历排除和包含
if (!CollectionUtils.isEmpty(query.getExclude())) {
query.getExclude().stream().forEach(b -> {
queryBuilder.must(QueryBuilders.matchPhraseQuery("tags", b));
});
}
if (!CollectionUtils.isEmpty(query.getInclude())) {
query.getInclude().stream().forEach(b -> {
queryBuilder.must(QueryBuilders.matchPhraseQuery("tags", b));
});
}
if (!StringUtils.isEmpty(query.getType())) {
//情侣、生日、秒杀
if (!Tag.ALL.toString().equals(query.getType()))
queryBuilder.must(QueryBuilders.matchPhraseQuery("tags", query.getType()));
}
searchSourceBuilder.query(queryBuilder);
//排序
if (query.getSort() == 1) searchSourceBuilder.sort("price", SortOrder.ASC);
if (query.getSort() == 2) searchSourceBuilder.sort("price", SortOrder.DESC);
/**
* 分页
*/
searchSourceBuilder.size(query.getPageSize() == 0 ? 20 : query.getPageSize());
searchSourceBuilder.from(query.getCurrentPage());
System.out.println(searchSourceBuilder.toString());
Search search = new Search.Builder(searchSourceBuilder.toString())
.addIndex(indexName)
.build();
try {
SearchResult result = jestClient.execute(search);
JsonObject jsonObject = result.getJsonObject();
JsonElement jsonElement = jsonObject.get("hits").getAsJsonObject().get("total").getAsJsonObject().get("value");
List<SearchResult.Hit<NumberEntity, Void>> hits = result.getHits(NumberEntity.class);
List<NumberEntity> lists = new ArrayList<>();
hits.stream().forEach(b -> lists.add(b.source));
PageInfo pageInfo = new PageInfo(query.getCurrentPage(), query.getPageSize(), jsonElement.getAsLong(), lists);
return new Result().success(pageInfo);
} catch (Exception e) {
logger.error("es number data err: {}", e.getMessage());
}
return new Result().fail();
}
}