Spring Boot教程十一:集成elasticsearch

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wang_shuyu/article/details/79820496

pom引用:

 <!--ES-->
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>5.5.2</version>
        </dependency>

        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>5.5.2</version>
            <exclusions>
                <exclusion>
                    <artifactId>elasticsearch</artifactId>
                    <groupId>org.elasticsearch</groupId>
                </exclusion>
                <exclusion>
                    <groupId>org.elasticsearch.plugin</groupId>
                    <artifactId>transport-netty4-client</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.elasticsearch.plugin</groupId>
            <artifactId>transport-netty4-client</artifactId>
            <version>5.5.3</version>
        </dependency>

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>4.0.7</version>
        </dependency>

配置文件增加:

#ES配置
spring.data.elasticsearch.clustername=ganinfo
spring.data.elasticsearch.ip=172.16.1.29
spring.data.elasticsearch.port=9300

新建一个工具类:

import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * @author Shuyu.Wang
 * @package:com.ganinfo.utils
 * @className:
 * @description:ES连接工具
 * @date 2018-03-28 14:03
 **/
@Component
public class ESUtil {
    @Value("${spring.data.elasticsearch.ip}")
    private  String host; // 服务器地址
    @Value("${spring.data.elasticsearch.port}")
    private  int port; // 端口
    @Value("${spring.data.elasticsearch.clustername}")
    private String clusterName;

    private TransportClient client=null;
    /**
     * 获取连接
     * @return
     */
    public  Client getCient(){
        TransportClient client=null;
        Settings.Builder settings=Settings.builder().put("cluster.name",clusterName);
        try {
            client = new PreBuiltTransportClient(settings.build())
                    .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(host), port));
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        if (client!=null){
            System.out.println("Client创建成功!");
        }
        return client;
    }
    /**
     * 关闭连接
     * @param client
     */
    public void closeClient(Client client){
        if(client!=null){
            client.close();
            System.out.println("Client关闭成功!");
        }
    }
}

接口封装:

public interface ESService {

    /**
     * @param index 索引
     * @param type 类型
     * @param obj 插入的对象
     * @author:shuyu.wang
     * @description:新增接口
     * @date: 2018/3/29 10:20
     */
    Boolean add(String index, String type, Object obj);

    /**
     * @param index 索引
     * @param type 类型
     * @param queryBuilder 拼接的查询条件
     * @param sort 排序字段,默认降序
     * @param from 起始记录位置
     * @param size 返回条数
     * @author:shuyu.wang
     * @description:查询接口
     * @date: 2018/3/29 10:33
     *
    */
    ESReturn<List<Map<String,Object>>> query(String index, String type, QueryBuilder queryBuilder, String sort, Integer from, Integer size);


}

实现类:

@Service
public class ESServiceImpl implements ESService {
    @Autowired
    private ESUtil esUtil;
    @Override
    public Boolean add(String index,String type,Object obj) {
        Client client = esUtil.getCient();
        Field[] fields = obj.getClass().getDeclaredFields();
        JsonObject jsonObject = new JsonObject();
        for (int i = 0, len = fields.length; i < len; i++) {
            // 对于每个属性,获取属性名
            String varName = fields[i].getName();
            try {
                // 获取原来的访问控制权限
                boolean accessFlag = fields[i].isAccessible();
                // 修改访问控制权限
                fields[i].setAccessible(true);
                // 获取在对象f中属性fields[i]对应的对象中的变量
                Object o;
                try {
                    o = fields[i].get(obj);
                    jsonObject.addProperty(varName, o.toString());
                    System.err.println("传入的对象中包含一个如下的变量:" + varName + " = " + o);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                // 恢复访问控制权限
                fields[i].setAccessible(accessFlag);
            } catch (IllegalArgumentException ex) {
                ex.printStackTrace();
            }
        }
        IndexResponse response = client.prepareIndex(index, type).setSource(jsonObject.toString(), XContentType.JSON).get();
        esUtil.closeClient(client);
        return null;
    }

    @Override
    public ESReturn<List<Map<String,Object>>> query(String index, String type, QueryBuilder queryBuilder, String sort, Integer from, Integer size) {
        ESReturn<List<Map<String,Object>>> esReturn=new ESReturn<List<Map<String,Object>>>();
        Client client = esUtil.getCient();
        SearchRequestBuilder srb = client.prepareSearch(index).setTypes(type);
        SearchResponse sr = srb.setQuery(queryBuilder).setFrom(0).setSize(5)
                .addSort("postDate", SortOrder.DESC)
                .execute()
                .actionGet(); // 分页排序所有
        long totalHits = sr.getHits().totalHits();
        esReturn.setTotal(totalHits);
        SearchHits hits = sr.getHits();
        List<Map<String,Object>> result=new ArrayList<>();
        for (SearchHit hit : hits) {
            Map<String,Object> map=(Map<String,Object>)hit.getSource();
            result.add(map);
            System.out.println(hit.getSourceAsString());
        }
        esReturn.setData(result);
        return esReturn;
    }
}

测试类:

@Autowired
    ESService esService;
    
    /**
     * @author:shuyu.wang
     * @description:新增样例
     * @date: 2018/3/30 9:40
    */
    @RequestMapping("/add2")
    @ResponseBody
    public Object add2() {
//        Testa testa = new Testa();
//        testa.setName("28");
//        testa.setId("22");
//        testa.setSex("女");
//        testa.setNation("少数");
//        testa.setGarden("123");
//        esService.add("qq","tweet",testa);
        return null;
    }

    
    /**
     * @author:shuyu.wang
     * @description:条件分页查询样例
     * @date: 2018/3/30 9:39
    */
    @RequestMapping("/get2")
    @ResponseBody
    public Object get2() {
        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
        WildcardQueryBuilder user = QueryBuilders.wildcardQuery("user", "*1");
        queryBuilder.must(user);
        ESReturn query = esService.query("qq","tweet",queryBuilder,"postDate",0,5);
        System.out.println(query.getTotal());
        return query;
    }

猜你喜欢

转载自blog.csdn.net/wang_shuyu/article/details/79820496