ElasticSearch使用案例-初入者

一、针对ES库中数据进行增删改等基础业务实现

1.基础环境

Java语言开发
JDK 11
Spring Boot集成
自行安装ElasticSerach的客户端:ElasticSearch以及可视化Kibana

2. 所需依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
            <version>2.5.14</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-elasticsearch</artifactId>
            <version>4.2.11</version>
        </dependency>

3. 全局配置类

/**
 * 一般配置文件中写入Ip端口等信息,如果增加账号密码同步写入即可
 */
@Configuration
public class ElasticSearchClientConfig {

    @Value("${data.es.ip}")
    private String ip;

    @Value("${es.port}")
    private Integer esPort;

    @Bean
    public RestHighLevelClient restHighLevelClient(){
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost(ip, esPort, "http")));
        // 此处可以配置连接时长SocketTime时间
        return client;
    }
}

二、使用场景案例代码

1. 创建对应索引

/**
 * 测试类
 */
public class ElasticsearchDemo {
	// 引入依赖以及注入配置类之后直接引用客户端
	@Autowired
    private RestHighLevelClient restHighLevelClient;
	
	/**
	 * 创建ES索引
 	 */
	 public void creatEsIndexTest(){
        try {
            //创建一个索引请求对象
            CreateIndexRequest request = new CreateIndexRequest("your_index_name");
            // 定义字段类型映射
            XContentBuilder mapping = XContentFactory.jsonBuilder()
                    .startObject().startObject("properties").startObject("id").field("type", "text").endObject()
                    .startObject("name").field("type", "keyword").endObject()
                    // 添加更多字段定义...
                    .endObject()
                    .endObject();
            // 设置映射
            request.mapping(mapping);
            // 发送创建索引请求
            CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
            // 打印创建索引的响应信息
            System.out.println("Index created: " + createIndexResponse.index());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

2. 查询索引数据

ES 中查询方式有很多种
针对某一个索引中根据其中某一个字段检索:
1.检索针对不同的字段类型有不同的检索方式
1). 例如:索引中name字段类型为Text类型,检索方式为一般为match不支持多参但是支持分词
2). 例如:索引中sex字段类型为Keyword类型,检索方式一般为term、terms等支持多参不支持分词
模糊搜索局里的两种类型都支持检索方式为:wildcard检索方式下面会有代码示例。
检索方式支持聚合,支持子聚合等还是比较丰富的。

/**
 * 测试类
 */
public class ElasticsearchDemo {
	// 引入依赖以及注入配置类之后直接引用客户端
	@Autowired
    private RestHighLevelClient restHighLevelClient;
	
	/**
	 * 查询索引数据
 	 */
	 public void selectEsIndexTest(){
        try {
        	// 每一个searchRequest.source().query()只有一种检索方式
        	//根据当前的Index_name创建查询对象
        	//假设索引中字段有id, name, time, sex等
            SearchRequest searchRequest = new SearchRequest("index_name");
            //根据name进行模糊匹配:字段类型为keyword
            searchRequest.source().query(QueryBuilders.wildcardQuery("name", "*张三*"));
            //也可以在参数中间增加通配符,但是这样使用方式就不如增加分词器
            searchRequest.source().query(QueryBuilders.wildcardQuery("", "*张*三*"));
            //根据name进行等价匹配:字段类型为keyword
            searchRequest.source().query(QueryBuilders.termQuery("name", "张三"));
            //根据name进行等价匹配:字段类型为Text
            searchRequest.source().query(QueryBuilders.matchQuery("name", "张三"));
            //检索name为张三并且time时间为2023-03-01到2023-03-02的数据
            // 与条件:bool查询方式表明有多个条件,语义与Mysql中where条件中的and一样只不过需要加一个条件就增加一个must即可
            QueryBuilders.boolQuery().must(QueryBuilders.termQuery("name", "张三"))
                        .must(QueryBuilders.rangeQuery("time").gte("2023-03-01").lte("2023-03-02"));
            //或条件检索 替换must即可
            QueryBuilders.boolQuery().should(QueryBuilders.termQuery("name", "张三"))
                .should(QueryBuilders.termQuery("sex", "男"));
            //非条件
             QueryBuilders.boolQuery().mustNot(QueryBuilders.termQuery("name", "张三"))
                        .mustNot(QueryBuilders.rangeQuery("time").gte("2023-03-01").lte("2023-03-02"));
            //时间范围  需要定义好自己的字段类型format支持的类型 
            QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery("time").gte("2023-03-01").lte("2023-03-02"));

			//复杂条件 可以使用should must等嵌套使用
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

3. 根据ID修改数据

/**
 * 测试类
 */
public class ElasticsearchDemo {
	// 引入依赖以及注入配置类之后直接引用客户端
	@Autowired
    private RestHighLevelClient restHighLevelClient;
	
	 /**
     * 根据ID修改数据
     */
    public void updateEsIndexTest(){
        try {
            // 要更新的索引和文档ID
            String indexName = "your_index_name";
            String documentId = "your_document_id";

            // 构建更新请求
            UpdateRequest updateRequest = new UpdateRequest(indexName, documentId);

            // 定义要更新的字段值
            XContentBuilder docBuilder = XContentFactory.jsonBuilder().startObject()
                    .field("field1", "new_value")  // 将 "field1" 的值更新为 "new_value"
                    // 添加更多字段更新...
                    .endObject();

            // 设置更新内容
            updateRequest.doc(docBuilder);

            // 发送更新请求
            UpdateResponse updateResponse = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);

            // 打印更新的响应信息
            System.out.println("Update response: " + updateResponse.getResult());

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

4. 根据ID删除某一条数据或者多条数据

/**
 * 测试类
 */
public class ElasticsearchDemo {
	// 引入依赖以及注入配置类之后直接引用客户端
	@Autowired
    private RestHighLevelClient restHighLevelClient;
	
	 /**
     * 根据ID删除数据
     */
    public void deleteEsIndexTest(){
        try {
            // 连接到Elasticsearch集群,确保替换成你的Elasticsearch节点信息
            try (RestHighLevelClient client = new RestHighLevelClient.Builder()
                    .build()) {

                // 要删除的索引
                String indexName = "your_index_name";

                // 构建删除请求
                DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest(indexName);

                // 定义查询条件,这里是一个示例条件,value可以是一个List<Stirng> 可以是你创建的任意一个字段
                List<String> idsList = new ArrayList<>();
                //根据业务添加值
                deleteByQueryRequest.setQuery(QueryBuilders.termsQuery("field1", idsList));

                // 发送删除请求
                DeleteByQueryResponse deleteByQueryResponse = client.deleteByQuery(deleteByQueryRequest, RequestOptions.DEFAULT);

                // 打印删除的响应信息
                System.out.println("Delete by query response: " + deleteByQueryResponse);

            } catch (IOException e) {
                e.printStackTrace();
            }

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值