关于ElasticSearch的常用增删改查DSL和代码

 更新时间:2024年04月01日 16:36:51   作者:快乐敲代码  
这篇文章主要介绍了关于ElasticSearch的常用增删改查DSL和代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

es增删改查常用语法

我们日常开发中,操作数据库写sql倒是不可能忘记,但是操作es的dsl语句有时候很容易忘记,特地记录一下方便查找。

注意,如果有些字段设置的text类型,那么在查询的时候加上.keyword,比如查询code字段

{
  "query": {
    "terms": {
      "code.keyword": ["aaa","bbb"]  
    }
  }
}

DSL语句

1、创建索引

-- 创建索引
PUT /my_index
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      },
      "description": {
        "type": "text"
      },
      "timestamp": {
        "type": "date"
      }
    }
  }
}

2、插入文档

-- 插入文档
POST /my_index/_doc/主键值
{
  "title": "Sample Document",
  "description": "This is a sample document for Elasticsearch",
  "timestamp": "2022-01-01"
}

3、更新文档

-- 更新一个文档
POST /my_index/_update/1   // 主键
{
  "doc": {
    "字段1": "内容1",
    "字段2": "内容2",
    "字段3": "内容3"
    // 添加需要更新的多个字段及对应的内容
  }
}
-- 批量更新多个文档字段
POST /my_index/_update_by_query
{
  "query": {
    "terms": {
      "_id": [111, 222]  // 指定id为111和222的文档
    },
  "script": {
    "source": "ctx._source.aaa= 1; ctx._source.bbb= 2"  // 更新aaa和bbb字段为1和2
  }
}
-- 批量更新多个文档字,指定字段内容为另外一个字段的内容
POST /search_order_index/_update_by_query
{
  "query": {
    "terms": {
      "orderNo": [
        "1111",  // 指定更新订单编号为111和222的记录
        "222"
      ]
    }
  },
  "script": {
    "source": "
    ctx._source.字段1= 1;   // 指定字段1 为1
    ctx._source.字段2= 1;  // 指定字段2 为1
    ctx._source.字段3= 0;  // 指定字段3为0
    ctx._source.字段4= ctx._source.字段5"  // 指定字段4为字段5的内容
  }
}

-- 更新所有文档字段
POST /my_index/_update_by_query
{
  "query": {
    "match_all": {}  // 匹配所有文档
  },
  "script": {
    "source": "ctx._source.aaa = 1; ctx._source.bbb = 1"  // 批量更新aaa和bbb字段为1
  }
}

4、删除文档(单独、多个、全部)

-- 删除单条文档
DELETE /my_index/_doc/主键值

或者
-- 删除单条文档  
POST 索引名/_delete_by_query
{
  "query":{
    "term":{
      "_id":4043
    }
  }
}
-- 删除多条文档  
POST 索引名/_delete_by_query
{
  "query": {
    "terms": {
      "_id": [4043, 4044, 4045]  // 添加多个id值
    }
  }
}

-- 删除索引中的所有数据
POST my_index/_delete_by_query
{
 "query": { 
   "match_all": {
    }
  }
}

5、删除索引

-- 删除索引
DELETE /my_index

6、设置索引别名

-- 设置索引别名
POST /_aliases
  {
        "actions": [
            {"add": {"index": "my_index2", "alias": "my_index"}}
        ]
  }

7、设置切片和副本数量

-- 设置切片和副本数量
PUT your_index
{
    "mappings" : {
      "properties" : {
      #索引字段(略)
      }
    }
    "settings" : {
        "number_of_shards" : 3,
        "number_of_replicas" : 1
    }
}

8、查询

-- 查询单个字段内容
POST /my_index/_search
{
  "query": {
    "bool": {
      "must": {
        "term": {
          "messageId": "CS202303160008-2"
        }
      }
    }
  }
}

-- 查询单个字段的多个内容  类似mysql中的in 用terms 多了个s
POST /my_index/_search
{
  "query": {
    "bool": {
      "must": {
        "terms": {
          "messageId": ["22222","1111"]
        }
      }
    }
  }
}

-- 分页排序查询  	不带其他条件

POST /my_index/_search
{
  "query": {
    "match_all": {}
  },
  "from": 0,
  "size": 20,
  "sort": [
    {
      "createdAt": {
        "order": "desc"
      }
    }
  ]
}
-- 分页排序查询  	带其他条件
{
  "query": {
    "bool": {
      "must": [
        {
          "prefix": {
            "action": "aa开头"
          }
        },
        {
          "wildcard": {
            "param": "*左右匹配内容*"
          }
        }
      ],
      "must_not": [],
      "should": []
    }
  },
  "from": 0,
  "size": 10,
  "sort": [
    {
      "createdAt": {
        "order": "desc"
      }
    }
  ]
}

9、统计

POST /my_index/_count
{
  "query": {
    "bool": {
      "must": {
        "term": {
          "messageId": "CS202303160008-2"
        }
      }
    }
  }
}

代码

pom依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

<groupId>com.demo.sdk</groupId>
<artifactId>elasticsearch-util</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>elasticsearch-util</name>
<description>Spring Boot Support for elasticsearch-util</description>

<properties>
	<java.version>11</java.version>
	<elasticsearch.version>7.10.0</elasticsearch.version>
	<spring-boot.version>2.7.0</spring-boot.version>
	<hutool.version>5.8.15</hutool.version>
	<pagehelper.version>1.4.2</pagehelper.version>
</properties>

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-autoconfigure</artifactId>
		<version>${spring-boot.version}</version>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-configuration-processor</artifactId>
		<version>${spring-boot.version}</version>
		<optional>true</optional>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-logging</artifactId>
		<version>${spring-boot.version}</version>
	</dependency>
	<dependency>
		<groupId>org.elasticsearch.client</groupId>
		<artifactId>elasticsearch-rest-high-level-client</artifactId>
		<version>${elasticsearch.version}</version>
	</dependency>
	<dependency>
		<groupId>com.github.pagehelper</groupId>
		<artifactId>pagehelper-spring-boot-starter</artifactId>
		<version>${pagehelper.version}</version>
	</dependency>
	<dependency>
		<groupId>cn.hutool</groupId>
		<artifactId>hutool-all</artifactId>
		<version>${hutool.version}</version>
	</dependency>
</dependencies>

<build>
	<plugins>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-compiler-plugin</artifactId>
			<version>3.8.1</version>
			<configuration>
				<source>11</source>
				<target>11</target>
				<encoding>UTF-8</encoding>
			</configuration>
		</plugin>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-source-plugin</artifactId>
			<configuration>
				<attach>true</attach>
			</configuration>
			<executions>
				<execution>
					<phase>compile</phase>
					<goals>
						<goal>jar</goal>
					</goals>
				</execution>
			</executions>
		</plugin>
	</plugins>
</build>

1、ES配置类

	import cn.hutool.core.text.CharSequenceUtil;
	import org.apache.http.auth.AuthScope;
	import org.apache.http.auth.UsernamePasswordCredentials;
	import org.apache.http.client.CredentialsProvider;
	import org.apache.http.impl.client.BasicCredentialsProvider;
	import org.springframework.boot.context.properties.ConfigurationProperties;
	
	/**
	* ES配置类
	* @author ppp
	* @date 2023/3/21
	*/
	@ConfigurationProperties(prefix = "elasticsearch.config")
	public class ElasticsearchProperties {
	
	    /**
	     * 域名
	     */
	    private String host;
	    /**
	     * 端口
	     */
	    private String port;
	
	    /**
	     * 用户名
	     */
	    private String username;
	
	    /**
	     * 密码
	     */
	    private String password;
	
	    /**
	     * 连接超时时间
	     */
	    private int connectTimeOut;
	    /**
	     * 连接超时时间
	     */
	    private int socketTimeOut;
	    /**
	     * 获取连接的超时时间
	     */
	    private int connectionRequestTimeOut;
	    /**
	     * 获取搜索的超时时间
	     */
	    private long searchRequestTimeOut = 10000L;
	    /**
	     * 最大连接数
	     */
	    private int maxConnectNum;
	    /**
	     * 最大路由连接数
	     */
	    private int maxConnectPerRoute;
	
	    public String getHost() {
	        return host;
	    }
	
	    public void setHost(String host) {
	        this.host = host;
	    }
	
	    public String getPort() {
	        return port;
	    }
	
	    public void setPort(String port) {
	        this.port = port;
	    }
	
	    public int getConnectTimeOut() {
	        return connectTimeOut;
	    }
	
	    public void setConnectTimeOut(int connectTimeOut) {
	        this.connectTimeOut = connectTimeOut;
	    }
	
	    public int getSocketTimeOut() {
	        return socketTimeOut;
	    }
	
	    public void setSocketTimeOut(int socketTimeOut) {
	        this.socketTimeOut = socketTimeOut;
	    }
	
	    public int getConnectionRequestTimeOut() {
	        return connectionRequestTimeOut;
	    }
	
	    public void setConnectionRequestTimeOut(int connectionRequestTimeOut) {
	        this.connectionRequestTimeOut = connectionRequestTimeOut;
	    }
	
	    public long getSearchRequestTimeOut() {
	        return searchRequestTimeOut;
	    }
	
	    public void setSearchRequestTimeOut(long searchRequestTimeOut) {
	        this.searchRequestTimeOut = searchRequestTimeOut;
	    }
	
	    public int getMaxConnectNum() {
	        return maxConnectNum;
	    }
	
	    public void setMaxConnectNum(int maxConnectNum) {
	        this.maxConnectNum = maxConnectNum;
	    }
	
	    public int getMaxConnectPerRoute() {
	        return maxConnectPerRoute;
	    }
	
	    public void setMaxConnectPerRoute(int maxConnectPerRoute) {
	        this.maxConnectPerRoute = maxConnectPerRoute;
	    }
	
	    public String getUsername() {
	        return username;
	    }
	
	    public void setUsername(String username) {
	        this.username = username;
	    }
	
	    public String getPassword() {
	        return password;
	    }
	
	    public void setPassword(String password) {
	        this.password = password;
	    }
	
	    public CredentialsProvider getCredentialsProvider() {
	        if (CharSequenceUtil.isNotBlank(username) && CharSequenceUtil.isNotBlank(password)) {
	            CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
	            credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
	            return credentialsProvider;
	        }
	        return null;
	    }
	
	
	}

2、ES工具自动配置类

import cn.hutool.core.text.CharSequenceUtil;
import com.demo.sdk.elasticsearch.template.ElasticsearchUtilTemplate;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
* ES工具自动配置类
* @author ppp
* @date 2023/3/21
*/
@Configuration
@ConditionalOnClass(ElasticsearchUtilTemplate.class)
@EnableConfigurationProperties(ElasticsearchProperties.class)
public class ElasticsearchUtilAutoConfiguration {
    @Bean
    @ConditionalOnMissingBean
    public RestHighLevelClient esRestClient(ElasticsearchProperties esearchProperties) {
        if (esearchProperties == null) {
            throw new NullPointerException("Es Configuration Properties Is Null");
        }
        String host = esearchProperties.getHost();
        String port = esearchProperties.getPort();
        RestClientBuilder builder;
        if (CharSequenceUtil.isNotBlank(host) && CharSequenceUtil.isBlank(port)) {
            builder = RestClient.builder(HttpHost.create(host));
        }else {
            builder = RestClient.builder(new HttpHost(host, Integer.parseInt(port)));
        }
        // 异步httpclient连接延时配置
        builder.setRequestConfigCallback(requestConfigBuilder -> {
            requestConfigBuilder.setConnectTimeout(esearchProperties.getConnectTimeOut());
            requestConfigBuilder.setSocketTimeout(esearchProperties.getSocketTimeOut());
            requestConfigBuilder.setConnectionRequestTimeout(esearchProperties.getConnectionRequestTimeOut());
            return requestConfigBuilder;
        });
        // 异步httpclient连接数配置
        builder.setHttpClientConfigCallback(httpClientBuilder -> {
            httpClientBuilder.setMaxConnTotal(esearchProperties.getMaxConnectNum());
            httpClientBuilder.setMaxConnPerRoute(esearchProperties.getMaxConnectPerRoute());
            httpClientBuilder.setDefaultCredentialsProvider(esearchProperties.getCredentialsProvider());
            return httpClientBuilder;
        });
        return  new RestHighLevelClient(builder);
    }

    @Bean
    @ConditionalOnMissingBean
    public ElasticsearchUtilTemplate elasticsearchUtilTemplate(RestHighLevelClient esRestClient, ElasticsearchProperties elasticsearchProperties) {
        if (esRestClient == null) {
            throw new NullPointerException("RestHighLevelClient init Error");
        }
        return new ElasticsearchUtilTemplate(esRestClient,elasticsearchProperties.getSearchRequestTimeOut());
    }

}

3、自动装配配置

装配要生效需要ElasticsearchUtilAutoConfiguration加入springboot的自动装配文件spring.factories

这是spring配置的特定目录文件,自己新建一个,名字和目录要一致

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.demo.sdk.elasticsearch.config.ElasticsearchUtilAutoConfiguration

4、定义一个模板工具类

	import cn.hutool.json.JSONUtil;
	import com.github.pagehelper.Page;
	import com.github.pagehelper.page.PageMethod;
	import com.demo.sdk.elasticsearch.exception.ElasticsearchErrorException;
	import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
	import org.elasticsearch.action.bulk.BulkRequest;
	import org.elasticsearch.action.bulk.BulkResponse;
	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.SearchRequest;
	import org.elasticsearch.action.search.SearchResponse;
	import org.elasticsearch.action.support.master.AcknowledgedResponse;
	import org.elasticsearch.action.update.UpdateRequest;
	import org.elasticsearch.action.update.UpdateResponse;
	import org.elasticsearch.client.RequestOptions;
	import org.elasticsearch.client.RestHighLevelClient;
	import org.elasticsearch.client.core.CountRequest;
	import org.elasticsearch.client.core.CountResponse;
	import org.elasticsearch.client.indices.CreateIndexRequest;
	import org.elasticsearch.client.indices.CreateIndexResponse;
	import org.elasticsearch.common.unit.TimeValue;
	import org.elasticsearch.common.xcontent.XContentType;
	import org.elasticsearch.search.SearchHit;
	import org.elasticsearch.search.builder.SearchSourceBuilder;
	import java.util.ArrayList;
	import java.util.List;
	import java.util.Map;
	
	/**
	* ES搜索引擎模板
	* @author ppp
	* @date 2023/3/21
	*/
	public class ElasticsearchUtilTemplate {
	    private final RestHighLevelClient esRestClient;
	    private final long searchRequestTimeOut;
	
	    public ElasticsearchUtilTemplate(RestHighLevelClient esRestClient, long searchRequestTimeOut) {
	        this.searchRequestTimeOut = searchRequestTimeOut;
	        this.esRestClient = esRestClient;
	    }
	
	    /**
	     * 列表查询
	     *
	     * @param searchSourceBuilder SearchSourceBuilder
	     * @param clazz               返回结果class对象
	     * @param indices             ES索引
	     * @return java.util.List    对象列表
	     */
	    public <T> List<T> listSearch(SearchSourceBuilder searchSourceBuilder, Class<T> clazz, String... indices) {
	        Page<T> resultPage = PageMethod.getLocalPage();
	        boolean isResultPage = resultPage != null;
	        if (isResultPage) {
	            PageMethod.clearPage();
	            searchSourceBuilder.from((int) resultPage.getStartRow());
	            searchSourceBuilder.size(resultPage.getPageSize());
	        }
	        if (isResultPage && resultPage.isCount()) {
	            resultPage.setTotal(count(searchSourceBuilder, indices));
	        }
	        SearchResponse searchResponse = search(searchSourceBuilder, indices);
	        List<T> resultList = formatSearchResult(searchResponse, clazz);
	        if (isResultPage && resultPage.isCount()) {
	            resultPage.addAll(resultList);
	            return resultPage;
	        }
	        return resultList;
	    }
	
	    public SearchResponse search(SearchSourceBuilder searchSourceBuilder, String... indices) {
	        SearchRequest searchRequest = new SearchRequest(indices);
	        searchSourceBuilder.timeout(TimeValue.timeValueMillis(searchRequestTimeOut));
	        searchRequest.source(searchSourceBuilder);
	        return search(searchRequest);
	    }
	
	    public SearchResponse search(SearchRequest searchRequest) {
	        try {
	            return esRestClient.search(searchRequest, RequestOptions.DEFAULT);
	        } catch (Exception e) {
	            throw new ElasticsearchErrorException(e.getMessage(), e.getCause());
	        }
	    }
	
	    /**
	     * 统计数量
	     *
	     * @param searchSourceBuilder SearchSourceBuilder
	     * @param indices             ES索引
	     * @return CountResponse
	     */
	    public long count(SearchSourceBuilder searchSourceBuilder, String... indices) {
	        CountRequest countRequest = new CountRequest(indices);
	        searchSourceBuilder.timeout(TimeValue.timeValueMillis(searchRequestTimeOut));
	        countRequest.query(searchSourceBuilder.query());
	        return count(countRequest, RequestOptions.DEFAULT).getCount();
	    }
	
	    public CountResponse count(CountRequest countRequest, RequestOptions options) {
	        try {
	            return esRestClient.count(countRequest, options);
	        } catch (Exception e) {
	            throw new ElasticsearchErrorException(e.getMessage(), e.getCause());
	        }
	    }
	
	    /**
	     * 创建索引
	     *
	     * @param createIndexRequest CreateIndexRequest
	     * @return CreateIndexResponse
	     */
	    public CreateIndexResponse createIndices(CreateIndexRequest createIndexRequest) {
	        try {
	            return esRestClient.indices().create(createIndexRequest, RequestOptions.DEFAULT);
	        } catch (Exception e) {
	            throw new ElasticsearchErrorException(e.getMessage(), e.getCause());
	        }
	    }
	
	    /**
	     * 删除索引(谨慎操作,索引下所有数据都将清空)
	     *
	     * @param index 索引名称
	     * @return AcknowledgedResponse
	     */
	    public AcknowledgedResponse deleteIndex(String index) {
	        DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest();
	        deleteIndexRequest.indices(index);
	        return deleteIndices(deleteIndexRequest);
	    }
	
	    /**
	     * 删除索引(谨慎操作,索引下所有数据都将清空)
	     *
	     * @param deleteIndexRequest DeleteIndexRequest
	     * @return AcknowledgedResponse
	     */
	    public AcknowledgedResponse deleteIndices(DeleteIndexRequest deleteIndexRequest) {
	        try {
	            return esRestClient.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
	        } catch (Exception e) {
	            throw new ElasticsearchErrorException(e.getMessage(), e.getCause());
	        }
	    }
	
	    /**
	     * 插入数据
	     *
	     * @param index  索引
	     * @param id     唯一id
	     * @param source 插入对象
	     * @return IndexResponse
	     */
	    public IndexResponse add(String index, Object id, Object source) {
	        IndexRequest indexRequest = new IndexRequest(index).id(String.valueOf(id));
	        indexRequest.source(JSONUtil.toJsonStr(source), XContentType.JSON);
	        try {
	            return esRestClient.index(indexRequest, RequestOptions.DEFAULT);
	        } catch (Exception e) {
	            throw new ElasticsearchErrorException(e.getMessage(), e.getCause());
	        }
	    }
	
	    /**
	     * 批量插入数据
	     * 建议:数量控制在5000以内
	     *
	     * @param index     索引
	     * @param sourceMap 数据<唯一id,对象>
	     * @return BulkResponse
	     */
	    public BulkResponse addBulk(String index, Map<String, Object> sourceMap) {
	        BulkRequest request = new BulkRequest();
	        sourceMap.forEach((id, source) -> {
	            request.add(new IndexRequest(index).id(id).source(JSONUtil.toJsonStr(source), XContentType.JSON));
	        });
	        try {
	            return esRestClient.bulk(request, RequestOptions.DEFAULT);
	        } catch (Exception e) {
	            throw new ElasticsearchErrorException(e.getMessage(), e.getCause());
	        }
	    }
	
	
	    /**
	     * 获取数据
	     *
	     * @param getRequest GetRequest
	     * @return GetResponse
	     */
	    public GetResponse get(GetRequest getRequest) {
	        try {
	            return esRestClient.get(getRequest, RequestOptions.DEFAULT);
	        } catch (Exception e) {
	            throw new ElasticsearchErrorException(e.getMessage(), e.getCause());
	        }
	    }
	
	    /**
	     * 更新数据
	     *
	     * @param updateRequest UpdateRequest
	     * @return UpdateResponse
	     */
	    public UpdateResponse update(UpdateRequest updateRequest) {
	        try {
	            return esRestClient.update(updateRequest, RequestOptions.DEFAULT);
	        } catch (Exception e) {
	            throw new ElasticsearchErrorException(e.getMessage(), e.getCause());
	        }
	    }
	
	    /**
	     * 删除数据
	     *
	     * @param deleteRequest DeleteRequest
	     * @return DeleteResponse
	     */
	    public DeleteResponse delete(DeleteRequest deleteRequest) {
	        try {
	            return esRestClient.delete(deleteRequest, RequestOptions.DEFAULT);
	        } catch (Exception e) {
	            throw new ElasticsearchErrorException(e.getMessage(), e.getCause());
	        }
	    }
	
	    /**
	     * 格式化搜索结果
	     *
	     * @param searchResponse 搜索结果
	     * @param clazz          返回对象
	     * @return java.util.List
	     */
	    public <T> List<T> formatSearchResult(SearchResponse searchResponse, Class<T> clazz) {
	        SearchHit[] searchHits = searchResponse.getHits().getHits();
	        List<T> resultList = new ArrayList<T>();
	        for (SearchHit searchHit : searchHits) {
	            resultList.add(JSONUtil.toBean(searchHit.getSourceAsString(), clazz));
	        }
	        return resultList;
	    }
	}

5、定义一个异常

/**
* 错误异常
* @author ppp
* @date 2023/3/21
*/
public class ElasticsearchErrorException extends RuntimeException {

    public ElasticsearchErrorException(String message) {
        super(message);
    }

    public ElasticsearchErrorException(String message, Throwable cause) {
        super(message, cause);
    }
}

6、application.yml配置

# elasticsearch
elasticsearch.config:
    host: 127.0.0.1
    port: 9200
    username: admin
    password: admin123
    connect-time-out: 1000
    socket-time-out: 30000
    connection-request-time-out: 500
    search-request-time-out: 5000
    max-connect-num: 100
    max-connect-per-route: 100

7、测试

class DemoApplicationTests {
	/**
	 * 获取ElasticsearchUtilTemplate模板
	 */
	@Autowired
	private ElasticsearchUtilTemplate elasticsearchTemplate;

/**
 * 分页查询
 */
@Test
void getListPage() {
	// 分页
	PageHelper.startPage(1, 10);
	SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
	BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
	// 筛选  filter比must要好一点,filter会对条件进行缓存,这有助于提高查询性能,特别是对于频繁使用的过滤条件
	boolQueryBuilder.filter(QueryBuilders.termQuery("ip", "192.168.0.1"));
	// 筛选多个值  类似mysql的in效果  termsQuery和termQuery区别
	boolQueryBuilder.filter(QueryBuilders.termsQuery("name", Arrays.asList("张三","李四"));
	// 模糊
	boolQueryBuilder.must(QueryBuilders.wildcardQuery("ext1", "*测试*"));
	searchSourceBuilder.query(boolQueryBuilder);
	// 排序
	searchSourceBuilder.sort("createTime", SortOrder.DESC);
	List<StudyLogIndex> logIndexList = this.elasticsearchTemplate.listSearch(searchSourceBuilder, StudyLogIndex.class, index);
	PageInfo<StudyLogIndex> studyLogIndexPageInfo = new PageInfo<>(logIndexList);
	System.out.println(JSONUtil.toJsonStr(studyLogIndexPageInfo));
}

/**
 * 统计
 */
@Test
void countTest() {
	// 分页
	PageHelper.startPage(1, 10);
	SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
	BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
	// 筛选
	boolQueryBuilder.filter(QueryBuilders.termQuery("ip", "127.0.0.1"));
	// 模糊
	boolQueryBuilder.must(QueryBuilders.wildcardQuery("ext2", "*用*"));
	searchSourceBuilder.query(boolQueryBuilder);
	CountResponse count = elasticsearchTemplate.count(searchSourceBuilder, index);
	System.out.println("统计总数:"+ count.getCount());
}

/**
 * 删除索引
 */
@Test
void deleteIndicesTest() {
	elasticsearchTemplate.deleteIndex(index);
}

/**
 * 创建es索引
 */
@Test
void createIndicesTest() {
	CreateIndexRequest createIndexRequest = new CreateIndexRequest(index);
	createIndexRequest.mapping("{\n" +
			"    \"properties\": {\n" +
			"        \"globalId\": {\n" +
			"            \"type\": \"keyword\"\n" +
			"        },\n" +
			"        \"site\": {\n" +
			"            \"type\": \"keyword\"\n" +
			"        },\n" +
			"        \"tag\": {\n" +
			"            \"type\": \"keyword\"\n" +
			"        },\n" +
			"        \"uid\": {\n" +
			"            \"type\": \"keyword\"\n" +
			"        },\n" +
			"        \"classId\": {\n" +
			"            \"type\": \"keyword\"\n" +
			"        },\n" +
			"        \"courseId\": {\n" +
			"            \"type\": \"keyword\"\n" +
			"        },\n" +
			"        \"videoId\": {\n" +
			"            \"type\": \"keyword\"\n" +
			"        },\n" +
			"        \"startTime\": {\n" +
			"            \"type\": \"keyword\"\n" +
			"        },\n" +
			"        \"time\": {\n" +
			"            \"type\": \"keyword\"\n" +
			"        },\n" +
			"        \"ip\": {\n" +
			"            \"type\": \"keyword\"\n" +
			"        },\n" +
			"        \"start\": {\n" +
			"            \"type\": \"integer\"\n" +
			"        },\n" +
			"        \"end\": {\n" +
			"            \"type\": \"integer\"\n" +
			"        },\n" +
			"        \"createTime\": {\n" +
			"            \"type\": \"keyword\"\n" +
			"        },\n" +
			"        \"ext1\": {\n" +
			"            \"type\": \"keyword\"\n" +
			"        },\n" +
			"        \"ext2\": {\n" +
			"            \"type\": \"keyword\"\n" +
			"        }\n" +
			"    }\n" +
			"}", XContentType.JSON);
	elasticsearchTemplate.createIndices(createIndexRequest);
}

/**
 * 插入es数据
 */
@Test
void addDataTest() {
	for (int i = 0; i < 10; i++) {
		StudyLogIndex studyLogIndex = new StudyLogIndex();
		studyLogIndex.setGlobalId("CX"+i);
		studyLogIndex.setSite("CX");
		studyLogIndex.setTag("SUCCESS");
		studyLogIndex.setUid(12000000L+i);
		studyLogIndex.setClassId(123456L);
		studyLogIndex.setCourseId(123456L);
		studyLogIndex.setVideoId(123456L);
		studyLogIndex.setStartTime(123456L);
		studyLogIndex.setTime(123456L);
		studyLogIndex.setIp("127.0.0.1");
		studyLogIndex.setStart(0);
		studyLogIndex.setEnd(0);
		studyLogIndex.setCreateTime(0L);
		studyLogIndex.setExt1("测试es工具");
		studyLogIndex.setExt2("备用");
		elasticsearchTemplate.add(index, studyLogIndex.getGlobalId(), studyLogIndex);
	}
}

/**
 * 批量插入es
 */
@Test
void bulkAddDataTest() {
	Map<String, Object> map = new HashMap<>(16);
	for (int i = 100; i < 1000; i++) {
		StudyLogIndex studyLogIndex = new StudyLogIndex();
		studyLogIndex.setGlobalId(IdUtil.getSnowflakeNextIdStr());
		studyLogIndex.setSite("ZJ");
		studyLogIndex.setTag("SUCCESS");
		studyLogIndex.setUid(12000000L+i);
		studyLogIndex.setClassId(123456L);
		studyLogIndex.setCourseId(123456L);
		studyLogIndex.setVideoId(123456L);
		studyLogIndex.setStartTime(123456L);
		studyLogIndex.setTime(123456L);
		studyLogIndex.setIp("192.168.0.3");
		studyLogIndex.setStart(0);
		studyLogIndex.setEnd(0);
		studyLogIndex.setCreateTime(0L);
		studyLogIndex.setExt1("批量测试es工具");
		studyLogIndex.setExt2("备用");
		map.put(studyLogIndex.getGlobalId(), studyLogIndex);
	}
	elasticsearchTemplate.addBulk(index, map);
}

/**
 * 聚合检索
 */
@Test
void aggregateTest() {
	SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
	// 聚合检索不设置大小会默认只返回10个统计结果
	TermsAggregationBuilder field = AggregationBuilders.terms("group_by_ip").field("ip").size(1000);
	searchSourceBuilder.aggregation(field).size(10);
	SearchResponse search = elasticsearchTemplate.search(searchSourceBuilder, index);
	System.out.println(JSONUtil.toJsonStr(search));
	Map<String, Long> countMap = AggregationsUtil.getCountMap(search.getAggregations());
	System.out.println(JSONUtil.toJsonStr(countMap));
}
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解IDEA社区版(Community)和付费版(UItimate)的区别

    详解IDEA社区版(Community)和付费版(UItimate)的区别

    这篇文章主要介绍了详解IDEA社区版(Community)和付费版(UItimate)的区别,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Springboot无法注入service问题

    Springboot无法注入service问题

    这篇文章主要介绍了Springboot无法注入service的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Java实现三子棋小游戏简易版

    Java实现三子棋小游戏简易版

    这篇文章主要为大家详细介绍了Java实现三子棋小游戏简易版,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • java写入zip文件后无法进行删除的问题及解决

    java写入zip文件后无法进行删除的问题及解决

    这篇文章主要介绍了java写入zip文件后无法进行删除的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Java弹簧布局管理器使用方法详解

    Java弹簧布局管理器使用方法详解

    这篇文章主要介绍了Java弹簧布局管理器使用方法详解,需要的朋友可以参考下
    2017-09-09
  • Spring Boot实现热部署的五种方式

    Spring Boot实现热部署的五种方式

    这篇文章主要介绍了Spring Boot 五种热部署方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • 详解java解决分布式环境中高并发环境下数据插入重复问题

    详解java解决分布式环境中高并发环境下数据插入重复问题

    这篇文章主要介绍了java解决并发数据重复问题 ,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • SpringBoot@Profile注解和Spring EL(多环境注入)

    SpringBoot@Profile注解和Spring EL(多环境注入)

    为了方便, Spring还提供了 Profile机制, 使我们可以很方便地实现各个环境之间的切换,在使用DI来依赖注入的时候,能够根据@profile标明的环境,将注入符合当前运行环境的相应的bean,本文通过示例代码介绍SpringBoot@Profile注解和Spring EL,需要的朋友可以参考下
    2024-02-02
  • Spring Boot 集成 Sharding-JDBC + Mybatis-Plus 实现分库分表功能

    Spring Boot 集成 Sharding-JDBC + Mybatis-Plus 实现分库分表功能

    这篇文章主要介绍了Spring Boot 集成 Sharding-JDBC + Mybatis-Plus 实现分库分表功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • SpringBoot+WebSocket+Netty实现消息推送的示例代码

    SpringBoot+WebSocket+Netty实现消息推送的示例代码

    这篇文章主要介绍了SpringBoot+WebSocket+Netty实现消息推送的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04

最新评论