目录
安装elasticsearch
docker run -p 9200:9200 -p 9300:9300 --name es_643 -d elasticsearch:6.4.3
maven
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.16.RELEASE</version>
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
数据来源: 网易数据
https://c.m.163.com/ug/api/wuhan/app/data/list-total?t=334061612053
Java代码
import com.alibaba.fastjson.JSONObject;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import lombok.Data;
import lombok.ToString;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.StringTerms;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder.BoundaryScannerType;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.noear.esearchx.EsContext;
import org.noear.esearchx.EsGlobal;
import org.noear.esearchx.model.EsData;
import org.springframework.data.annotation.Id;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.ResultsExtractor;
import org.springframework.data.elasticsearch.core.SearchResultMapper;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPageImpl;
import org.springframework.data.elasticsearch.core.query.IndexQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
public class EsTest {
public static void add(JSONObject jsonObject, List<IndexQuery> queries, String pid,
String pname) {
String name = jsonObject.getString("name");
String id = jsonObject.getString("id");
JSONObject total = jsonObject.getJSONObject("total");
Integer confirm = total.getInteger("confirm");
Integer input = total.getInteger("input");
Integer severe = total.getInteger("severe");
Integer heal = total.getInteger("heal");
Integer dead = total.getInteger("dead");
Integer suspect = total.getInteger("suspect");
Area area = new Area();
area.setId(id);
area.setPid(pid);
area.setPname(pname);
area.setName(name);
area.setConfirm(confirm);
area.setInput(input);
area.setSevere(severe);
area.setHeal(heal);
area.setDead(dead);
area.setSuspect(suspect);
IndexQuery indexQuery = new IndexQuery();
indexQuery.setId(id.toString());
indexQuery.setObject(area);
indexQuery.setIndexName("area");
queries.add(indexQuery);
}
public static void main(String[] args) throws Exception {
// String data = HttpUtil.get(
// "https://c.m.163.com/ug/api/wuhan/app/data/list-total?t=334061612053");
// JSONObject parseObject = JSONObject.parseObject(data);
// JSONObject dataobj = parseObject.getJSONObject("data");
// JSONArray areaTree = dataobj.getJSONArray("areaTree");
// List<IndexQuery> queries = new ArrayList<>();
// for (int i = 0; i < areaTree.size(); i++) {
// JSONObject jsonObject = areaTree.getJSONObject(i);
// JSONArray children = jsonObject.getJSONArray("children");
// String id = jsonObject.getString("id");
// String name = jsonObject.getString("name");
// for (int i1 = 0; i1 < children.size(); i1++) {
// JSONObject childrenJSONObject = children.getJSONObject(i1);
// String childrenid = childrenJSONObject.getString("id");
// String childrenname = childrenJSONObject.getString("name");
// JSONArray childrenJSONObjectJSONArray = childrenJSONObject.getJSONArray("children");
// for (int i2 = 0; i2 < childrenJSONObjectJSONArray.size(); i2++) {
// JSONObject childrenJSONObject2 = childrenJSONObjectJSONArray.getJSONObject(i2);
// add(childrenJSONObject2, queries, childrenid, childrenname);
// }
// add(childrenJSONObject, queries, id, name);
// }
// add(jsonObject, queries, "-1", "");
//
//
// }
Settings settings = Settings.builder().put("cluster.name", "docker-cluster").build();
TransportClient transportClient = new PreBuiltTransportClient(settings);
transportClient.addTransportAddress(
new TransportAddress(InetAddress.getByName("localhost"), 9300));
ElasticsearchTemplate elasticsearchTemplate = new ElasticsearchTemplate(transportClient);
// boolean exists = elasticsearchTemplate.indexExists(Area.class);
// System.out.println(exists);
// if (exists) {
// boolean deleteIndex = elasticsearchTemplate.deleteIndex(Area.class);
// System.out.println(deleteIndex);
// }
// boolean index = elasticsearchTemplate.createIndex(Area.class);
// System.out.println(index);
// elasticsearchTemplate.bulkIndex(queries);
// queries.clear();
//mysql =
// NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
// nativeSearchQueryBuilder.withQuery(QueryBuilders.termQuery("name.keyword","中国"));
// NativeSearchQuery searchQuery = nativeSearchQueryBuilder.build();
// AggregatedPage<Area> areas = elasticsearchTemplate.queryForPage(searchQuery, Area.class);
// System.out.println(areas.getContent());
//mysql in
// NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
// nativeSearchQueryBuilder.withQuery(QueryBuilders.termsQuery("name.keyword", "美国", "日本本土"));
// NativeSearchQuery searchQuery = nativeSearchQueryBuilder.build();
// AggregatedPage<Area> areas = elasticsearchTemplate.queryForPage(searchQuery, Area.class);
// System.out.println(areas.getContent());
//mysql like
// NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
// nativeSearchQueryBuilder.withQuery(QueryBuilders.wildcardQuery("name.keyword", "*斯坦*"));
// NativeSearchQuery searchQuery = nativeSearchQueryBuilder.build();
// AggregatedPage<Area> areas = elasticsearchTemplate.queryForPage(searchQuery, Area.class);
// System.out.println(areas.getContent());
//mysql >10000
// NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
// nativeSearchQueryBuilder.withQuery(QueryBuilders.rangeQuery("confirm").from(1000000));
// NativeSearchQuery searchQuery = nativeSearchQueryBuilder.build();
// AggregatedPage<Area> areas = elasticsearchTemplate.queryForPage(searchQuery, Area.class);
// System.out.println(areas.getContent());
//mysql between 1000 and 10000
// NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
// nativeSearchQueryBuilder.withQuery(QueryBuilders.rangeQuery("confirm").from(1000).to(10000));
// NativeSearchQuery searchQuery = nativeSearchQueryBuilder.build();
// AggregatedPage<Area> areas = elasticsearchTemplate.queryForPage(searchQuery, Area.class);
// System.out.println(areas.getContent());
//mysql is null
// NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
// BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
// ExistsQueryBuilder existsQueryBuilder = QueryBuilders.existsQuery("input");
// boolQueryBuilder.mustNot(existsQueryBuilder);
// nativeSearchQueryBuilder.withQuery(boolQueryBuilder);
// NativeSearchQuery searchQuery = nativeSearchQueryBuilder.build();
// AggregatedPage<Area> areas = elasticsearchTemplate.queryForPage(searchQuery, Area.class);
// System.out.println(areas.getContent());
//mysql is not null
// NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
// BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
// ExistsQueryBuilder existsQueryBuilder = QueryBuilders.existsQuery("input");
// boolQueryBuilder.must(existsQueryBuilder);
// nativeSearchQueryBuilder.withQuery(boolQueryBuilder);
// NativeSearchQuery searchQuery = nativeSearchQueryBuilder.build();
// AggregatedPage<Area> areas = elasticsearchTemplate.queryForPage(searchQuery, Area.class);
// System.out.println(areas.getContent());
//mysql order by
// NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
// FieldSortBuilder sortBuilder = SortBuilders.fieldSort("confirm").order(SortOrder.DESC);
// FieldSortBuilder sortBuilder = SortBuilders.fieldSort("confirm").order(SortOrder.ASC);
// nativeSearchQueryBuilder.withSort(sortBuilder);
// NativeSearchQuery searchQuery = nativeSearchQueryBuilder.build();
// AggregatedPage<Area> areas = elasticsearchTemplate.queryForPage(searchQuery, Area.class);
// System.out.println(areas.getContent());
//mysql max min avg
// NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
// nativeSearchQueryBuilder.addAggregation(
// AggregationBuilders.max("max_confirm").field("confirm").valueType(ValueType.LONG));
// nativeSearchQueryBuilder.addAggregation(
// AggregationBuilders.min("min_confirm").field("confirm").valueType(ValueType.LONG));
// nativeSearchQueryBuilder.addAggregation(
// AggregationBuilders.avg("avg_confirm").field("confirm").valueType(ValueType.LONG));
// nativeSearchQueryBuilder.addAggregation(
// AggregationBuilders.sum("sum_confirm").field("confirm").valueType(ValueType.LONG));
// nativeSearchQueryBuilder.addAggregation(
// AggregationBuilders.stats("stats_confirm").field("confirm").valueType(ValueType.LONG));
// nativeSearchQueryBuilder.withFields("id");
// NativeSearchQuery searchQuery = nativeSearchQueryBuilder.build();
// AggregatedPage<Area> areas = elasticsearchTemplate.queryForPage(searchQuery, Area.class);
// InternalMax maxConfirm = (InternalMax) areas.getAggregation("max_confirm");
// InternalMin minConfirm = (InternalMin) areas.getAggregation("min_confirm");
// InternalAvg avgConfirm = (InternalAvg) areas.getAggregation("avg_confirm");
// InternalSum sumConfirm = (InternalSum) areas.getAggregation("sum_confirm");
// InternalStats statsConfirm = (InternalStats) areas.getAggregation("stats_confirm");
// System.out.println(BigDecimal.valueOf(maxConfirm.getValue()));
// System.out.println(BigDecimal.valueOf(minConfirm.getValue()));
// System.out.println(BigDecimal.valueOf(avgConfirm.getValue()).setScale(0, RoundingMode.HALF_UP));
// System.out.println(BigDecimal.valueOf(sumConfirm.getValue()));
// System.out.println("--------------------Stats---------------------------");
// System.out.println(BigDecimal.valueOf(statsConfirm.getMax()));
// System.out.println(BigDecimal.valueOf(statsConfirm.getMin()));
// System.out.println(BigDecimal.valueOf(statsConfirm.getAvg()));
// System.out.println(BigDecimal.valueOf(statsConfirm.getSum()));
// System.out.println(BigDecimal.valueOf(statsConfirm.getCount()));
// //mysql select max(),min(),count(),sum(),avg() group by
// NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
// nativeSearchQueryBuilder.addAggregation(
// AggregationBuilders.terms("pname").field("pname.keyword").size(100)
// .subAggregation(AggregationBuilders.stats("stats_confirm").field("confirm")));
// nativeSearchQueryBuilder.withFields("id");
// nativeSearchQueryBuilder.withPageable(new PageRequest(0, 1));
// NativeSearchQuery searchQuery = nativeSearchQueryBuilder.build();
// AggregatedPage<Area> areas = elasticsearchTemplate.queryForPage(searchQuery, Area.class);
// StringTerms aggregation = (StringTerms) areas.getAggregation("pname");
// System.out.println(aggregation);
// highlight
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
// nativeSearchQueryBuilder.withHighlightBuilder(
// new HighlightBuilder().field("name.keyword").preTags("<red>").postTags("</red>")
// .boundaryScannerType(BoundaryScannerType.SENTENCE).boundaryScannerLocale("zh_CN"));
nativeSearchQueryBuilder.withHighlightFields(
new HighlightBuilder.Field("name.keyword").postTags("</red>").preTags("<red>")
.boundaryScannerType(BoundaryScannerType.WORD));
nativeSearchQueryBuilder.withQuery(QueryBuilders.wildcardQuery("name.keyword", "*日*"));
NativeSearchQuery build = nativeSearchQueryBuilder.build();
Page<Area> areas = elasticsearchTemplate.queryForPage(build, Area.class,
new SearchResultMapper() {
@Override
public <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> clazz,
Pageable pageable) {
SearchHits hits = response.getHits();
Iterator<SearchHit> iterator = hits.iterator();
List<Area> list = new ArrayList<>();
while (iterator.hasNext()) {
SearchHit next = iterator.next();
Map<String, HighlightField> highlightFields = next.getHighlightFields();
HighlightField highlightField = highlightFields.get("name.keyword");
Text[] fragments = highlightField.getFragments();
StringBuilder builder = new StringBuilder();
for (int i = 0; i < fragments.length; i++) {
Text fragment = fragments[i];
builder.append(fragment.string());
}
String sourceAsString = next.getSourceAsString();
Area area = JSONObject.parseObject(sourceAsString, Area.class);
area.setName(builder.toString());
list.add(area);
}
return (AggregatedPage<T>) new AggregatedPageImpl<Area>(list, pageable,
hits.getTotalHits(), hits.getMaxScore());
}
});
System.out.println(areas);
}
}
@Data
@ToString
@Document(indexName = "area")
class Area {
@Id
private String id;
private String pid;
@Field(type = FieldType.Keyword)
private String name;
@Field(type = FieldType.Keyword)
private String pname;
private Integer confirm;
private Integer input;
private Integer severe;
private Integer heal;
private Integer dead;
private Integer suspect;
}