elasticsearch high level API 使用示例

本文将介绍如何使用Elasticsearch的High Level REST Client进行数据操作,包括索引创建、文档插入、搜索查询等核心功能,帮助Java开发者更好地理解和应用Elasticsearch。
摘要由CSDN通过智能技术生成
  <dependencies>      
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>7.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.plugin</groupId>
            <artifactId>transport-netty4-client</artifactId>
            <version>7.0.0</version>
        </dependency>
  </dependencies>

import org.elasticsearch.action.search.SearchResponse;

import java.util.List;
import java.util.Map;

/**
 * @Author: gh
 * @Description: elasticsearch查询数据(分页)、添加数据、修改数据、删除数据、展示所有库表、统计每张表的记录总条数;
 * es的使用率,已使用的存储空间大小。按任意字段进行模糊查询。获取所有字段的名称。
 */
public interface EsDao {

    /**
     * 分页查询
     * @param index 索引名称
     * @param pageSize 页的大小
     * @param pageNum 第几页
     * @return
     */
    public SearchResponse getAllRowsBySearchAfter(String index, Integer pageSize, Integer pageNum);
    public SearchResponse getAllRowsByFromSize(String index, Integer pageSize, Integer pageNum);
    public List<Map<String, Object>> getAllRowsByScroll(String index);
    /**
     * 统计每个index下的document总数。
     * count API的命令:GET /index_name/type_name/_count
     * @param indexes 查询一个或多个index
     * @return
     */
    public long totalCount(String...indexes);
    /**
     * 查询某条document是否存在。
     * @param index 索引名称
     * @param id _id字段对应的主键值。
     * @return true存在,false不存在。
     */
    public boolean docIsExist(String index,String id);
    /**
     * 新增一条document。
     * @param index 索引名称
     * @param kvs 各个字段名称(key)和对应的值(value)
     * @return 200/201表示新增成功;其他如400表示新增失败。
     */
    public int insertDoc(String index,Map<String, Object> kvs);

    /**
     * 删除一条document。
     * @param index 索引名称
     * @param id _id字段对应的主键值。
     * @return 200/201表示删除成功;其他如400表示删除失败。
     */
    public int deleteDoc(String index,String id);

    /**
     * 更新一条document
     * @param index 索引名称
     * @param id _id字段对应的主键值。
     * @param kvs 各个字段名称(key)和对应的值(value)
     * @return 200/201表示更新成功;其他如400表示更新失败。
     */
    public int updateDoc(String index,String id,Map<String, Object> kvs);
    /**
     * es使用率 = cluster store(size_in_bytes) / (所有节点的磁盘可用空间 + size_in_bytes)
     * size_in_bytes: "_all":{"total":{"store":{"size_in_bytes": ***}}}
     * 某个节点的磁盘可用空间:(节点状态)"fs":{"total":{"available_in_bytes":***}}
     * @return
     */
    public double usedRate();
    /**
     * 获取某个cluster下所有的index名称列表。
     * 命令:_cluster/state/routing_table
     * @param clusterName 集群名称
     * @return
     */
    public Map<String, List<String>> getClusterIndexes(String clusterName);

    /**
     * 获取某个index下所有的type名称列表。
     * _type字段从elasticsearch 6.0.0版本开始过时,7.0版本后不再使用。
     * @return
     */
    public Map<String,List<String>> getIndexTypes(String clusterName);
    /**
     * @return 全部已使用存储空间的大小
     */
    public double storeSizeOfMB();
    /**
     * @param index 需要查询的索引名称
     * @return (某个索引下)已使用存储空间的大小
     */
    public double storeSizeOfMB(String index);
    /**
     * 暂行:1.统计某个集群(相当于数据库)下所有index(相当于表)的数量。默认集群时elasticsearch。
     * 搁置:2.统计某个index(相当于数据库)下所有type(相当于表)的数量。
     * @return 表的数量
     */
    public int countTables();

    /**
     * 获取某个集群(相当于数据库)下所有的indice(相当于表)的名称列表。
     * @return
     */
    public List<String> getTablenamesOfDB();
    /**
     * 按任意字段进行模糊查询
     * @param indexName 索引名
     * @param fieldName 字段名
     * @param fieldValue 字段模糊值
     */
    public SearchResponse queryByRandomField(String indexName,String fieldName,String fieldValue,
                                             int pageSize,int pageNum);

