这是我参考网上大佬写的例子,代码不想留在电脑里面就把它记录在博客上,或许对大家有一丢丢的帮助。
项目源码我上传到了CSDN,所需积分/C币:0,https://download.csdn.net/download/qq_40018541/85240897
pom.xml文件配置
org.elasticsearch elasticsearch 7.6.2 org.elasticsearch.client transport 7.6.2 org.elasticsearch.plugin transport-netty4-client 7.6.2 org.springframework.boot spring-boot-starter-data-elasticsearch org.elasticsearch.client elasticsearch-rest-high-level-client org.elasticsearch.client elasticsearch-rest-high-level-client ${elasticsearch.version} org.elasticsearch elasticsearch
实体类People.java
@Data
@Builder
@Document(indexName = "people_index",shards = 1,replicas = 1)
public class People {
@Id
private String id;
@Field(type = FieldType.Text,analyzer = "ik_max_word")
private String name;
@Field(type = FieldType.Text,analyzer = "ik_max_word")
private String address;
@Field(type = FieldType.Integer,index = false)
private int age;
}
接口继承调用 EsOptlogRepository.java,EsOptlogRepository已经包含常用的查询等crud操作,直接可使用,也可以根据自己的需求编写ElasticsearchRepository自定义方法。
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; public interface EsOptlogRepository extends ElasticsearchRepository{ //TODO ElasticsearchRepository自定义方法 }
EsdemoApplicationTests.java 测试demo
@SpringBootTest
class EsdemoApplicationTests {
@Resource
private ElasticsearchRestTemplate elasticsearchRestTemplate;
@Resource
private EsOptlogRepository esOptlogRepository;
@Test
void createIndex(){
boolean exists = elasticsearchRestTemplate.indexOps(People.class).exists();
System.out.println(exists);
if(exists)elasticsearchRestTemplate.indexOps(People.class).delete();
elasticsearchRestTemplate.indexOps(People.class).create();
elasticsearchRestTemplate.indexOps(People.class).putMapping();
}
@Test
void contextLoads() {
People people = new People();
people.setId("123");
people.setName("mayun");
people.setAge(20);
people.setAddress("贵州贵阳观山湖区***");
//保存到es
esOptlogRepository.save(people);
esOptlogRepository.findAll();
// NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
// NativeSearchQuery nativeSearchQuery = nativeSearchQueryBuilder
// // 整体匹配
// .withQuery(QueryBuilders.termQuery("sex", people.getAge()))
// // 分词匹配
// .withQuery(QueryBuilders.matchQuery("personName", people.getName()))
// .withQuery(QueryBuilders.matchQuery("address", people.getAddress()))
// .withQuery(QueryBuilders.matchQuery("remarks", people.getAddress()))
// //短语搜索
// .withQuery(QueryBuilders.matchPhraseQuery("address", people.getAddress()))
// .withQuery(QueryBuilders.rangeQuery("age").format("yyyy-MM-dd").gte(12).lte(20))
// .build();
// BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
// List listQuery = new ArrayList<>();
// listQuery.add(QueryBuilders.rangeQuery("age").format("yyyy-MM-dd").gte(12).lte(20));
// listQuery.add(QueryBuilders.matchQuery("personName", people.getName()));
// boolQueryBuilder.should().addAll(listQuery);//should包条件(或)
// boolQueryBuilder.must().addAll(listQuery);//must必须成立(与)
// NativeSearchQuery nativeSearchQuery2 = new NativeSearchQuery(boolQueryBuilder);
//
// NativeSearchQuery nativeSearchQuery1 = new NativeSearchQuery(QueryBuilders.matchAllQuery());
// nativeSearchQuery1.setPageable(PageRequest.of(0,2));//分页
// nativeSearchQuery1.addSort(Sort.by(Sort.Direction.DESC,"age"));//排序
}
@Test
void demoTest() throws UnknownHostException {
Map map = new HashMap<>();
TransportClient client1 = new PreBuiltTransportClient(Settings.EMPTY);
//client1.addTransportAddress(new InetSocketTransportAddress(new InetSocketAddress("xxxxxxxx", 9300)));
client1.addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.254.149"), 9200));
SearchRequestBuilder searchRequestBuilder = client1.prepareSearch("people_index")
.addAggregation(AggregationBuilders.terms("name").field("name").size(1000)
.subAggregation(AggregationBuilders.sum("age").field("age")));
SearchResponse response = searchRequestBuilder.execute().actionGet();
Terms terms = response.getAggregations().get("name");
List extends Terms.Bucket> buckets = terms.getBuckets();
for (Terms.Bucket bucket : buckets) {
InternalSum sum = bucket.getAggregations().get("age");
map.put(bucket.getKeyAsString(), (long) sum.getValue());
}
System.out.println(map);
}
}
大批量操作数据时,可以把这段代码加入到拦截器中,这样可以拦截需要自定义返回值大小的es请求
yml文件配置
es:
data:
size: 500
import org.elasticsearch.client.HeapBufferedAsyncResponseConsumer;
import org.elasticsearch.client.HttpAsyncResponseConsumerFactory;
import org.elasticsearch.client.RequestOptions;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
@Configuration
public class EsConfig {
@Value("${es.data.size:}")
private Integer dataSize;
@Bean
public void setRequestOptions() throws NoSuchFieldException, IllegalAccessException {
//设置es查询buffer大小
RequestOptions requestOptions = RequestOptions.DEFAULT;
Class extends RequestOptions> reqClass = requestOptions.getClass();
Field reqField = reqClass.getDeclaredField("httpAsyncResponseConsumerFactory");
reqField.setAccessible(true);
//去除final
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(reqField, reqField.getModifiers() & ~Modifier.FINAL);
//设置默认的工厂
reqField.set(requestOptions, (HttpAsyncResponseConsumerFactory) () -> {
Integer size = new Integer( 5 * 100);
if(dataSize!=null){
size = dataSize;
}
//500MB
return new HeapBufferedAsyncResponseConsumer( size * 1024 * 1024);
});
}
}



