plugins {
id 'org.springframework.boot' version '2.2.1.RELEASE'
id 'io.spring.dependency-management' version '1.0.9.RELEASE'
id 'java'
}
group 'com.ddddd'
version '1.0'
sourceCompatibility = 1.8
repositories {
mavenLocal()
maven {
url 'http://maven.aliyun.com/nexus/content/repositories/central/' }
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch'
// implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
// compile group: 'org.elasticsearch', name: 'elasticsearch', version: '6.8.7'
// compile group: 'org.elasticsearch.client', name: 'elasticsearch-rest-high-level-client', version: '6.8.7'
// 加载外部jar
// compile files('lib/ojdbc6.jar')
// 去除内置tomcat
// providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
}
test {
useJUnitPlatform()
}
//application.yml
#spring:
# data:
# elasticsearch:
# cluster-name: elasticsearch
# cluster-nodes: 192.168.1.240:9300
logging.level.org.springframework.data.elasticsearch.client.WIRE: trace
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.client.ClientConfiguration;
import org.springframework.data.elasticsearch.client.RestClients;
@Configuration
public class EsConfig {
@Bean
RestHighLevelClient client() {
ClientConfiguration clientConfiguration = ClientConfiguration.builder()
.connectedTo("192.168.1.240:9200")
.build();
return RestClients.create(clientConfiguration).rest();
}
}
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import java.io.Serializable;
@Document(indexName = "esdto", type = "testbean")
public class EsDto implements Serializable {
public EsDto() {
}
public EsDto(long id, String name, Integer age, String sex, String desc) {
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
this.desc = desc;
}
// 必须指定一个id,
@Id
private long id;
// 这里配置了分词器,字段类型,可以不配置,默认也可
@Field(analyzer = "ik_smart", type = FieldType.Text)
private String name;
private Integer age;
@Field(analyzer = "ik_smart", type = FieldType.Text)
private String sex;
@Field(analyzer = "ik_smart", type = FieldType.Text)
private String desc;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
import org.springframework.data.repository.CrudRepository;
import java.util.List;
public interface EsRepo extends CrudRepository<EsDto, Long> {
List<EsDto> findByName(String name);
List<EsDto> findByNameOrDesc(String text, String desc);
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
@Service
public class EsService {
@Autowired
EsRepo testDao;
public Iterable<EsDto> findAll() {
return testDao.findAll();
}
public void save() {
List<EsDto> list = new ArrayList<>();
String namess = "帆乘 楷栋 锋枫 海勇 康帆 安礼 晓平 良帆 瑞翱 涛锟 恒勇 鸿驰 帆强 桓柏 锋寅 博槐 骞琛 桓钊 杰桓 裕枫 福晖 槐仕 奇鹏 骏伟 允潍 乘初 杞郁 柏安 皓宇 骏侠 礼德 哲晓 伟权 祥恒 澄震 浩浩 瑞权 延升 翱楷 锋轩 驰鹏 杞翱 康鹤 材福 晖锐 信恒 凯锦 诚翱 震福 龙宇 祥帆 梓瑞 林龙 日延 槐翰 日寅 起鸿 杞允 瑞锐 仕星 权铭 吉楷 寅星 林帝 皓仕 卓礼 家盛 海寅 盛胤 年禧 畅安 炳龙 柏晖 诚年 彬坤 礼诚 濡凯 驰晨 恒邦 帆晖 诚华 晖星 恒梓 禄彬 鹤华 锟升 桓浩 振尧 祥寅 楷辰 暄帝 锐梓 恒佑 文安 杰畅 加琛 俊泽 乘驰 禄家 中鹤 家锦 皓初 凯震 文韦 彬澄 起哲 海炳 鹤锋 贤逸 哲佑 海信 逸俊 炳年 礼郁 濡寅 晓泽 然延 喆加 天梓 泽锟 轩谛 盛翱 晨子 诚吉 梁鹤 仕逸 升平 奇琛 杞沛 胤邦 辰佑 骞佳 鸿鹏 翱坤 钊峰 哲锐 腾鑫 海阳 烁奇 安芃 浩瑞 星尧 驰炳 安沛 权成 华文 杞晨 柏柔 权彬 祯晨 谛潍 驰安 安日 谷沛 帆华 林翰 然震 琛星 泽杞 澄涛 龙欣 嘉辰 海禄 诚家 帆韦 澄濡 潍延 郁邦 锐礼 蔓材 畅震 腾诚 峰贤 轩潍 凡信 翱年 祜帆 睿吉 祯博 强延 震鑫 邦郁 禧祯 良梁 烁谛 成震 翱颜 加升 荣俊 晨骞 锦槐 烁安 鑫平 沛凯 德升 炳宇 远侠 晖鹏 腾谷 初帆 林然 中禄 斌颜 颜浩 远帆 胤然 祜沛 允锟 畅梁 栋材 泽柔 远锐 杞梁 凯濡 郁槐 家泽 暄乘 年权 文柏 潍禧 澄禧 奇锦 逸然 翰弘 华海 柏辞 瑞星 胤佑 芃嘉 祜胤 逸杰 杰逸 材龙 允升 加韦 逸福 桓辞 枫濡 信然 栋祯" +
"蓓菡 娜嘉 碧珊 菲昕 芸帆 怡莉 鸿莲 曦静 灵玥 橘婧 家曼 鹤丽 岚琳 格梅 呈梦 璇嘉 月欣 楠敏 瑶丽 茹莲 杉歆 帆珍 琬彬 蓓昭 函璇 凌欢 歆蔚 妮萱 琛灵 婷媛 琳凌 岚冬 静鸿 珍倩 桂枫 玉岚 紫涵 桃婧 芳璟 韵珠 香萱 冰梅 桂寒 呈曼 梅茹 雯帆 芙明 紫桂 霞玲 蓓莉 霞可 琪香 菲春 美俊 梦栀 鹤婧 帛菲 静芝 琳沛 玥薇 璟漫 弦茹 彦茜 花梓 歆曦 寒洁 莉梓 颖芙 梓露 玉诗 桃橘 鹤霞 沛漫 月婧 玲阳 雅欢 珍月 璟紫 歆淑 韵琬 月玉 欢彦 寒娅 妍彤 梦萱 蕾芳 心彤 彩妮 寒玲 淑漫 茜桐 春楠 洲茜 月嘉 欣云 珠香 岚韵 娜呈 妮弦 芸函 芳寒 萱林 云琳 莲菡 碧娅 莉凌 栀茜 蔚妮 惠婧 香心 初莉 颖淑 凡芝 璇灵 可蕾 静文 彩鹤 芙鑫 花楠 云梦 菲茹 蓓玥 惠娅 凌芳 柔旭 琛楠 雪娜 蕾诗 芸珠 菡桂 蕾文 桃花 彩诗 彬洁 帆馨 雯春 芝韵 春雅 静紫 寒橘 冰淑 韵露 昭莲 诗晨 钰花 彩月 昕欢 香可 菲婧 橘静 钰韵 霞心 彬雅 芙春 菲惠 萱曦 惠枫 舒薇 楠丽 栀珍 琳惠 歆冬 漫月 莲琛 琬梓 雨美 梦家 倩慧 俊薇 彬璇 敏玉 栀曼 曦倩 蓓蔚 月茜 俊珍 茹帆 璐欢 芝珊 昕舒 娅璐 慧玉 春玥 舒静 颖楠 淑紫 漫彩 欢曼 芳歆 桂冰 芙薇 旭雅 璇冰 岚欣 岚玲 慧锦 克霞 萱丽 采碧 洁昭 采彩 珊云 漫梦 萱凌 怡文 霞杉 敏怡 莉怡 怡露 格漫 瑶薇 沛菲 彦梦 妮馨 菲萱 敏桐 鹤菡 彬蓓 凌彤 珊莉 漫依 琪莲 欣霞 璟心 梅薇 寒蓓 倩梓 采娜 琬雯 枫梅 花格 馨可 杉璐 舒娅 沛香 颖茹 格玲 花柏 雨璟 欣薇";
String[] names = namess.split("\\s+");
String[] descArr = {
"大家好,我是雨天,因为刚好出生在雨天,老爸又刚好姓夏,于是“下雨天”就首发出场了,而且妈妈也希望我如雨后春笋、天天向上哦!呵呵后来因为一部分人实在不忍心在晴朗的天气里叫我雨天,为避免引起“混乱”,就只好舍弃了这个颇有个性的简单名字,退而成“小名“了。我的大名也简单,其实就一个“翌”字,因为我出生的日子刚好是爸爸妈妈结婚2周年纪念日的第二日。“夏翌”谐音宁波话“暇意”,大家希望我暇暇意意,呵呵,有点嫌”翌”字太文绉绉,就把它给拆了,一分为二成羽立了。"
, "大家都说我是个阳光女孩,因为我是开心果啊。我老是坐不住,呵呵,能跟小椅子成为好朋友,是老师和爸爸妈妈现在的最大心愿。我喜欢跳舞,但最好能跟着音乐自己起舞,不用按老师的要求练基本功;我喜欢画画,但最好是信手涂鸦,把小朋友的脸画成绿色也没关系;我喜欢溜冰,但最有趣的还是约上三五好友,一起练习如何摔跤……"
, "昀昀是我在妈妈肚子里时的小名哦,我的大名叫曹铁瀛,妈妈怀我的时候和单位里的阿姨们玩牌经常是百战百胜,阿姨们说是因为我的缘故,干脆就叫“天赢”好了,爸妈取其谐音,就变成了“铁瀛”"
, "嘿!我——21号来报到了!智诰、诰诰、阿诰,你们爱怎么叫就怎么叫吧!反正都是我!我的名字是奶奶请一名先生取的,虽然有点迷信,但寄托了全家人的祝福!"
, "还是汽车发烧友,小轿车、大卡车、集装箱、大客车、翻斗车、压路机……应有尽有(就差拖拉机还没有报到)。我常在家练习倒车、移库、爬坡、过单轨桥,考取驾照不成问题!!当然我也模拟制造几起车祸,掉进大河,深沟,追尾事故,因为那时我又能大显身手,汽车的零件装了又拆,拆了又装……哈哈!!角角落落都是我的杰作,缺胳膊少腿的,七零八落的,尽管汽车多,可完完整整的没几辆!这下,又有理由去买车啦!"
, "我还喜欢画画。从小我就拿着笔画一个个的大圆圈,每天乐此不疲,整整画了半年多圆圈呢!够有毅力的吧!老师说我构图线条流畅,就是那样练出来的哦!以后我一定会继续努力的!可是我不太喜欢看书,妈妈让我看书,我老是心不在焉,左顾右盼,常常惹她不高兴,可我就是不喜欢嘛!"
, "我的性格有点内向、腼腆、不喜欢“显山露水”。我最喜欢体育项目了,最“痴迷”的就是体育频道:乒乓球、羽毛球、台球、足球、篮球、跳水~~,当然我也喜欢打牌(这可是遗传)。"
, "我的个子很高,被称为“帅哥”,因此彼得女孩子的欢心哦,等我长大了,我要娶七个“老婆”,其中三个为:外婆、爸爸和妈妈。 我的目标是考上北大。\n"
, "我当时的第一反应是:这两个字可以跟名人的名字做一个联系,然后做一个介绍。我说你介绍的时候可以跟别人讲:"
};
Random random = new Random();
//模拟数据
for (int i = 0; i < 100; i++) {
int i1 = random.nextInt(names.length);
int i2 = random.nextInt(descArr.length);
//注意这里 第一个参数是id 所以无论你运行多少次,都只会添加100条数据,如果id存在es更新,不存在添加
EsDto testBean = new EsDto(i, names[i1], i, String.valueOf(i % 2), descArr[i2]);
list.add(testBean);
}
testDao.saveAll(list);
}
public void save(EsDto bean) {
testDao.save(bean);
}
public List<EsDto> findByName(String text) {
return testDao.findByName(text);
}
public List<EsDto> findByNameOrDesc(String text) {
return testDao.findByNameOrDesc(text,text);
}
}
test执行
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.core.CountRequest;
import org.elasticsearch.client.core.CountResponse;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.boot.web.server.LocalServerPort;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import java.io.IOException;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
class SpringTest {
@Autowired
private EsService esService;
@Autowired
private RestHighLevelClient client;
@Test
void hi() {
Iterable<EsDto> itr = esService.findAll();
itr.forEach(o-> System.out.println(o.getName()));
}
@Test
void dd2(){
esService.save();
}
@Test
void dd3(){
List<EsDto> res = esService.findByName("心");
res.forEach(o-> System.out.println(o.getName()));
}
@Test
void dd4(){
CountRequest countRequest = new CountRequest("esdto");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
countRequest.source(searchSourceBuilder);
try {
CountResponse countResponse = client.count(countRequest, RequestOptions.DEFAULT);
System.out.println(countResponse.getCount());
} catch (IOException e) {
e.printStackTrace();
}
}
}
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.client.indices.GetIndexResponse;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.IOException;
import java.util.Arrays;
import static org.junit.jupiter.api.Assertions.*;
/**
* https://www.elastic.co/guide/en/elasticsearch/client/java-rest/master/java-rest-high-get-index.html
*/
@SpringBootTest
public class EsTest {
@Autowired
RestHighLevelClient client;
// 检测es 活着
@Test
void ping(){
try {
assertEquals("true",client.ping(RequestOptions.DEFAULT));
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
void listIndex() throws Exception{
GetIndexRequest request = new GetIndexRequest("*");
GetIndexResponse response = client.indices().get(request, RequestOptions.DEFAULT);
String[] indices = response.getIndices();
System.out.println(Arrays.toString(indices));
}
@Test
void delIndex() throws Exception{
DeleteIndexRequest request = new DeleteIndexRequest("esdto");
AcknowledgedResponse deleteIndexResponse = client.indices().delete(request, RequestOptions.DEFAULT);
System.out.println(deleteIndexResponse.isAcknowledged());
}
}
常用es统计写法
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.core.CountRequest;
import org.elasticsearch.client.core.CountResponse;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.client.indices.GetIndexResponse;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
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.Aggregations;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.sum.Sum;
import org.elasticsearch.search.aggregations.metrics.sum.SumAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.sum.SumAggregator;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
/**
* https://www.elastic.co/guide/en/elasticsearch/client/java-rest/master/java-rest-high-get-index.html
*/
@SpringBootTest
public class EsTest {
@Autowired
RestHighLevelClient client;
// 检测es 活着
@Test
void ping(){
try {
assertEquals("true",client.ping(RequestOptions.DEFAULT));
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
void listIndex() throws Exception{
GetIndexRequest request = new GetIndexRequest("*");
GetIndexResponse response = client.indices().get(request, RequestOptions.DEFAULT);
String[] indices = response.getIndices();
System.out.println(Arrays.toString(indices));
}
@Test
void delIndex() throws Exception{
DeleteIndexRequest request = new DeleteIndexRequest("acttake");
AcknowledgedResponse deleteIndexResponse = client.indices().delete(request, RequestOptions.DEFAULT);
System.out.println(deleteIndexResponse.isAcknowledged());
}
@Test
void search() throws Exception{
CountRequest countRequest = new CountRequest("acttake");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// 总数
// searchSourceBuilder.query(QueryBuilders.matchAllQuery());
// 两个条件都要满足
// BoolQueryBuilder query = QueryBuilders.boolQuery()
// .must(QueryBuilders.matchQuery("status",100))
// .must(QueryBuilders.matchQuery("lastThreeOrgNo","440778008"));
// searchSourceBuilder.query(query);
// 时间区间,date存入es为long,使用时间戳*1000
// BoolQueryBuilder query = QueryBuilders.boolQuery()
// .must(QueryBuilders.rangeQuery("takeDate").gt(1568777356000L).lt(1568777358000L));
// searchSourceBuilder.query(query);
countRequest.source(searchSourceBuilder);
CountResponse countResponse = client.count(countRequest, RequestOptions.DEFAULT);
long count = countResponse.getCount();
System.out.println(count);
}
@Test
void search2() throws Exception{
SearchRequest searchRequest = new SearchRequest("acttake");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery()).from(100).size(100).sort("id", SortOrder.DESC);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = searchResponse.getHits();
System.out.println(hits.totalHits); //总数
SearchHit[] searchHits = hits.getHits();
for (SearchHit hit : searchHits) {
System.out.println(hit);
}
}
@Test
void search3() throws Exception{
SearchRequest searchRequest = new SearchRequest("acttake");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// 过滤数据 where,size 0不返回数据,只要统计
searchSourceBuilder.query(QueryBuilders.matchAllQuery()).size(0);
// 对上面过滤后的数据,group by 分组统计,如果是字符,用.keyword 数字不加
// TermsAggregationBuilder groupBy = AggregationBuilders.terms("org1").field("lastFirstOrgNo.keyword")
// .order(BucketOrder.compound(BucketOrder.count(false))); // 对group后的排序
// searchSourceBuilder.aggregation(groupBy);
// group by 2个字段
TermsAggregationBuilder groupByOrg2 = AggregationBuilders.terms("org2").field("lastSecondOrgNo.keyword");
TermsAggregationBuilder groupByOrg1 = AggregationBuilders.terms("org1").field("lastFirstOrgNo.keyword").subAggregation(groupByOrg2);
searchSourceBuilder.aggregation(groupByOrg1);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = searchResponse.getHits();
System.out.println(hits.totalHits); //总数
Terms terms = searchResponse.getAggregations().get("org1");
List<? extends Terms.Bucket> buckets = terms.getBuckets();
for (Terms.Bucket bucket : buckets) {
Terms terms2 = bucket.getAggregations().get("org2");
List<? extends Terms.Bucket> buckets2 = terms2.getBuckets();
for (Terms.Bucket bucket2 : buckets2) {
System.out.println(bucket.getKey()+" "+ bucket2.getKey() +" ("+bucket2.getDocCount()+")");
}
}
}
@Test
void search4() throws Exception{
SearchRequest searchRequest = new SearchRequest("acttake");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// 过滤数据 where,size 0不返回数据,只要统计
searchSourceBuilder.query(QueryBuilders.matchAllQuery()).size(0);
// 对上面过滤后的数据,字段求和
SumAggregationBuilder productSum = AggregationBuilders.sum("product").field("productNum");
searchSourceBuilder.aggregation(productSum);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = searchResponse.getHits();
// System.out.println(hits.totalHits); //总数
Sum sum = searchResponse.getAggregations().get("product");
System.out.println(sum.value());
}
}