Spring Boot elasticsearch7.6.2基础操作:创建索引、新增数据、查询数据含源码

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);
        });
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值