Spring Boot elasticsearch7.6.2基础操作:创建索引、新增数据、查询数据含源码
这是我参考网上大佬写的例子,代码不想留在电脑里面就把它记录在博客上,或许对大家有一丢丢的帮助。
项目源码我上传到了CSDN,所需积分/C币:0,https://download.csdn.net/download/qq_40018541/85240897
pom.xml文件配置
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.6.2</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>7.6.2</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.plugin</groupId>
<artifactId>transport-netty4-client</artifactId>
<version>7.6.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<exclusions>
<exclusion>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>${elasticsearch.version}</version>
<exclusions>
<exclusion>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
</exclusion>
</exclusions>
</dependency>
实体类People.java
@Data
@Builder
@Document(indexName = "people_index",shards = 1,replicas = 1)
public class People {
@Id
private String id;
/**
* @Field 作用在成员变量,标记为文档的字段,并指定字段映射属性:
* type:字段类型,是枚举:FieldType,可以是text、long、short、date、integer、object等
* text:存储数据时,会自动分词,并生成索引
* keyword:存储数据时,不会分词建立索引
* analyzer:分词器名称
* ik_max_word:会将文本做最细粒度的拆分
* 比如会将“中华人民共和国人民大会堂”拆分为“中华人民共和国、中华人民、中华、华人、人民共和国、人民、共和国、大会堂、大会、会堂等词语。
* ik_smart:会做最粗粒度的拆分
* 比如会将“中华人民共和国人民大会堂”拆分为中华人民共和国、人民大会堂。
* index:是否建立索引
*/
@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<People,String> {
//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<QueryBuilder> 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<String,Long> 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;
/**
* @author mar
* @date 2022年04月02日 14:40
*/
@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);
});
}
}