springboot集成ElasticsearchTemplate实现增删查改

首先配置ES,elasticsearch.yml添加以下配置,然后单机启动,我用的windows启动,linux也一样的。

如要搭集群参考https://blog.csdn.net/letterss/article/details/91361205

http.cors.enabled: true
http.cors.allow-origin: "*"
path.data: C:\Users\wangsheng\Desktop\esdata\data
path.logs: C:\Users\wangsheng\Desktop\esdata\logs
network.host: 0.0.0.0
node.name: node-1
cluster.initial_master_nodes: ["node-1"]
node.master: true

Springboot POM添加以下依赖,一定要注意springboot和ES版本是否匹配,否则连接不上,我用的ES版本6.2.3,springboot 2.1.7RELEASE 

   <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>6.2.3</version>
        </dependency>
        <!--elasticsearch 6.2.3 transport-->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>6.2.3</version>
            <exclusions>
                <exclusion>
                    <groupId>org.elasticsearch</groupId>
                    <artifactId>elasticsearch</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.39</version>
        </dependency>
        <!--springboot 对 spring data es 的支持-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.4</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

 application.properties

spring.data.elasticsearch.cluster-name=wangsheng
//默认是9300,不是9200
spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300

 新建实体类,注意要有@Document注解,还要有有参和无参构造方法


import lombok.Builder;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import java.io.Serializable;
/**
 * 创 建 人 : wangsheng 创建日期:2020年11月
 */
@Builder
@Document(indexName = "myindex", type = "user")
public class User implements Serializable {
     @Id
    private Integer id;
    private String name;
    private String age;
    private String phone;
    private String address;

    public User(Integer id, String name, String age, String phone, String address) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.phone = phone;
        this.address = address;
    }

    private User() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

ES工具类

import com.example.demo.entity.User;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.common.recycler.Recycler;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.*;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.*;
import static org.elasticsearch.index.query.QueryBuilders.*;
/**
 * 创 建 人 : wangsheng 创建日期:2020年11月
 */
@Component
public class ElasticsearchUtil {
    @Autowired

    private ElasticsearchTemplate template;

    /**
     * 更新
     *
     * @return
     */
    public <T> Boolean update(String index, String type, T t) throws IOException {
        try {
            Class<? extends Object> tClass = t.getClass();
            //得到所有属性
            Field[] field = tClass.getDeclaredFields();
            //设置ID可以访问私有变量
            field[0].setAccessible(true);
            //整合出 getId() 属性这个方法
            Method m = tClass.getMethod("get"+"Id");
            //调用这个整合出来的get方法,强转成自己需要的类型
            Integer id = (Integer)m.invoke(t);
            XContentBuilder xContentBuilder = XContentFactory.jsonBuilder().startObject();
             for(int i=0;i<field.length;i++)
             {   String updateField1=field[i].getName();
                 //将属性名字的首字母大写
                 updateField1=updateField1.replaceFirst(updateField1.substring(0, 1), updateField1.substring(0, 1).toUpperCase());
                 if(!updateField1.equals("Id")){
                 Object updateValue=getValue(t,field[i]);
                 if(updateValue!=null)
                 {
                     xContentBuilder.field(field[i].getName(),updateValue);
                }
             }}
             xContentBuilder.endObject();
            UpdateRequest updateRequest = new UpdateRequest().index(index)
                    .type(type).id(id.toString()).doc(xContentBuilder);;
            UpdateQuery updateQuery = new UpdateQueryBuilder()
                    .withId(id.toString())
                    .withClass(tClass)
                    .withUpdateRequest(updateRequest)
                    .build();
            template.update(updateQuery);
        } catch (Exception e) {
            return false;
        }
        return true;
    }
    //批量添加
    public <T> boolean addList(List<T> list) {
        try {
            List queries = new ArrayList();
            for (T t : list) {
                IndexQuery indexQuery = new IndexQueryBuilder()
                        .withId(getId(t).toString())
                        .withObject(t)
                        .build();
                queries.add(indexQuery);
            }
            if (queries.size() > 0) {
                template.bulkIndex(queries);

            }
        } catch (Exception e) {
            return false;
        }
        return true;
    }
    /**
     * 删除
     *
     * @return
     */
    public <T> boolean delete(T t) throws IOException {
        try {
            Class<? extends Object> tClass = t.getClass();
            //得到所有属性
            Field[] field = tClass.getDeclaredFields();
            //设置ID可以访问私有变量
            field[0].setAccessible(true);
            //整合出 getId() 属性这个方法
            Method m = tClass.getMethod("get"+"Id");
            //调用这个整合出来的get方法,强转成自己需要的类型
            Object id=getValue(t,field[0]);
            template.delete(tClass, id.toString());
        } catch (Exception e) {
            System.out.println(e);
            return false;
        }
        return true;
    }


