[ES7版本系列(一)] Java连接ElasticSearch创建新的索引

本文将介绍如何在Java环境中,利用ES7的elasticsearch-rest-high-level-client库创建新的ElasticSearch索引。首先,需要引入对应的依赖。接着,通过示例代码展示创建索引的步骤。

 1.引入依赖,这里使用的是es的7以上的版本,使用elasticsearch-rest-high-level-client 高级别API来创建客户端

    <!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch -->
    <dependency>
      <groupId>org.elasticsearch</groupId>
      <artifactId>elasticsearch</artifactId>
      <version>7.3.1</version>
    </dependency>
    <dependency>
      <groupId>org.elasticsearch.client</groupId>
      <artifactId>elasticsearch-rest-high-level-client</artifactId>
      <version>7.3.1</version>
    </dependency>

2.创建新的索引的Demo 

package cn.sse;

import org.apache.http.HttpHost;
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.apache.http.im
<think> 我们参考了多个引用资料,特别是引用[1][2][3],这些资料详细介绍了Elasticsearch Java Rest Client中SearchRequest的使用方法。 根据引用,SearchRequest是用于执行搜索操作的核心类。以下是使用SearchRequest的基本步骤和常见配置: 1. 创建SearchRequest对象:可以指定索引名和类型(但注意,在Elasticsearch 7.x以后,类型逐渐被废弃,8.x已完全移除类型)。 2. 创建SearchSourceBuilder对象:用于构建搜索的详细配置,如查询条件、分页、排序、高亮等。 3. 设置查询条件:通过QueryBuilders工具类构建各种查询(如match_all, match, term等),并设置到SearchSourceBuilder中。 4. 可选:设置其他参数,如分页(from/size)、排序、高亮、聚合等。 5. 将SearchSourceBuilder设置到SearchRequest中。 6. 执行搜索:通过RestHighLevelClient的search方法发送请求,并处理返回的SearchResponse。 下面我们结合引用内容,给出个详细的示例和说明。 ### 基本使用步骤 #### 1. 创建SearchRequest对象 ```java // 创建SearchRequest,可以指定个或多个索引 SearchRequest searchRequest = new SearchRequest("index1", "index2"); // 在7.x之前可以设置类型,但7.x后不推荐,8.x已移除类型设置 // searchRequest.types("type1"); // 8.x中已废弃 ``` #### 2. 创建SearchSourceBuilder并设置查询 ```java SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); // 设置查询条件,例如使用match_all查询 sourceBuilder.query(QueryBuilders.matchAllQuery()); ``` #### 3. 设置分页 ```java sourceBuilder.from(0); // 起始记录索引,从0开始 sourceBuilder.size(10); // 每页大小 ``` #### 4. 设置排序 ```java sourceBuilder.sort("fieldName", SortOrder.ASC); // 按字段升序排序 ``` #### 5. 设置高亮 ```java HighlightBuilder highlightBuilder = new HighlightBuilder(); highlightBuilder.field("fieldName"); // 设置要高亮的字段 highlightBuilder.preTags(""<em>); // 高亮前缀 highlightBuilder.postTags("</em>"); // 高亮后缀 sourceBuilder.highlighter(highlightBuilder); ``` #### 6. 设置聚合(可选) ```java // 例如添加个terms聚合 TermsAggregationBuilder aggregation = AggregationBuilders.terms("agg_name").field("field_to_aggregate"); sourceBuilder.aggregation(aggregation); ``` #### 7. 将SearchSourceBuilder设置到SearchRequest ```java searchRequest.source(sourceBuilder); ``` #### 8. 执行搜索 ```java RestHighLevelClient client = ... // 获取客户端 SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); ``` #### 9. 处理响应 ```java SearchHits hits = response.getHits(); for (SearchHit hit : hits.getHits()) { String sourceAsString = hit.getSourceAsString(); // 获取文档源作为字符串 // 或者转换为Map Map<String, Object> sourceAsMap = hit.getSourceAsMap(); // 处理高亮 Map<String, HighlightField> highlightFields = hit.getHighlightFields(); HighlightField highlightField = highlightFields.get("fieldName"); if (highlightField != null) { Text[] fragments = highlightField.fragments(); String highlightedFragment = fragments[0].string(); } } ``` ### 注意事项 - 在Elasticsearch 7.x及以上版本,类型(type)的概念已被废弃,因此在创建SearchRequest时不应再设置类型。 - 使用RestHighLevelClient需要先配置并注入,如引用[4]中所示。 ### 完整示例 以下是个完整的示例,假设我们要在索引"posts"中搜索所有文档,并分页显示前10条,同时高亮"title"字段: ```java // 创建SearchRequest,指定索引 SearchRequest searchRequest = new SearchRequest("posts"); // 构建SearchSourceBuilder SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(QueryBuilders.matchAllQuery()); // 匹配所有文档 sourceBuilder.from(0); sourceBuilder.size(10); // 设置高亮 HighlightBuilder highlightBuilder = new HighlightBuilder(); highlightBuilder.field("title"); // 高亮title字段 highlightBuilder.preTags(""<em>); highlightBuilder.postTags("</em>"); sourceBuilder.highlighter(highlightBuilder); // 将sourceBuilder设置到searchRequest searchRequest.source(sourceBuilder); // 执行搜索 RestHighLevelClient client = ... // 获取RestHighLevelClient实例 SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); // 处理结果 SearchHits hits = response.getHits(); for (SearchHit hit : hits.getHits()) { // 获取源数据 String id = hit.getId(); Map<String, Object> source = hit.getSourceAsMap(); // 获取高亮 Map<String, HighlightField> highlightFields = hit.getHighlightFields(); HighlightField titleHighlight = highlightFields.get("title"); if (titleHighlight != null) { // 取第个高亮片段(如果有多个片段,这里根据实际情况处理) String highlightedTitle = titleHighlight.getFragments()[0].string(); // 可以用高亮文本替换原始文本 source.put("title", highlightedTitle); } // 处理文档... } ``` ### 总结 SearchRequest是Elasticsearch Java客户端中执行搜索的核心类,通过配合SearchSourceBuilder可以构建复杂的搜索请求。掌握其基本使用方法和常见配置(如查询、分页、排序、高亮、聚合)是使用Elasticsearch的基础[^1][^2][^3]。 §§相关问题§§ 1. 如何在Elasticsearch Java客户端中设置多个索引的搜索? 2. 如何构建不同类型的查询(如match、term、range等)? 3. 如何处理Elasticsearch搜索返回结果中的聚合数据? 4. 在Elasticsearch 8.x中,SearchRequest的用法有哪些变化? </think> ### Elasticsearch Java中SearchRequest使用指南 #### 1. **基础使用流程** ```java // 创建SearchRequest对象 SearchRequest searchRequest = new SearchRequest("your_index"); // 指定索引名 // 创建SearchSourceBuilder构建搜索条件 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(QueryBuilders.matchQuery("field_name", "search_keyword")); // 设置查询条件 // 将SearchSourceBuilder附加到SearchRequest searchRequest.source(sourceBuilder); // 执行搜索(需已配置RestHighLevelClient) SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); ``` #### 2. **关键配置项** | **配置项** | **方法示例** | **说明** | |------------------|--------------------------------------------------|----------------------------| | 索引设置 | `searchRequest.indices("index1", "index2")` | 多索引搜索[^3] | | 查询条件 | `sourceBuilder.query(QueryBuilders.termQuery(...))` | 支持match/term/range等查询[^1] | | 分页控制 | `sourceBuilder.from(0).size(10)` | 从第0条开始取10条结果 | | 高亮显示 | `sourceBuilder.highlighter(new HighlightBuilder().field("title"))` | 关键词高亮[^3] | | 聚合分析 | `sourceBuilder.aggregation(AggregationBuilders.avg("avg_price").field("price"))` | 数据统计分析 | #### 3. **完整示例代码** ```java // 创建请求对象 SearchRequest request = new SearchRequest("products"); request.types("doc"); // 类型(ES7+可选) // 构建查询条件 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(QueryBuilders.boolQuery() .must(QueryBuilders.matchQuery("name", "phone")) .filter(QueryBuilders.rangeQuery("price").gte(1000)) ); sourceBuilder.highlighter(new HighlightBuilder().field("name").preTags("<b>").postTags("</b>")); sourceBuilder.aggregation(AggregationBuilders.terms("brand_agg").field("brand")); // 执行查询 request.source(sourceBuilder); SearchResponse response = client.search(request, RequestOptions.DEFAULT); // 处理结果 SearchHits hits = response.getHits(); for (SearchHit hit : hits) { Map<String, Object> source = hit.getSourceAsMap(); HighlightField nameField = hit.getHighlightFields().get("name"); // 业务处理... } ``` #### 4. **注意事项** 1. **类型弃用**:ES 7.x+ 已弃用`types()`方法,建议直接使用索引名[^3] 2. **连接配置**:需提前配置`RestHighLevelClient`(参考引用[4]) 3. **异步查询**:使用`client.searchAsync()`实现非阻塞调用 4. **结果解析**:通过`SearchResponse.getHits()`获取匹配文档,`getAggregations()`获取聚合结果 > 提示:对于复杂查询,建议使用`BoolQueryBuilder`组合多个查询条件,并通过`must`/`should`/`filter`控制逻辑关系[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值