    /**
     * @param indexName 索引名
     * @param fieldName 字段名
     * @param fieldValue 字段模糊值
     * @return 模糊查询时返回的记录总数
     */
    public long totalCountOfFuzzyQuery(String indexName,String fieldName,String fieldValue);
    /**
     * 获取 某个索引的所有字段名
     * @param indexName 索引的名称。例如:table1
     * @return map<k,v> k:字段名,v:空字符串
     */
    public Map<String,Object> getColumnNames(String indexName);
}
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.genius.pojo.pg.dto.DataBaseDTO;
import com.genius.util.StringUtil;
import com.genius.util.common.FileSizeUtil;
import com.genius.util.common.SizeUnitEnum;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.elasticsearch.action.DocWriteRequest;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.*;
import org.elasticsearch.action.support.WriteRequest;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.*;
import org.elasticsearch.client.core.CountRequest;
import org.elasticsearch.client.core.CountResponse;
import org.elasticsearch.client.indices.*;
import org.elasticsearch.cluster.metadata.MappingMetaData;
import org.elasticsearch.common.document.DocumentField;
import org.elasticsearch.common.geo.builders.CoordinatesBuilder;
import org.elasticsearch.common.geo.builders.GeometryCollectionBuilder;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.index.query.*;
import org.elasticsearch.rest.RestStatus;
import org.elasticsearch.search.Scroll;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.locationtech.jts.geom.Coordinate;
import org.springframework.util.StringUtils;

import java.io.*;
import java.sql.*;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @Description: 使用es JDBC 方式进行 查询数据(分页)、添加数据、修改数据、删除数据、展示所有库表。
 * 【注意】
 * 1.Elasticsearch JDBC方式不提供连接池机制;可以使用第三方连接池的机制。
 * 2.使用Elasticsearch x-pack-sql-jdbc的包会报错:
 * java.sql.SQLInvalidAuthorizationSpecException:
 * current license is non-compliant for [jdbc]
 * 使用JDBC客户端,elasticsearch需要升级到白金级:https://www.elastic.co/cn/subscriptions
 */
public class EsDaoImpl implements EsDao{

    RestHighLevelClient restClient = null;
    DataBaseDTO dataBaseDTO = null;

    public EsDaoImpl(DataBaseDTO dbd) {
        try {
            dataBaseDTO = dbd;
            this.restClient = connectToES();
            //initClient();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public RestHighLevelClient getRestClient() {
        return restClient;
    }
    public void setRestClient(RestHighLevelClient restClient) {
        this.restClient = restClient;
    }
    /**
     * 关闭连接
     */
    public void close(){
        try{
            if(this.restClient != null){
                restClient.close();
            }
        }catch(IOException e){
            e.printStackTrace();
        }
    }
    public boolean connected(){
        try {
            if(getRestClient() != null && getRestClient().ping(RequestOptions.DEFAULT)){
                return true;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }
    /**
     * JDBC连接elasticsearch。http port=9200
     * jdbc:es://[[http|https]://][host[:port]]/[prefix]<[?[option=value]&]
     * e.g. jdbc:es://http://server:3456/?timezone=UTC&page.size=250
     * 安全通信:SSL
     * @return
     * @throws SQLException
     */
    /*private Connection connectToES_abandon() throws SQLException {
        if(conn == null){
            if(dataBaseDTO != null){
                String url = "jdbc:es://"+dataBaseDTO.getIp()+":9200";
                System.out.println(url);
                EsDataSource ds = new EsDataSource();
                ds.setUrl(url);
                Properties props = new Properties();
                *//*props.put("user", "test_admin");
                props.put("password", "x-pack-test-password");*//*
                ds.setProperties(props);
                return ds.getConnection();
                //return DriverManager.getConnection(url, props);
            }
        }
        return conn;
    }*/

    /**
     * 连接 elasticsearch 并获取 index信息
     * @return
     * @throws SQLException
     */
    private RestHighLevelClient connectToES()  {
        try {
            String esIP = dataBaseDTO.getIp();
            //http port = 9200
            String esPort = dataBaseDTO.getHost();
            //索引。
            //String index = dataBaseDTO.getDbName();
            //TODO: 用户名、密码做校验。目前cluster是默认的。
            return new RestHighLevelClient(
                    RestClient.builder(new HttpHost(esIP, Integer.valueOf(esPort), "http")));
            //flag = indexIsExist(index);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    @Override
    public SearchResponse getAllRowsByScrollScan(String index, Integer pageSize, Integer pageNum) {
        return getAllRowsByScrollScan(null,index,pageSize,pageNum);
    }
    private SearchResponse getAllRowsByScrollScan(SearchSourceBuilder sourceBuilder,String index,
                                                  Integer pageSize,Integer pageNum) {
        if(pageSize==null || pageSize<1){
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值