    //添加单条数据
    public <T> Boolean addOneData(T t) throws Exception {
        try {
            IndexQuery indexQuery = new IndexQueryBuilder()
                    .withId(getId(t).toString())
                    .withObject(t)
                    .build();
            template.index(indexQuery);
        } catch (Exception e) {
            return false;
        }
        return true;

    }

    //分词匹配查询,比如有两条数据:1、我今天非常高兴 2、他摔倒很高兴输入:今天高兴. 这两条数据都能匹配上
    public <T> List<Class<T>> queryByfenci(Integer startpage, Integer pageSize,Class<T> tClass, String keyword, String value) {
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(QueryBuilders.matchQuery(keyword, value))
                .withPageable(new PageRequest(startpage, pageSize))
                .build();
        List<T> list = template.queryForList(searchQuery, tClass);
        return (List<Class<T>>) list;
    }

    //分页单字符串全文查询
    public <T> List<Class<T>> queryByKeyWord(Integer startpage, Integer pageSize, String value,Class<T> tClass) {
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(QueryBuilders.queryStringQuery(value))
                .withPageable(new PageRequest(startpage, pageSize))
                .build();
        List<T> list = template.queryForList(searchQuery,tClass);
        return (List<Class<T>>) list;
    }


    //分页模糊查询,类似mysql中like "%word%"的模糊匹配
    public <T> List<T> queryLike(Integer startpage, Integer pageSize, String keyword, String value,Class<T> tClass) {
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(QueryBuilders.matchPhraseQuery(keyword, value))
                .withPageable(new PageRequest(startpage, pageSize))
                .build();
        List<T> list = template.queryForList(searchQuery, tClass);
        return  list;
    }


    //分页多条件查,字段和值必须全等
    public  <T> List<T> queryByManyKey(Integer startpage, Integer pageSize,T t) throws Exception {
        BoolQueryBuilder mustQuery = QueryBuilders.boolQuery();
        Pageable pageable = new PageRequest(startpage, pageSize);
        Class<? extends Object> tClass = t.getClass();
        //得到所有属性
        Field[] field = tClass.getDeclaredFields();
        for(int i=0;i<field.length;i++)
        {   String updateField=field[i].getName();
            //将属性名字的首字母大写
            updateField=updateField.replaceFirst(updateField.substring(0, 1), updateField.substring(0, 1).toUpperCase());
            if(!updateField.equals("Id")){
                Object updateValue=getValue(t,field[i]);
                if(updateValue!=null)
                {  mustQuery.must(QueryBuilders.matchPhraseQuery(field[i].getName(), updateValue));
                }
            }}
        SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(mustQuery).withPageable(pageable).build();
        return (List<T>) template.queryForList(searchQuery, tClass);

    }





    /**
     * 分页多个字段匹配某字符串,value是字符串,column是匹配的列,只要任何一个字段包括该字符串即可
     */
    public <T> List<Class<T>> manyFiledMach(Integer startpage, Integer pageSize,Class<T> tClass, String value, String... column) {
        Pageable pageable = new PageRequest(startpage, pageSize);
        SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(multiMatchQuery(value, column)).withPageable(pageable).build();
        List<T> list = template.queryForList(searchQuery, tClass);
        return (List<Class<T>>) list;
    }




    public <T> Object getValue( T t,Field field){
        try{
            Class<? extends Object> tClass = t.getClass();
            field.setAccessible(true);
            String updateField1=field.getName();
            //将属性名字的首字母大写
            updateField1=updateField1.replaceFirst(updateField1.substring(0, 1), updateField1.substring(0, 1).toUpperCase());
            Method m = tClass.getMethod("get"+updateField1);
            // 获取属性类型
            String type = field.getGenericType().toString();
            if(type.equals("class java.lang.String")){
                String value = (String)m.invoke(t);
                return value;
            }

            if(type.equals("class java.lang.Integer")){
                Integer value = (Integer)m.invoke(t);
                return value;
            }

            if(type.equals("class java.util.Date")){
                Date value = (Date)m.invoke(t);
                return value;
            }
        }catch(Exception e){
            return null;
        }
        return null;
    }

    public <T> Object getId( T t){
        try {
            Class<? extends Object> tClass = t.getClass();
            //得到所有属性
            Field[] field = tClass.getDeclaredFields();
            //设置ID可以访问私有变量
            field[0].setAccessible(true);
            //整合出 getId() 属性这个方法
            Method m = tClass.getMethod("get" + "Id");
            //调用这个整合出来的get方法,强转成自己需要的类型
            return getValue(t, field[0]);
        }catch (Exception e)
        {
            return  null;
        }
    }


}

测试类

import com.alibaba.fastjson.JSON;
import com.example.demo.entity.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.ArrayList;
import java.util.List;

/**
 * 创 建 人 : wangsheng 创建日期:2020年11月
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class tesst {
    @Autowired

    private ElasticsearchUtil elasticsearchUtil;


    @Test
    public void addOneData() throws Exception {
        User user=User.builder().id(3).name("wangsheng").address("重庆市").age("25").build();
        elasticsearchUtil.addOneData(user);
    }


    @Test
    public void addList() throws Exception {
        List<User> list=new ArrayList<>();
        User user=User.builder().id(4).name("wangs").address("天津市").age("27").build();
        User user1=User.builder().id(5).name("wangsheng").address("重庆市").age("26").build();
        list.add(user);
        list.add(user1);
        System.out.println(elasticsearchUtil.addList(list));

    }
    @Test
    public void queryByKeyWord()
    {  User user=User.builder().id(3).name("wangsheng").address("天津市").age("27").build();
        System.out.println(JSON.toJSONString(elasticsearchUtil.queryByKeyWord(0,10,user.getName(),User.class)));
    }

    @Test
    public void queryLike()
    {
        User user=User.builder().id(3).name("wang").address("天津市").age("27").build();
        List<User> list=elasticsearchUtil.queryLike(0,10,"name",user.getName(),User.class);
        System.out.println(JSON.toJSONString(list));

    }


    @Test
    public void queryByManyKey() throws Exception {
        User user=User.builder().id(2).age("25").build();
        System.out.println(JSON.toJSONString(elasticsearchUtil.queryByManyKey(0,10,user)));
    }

    @Test
    public void update() throws Exception {
        User user=User.builder().id(2).name("wangsheng").address("天津").age("28").build();
        System.out.println(JSON.toJSONString(elasticsearchUtil.update("user","user",user)));
    }
    @Test
    public void delete() throws Exception {
        User user=User.builder().id(2).name("wang").address("天津市").age("25").build();
        System.out.println(JSON.toJSONString(elasticsearchUtil.delete(user)));
    }
    @Test
    public void manyFiledMach( )
    {  User user=User.builder().id(2).name("wang").address("天津市").age("25").build();
        System.out.println(JSON.toJSONString(elasticsearchUtil.manyFiledMach(0,10,User.class,user.getName(),"name","address")));
    }

    @Test
    public void queryByfenci( )
    {  User user=User.builder().id(2).name("wang").address("天津市").age("25").build();
        System.out.println(JSON.toJSONString(elasticsearchUtil.queryByfenci(0,10,User.class,"name",user.getName())));
    }
}

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今朝花落悲颜色

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值