单元测试之 elastic search

今日写elastic search 第三方组件相关的单元测试遇到了比较大麻烦,也花了很长时间通过单元测试与代码覆盖率指标。博主测试框架用的是mockito,难点在于需要屏蔽第三方依赖自己构造ES的返回SearchResponse 对象,直接用json赋值SearchResponse 是走不通的,只能通过内部API来赋值创建。废话不多说,直接上干货

  1. 使用ES REST API获取你要封装的Response对象,注意后面typed_keys是必须的,否则无法解析拿到的json。(至于原因,请移步官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html#/return-agg-type
    https://xxx:xx/index_name/_search?typed_keys
    
  2. 解析JSON
// 步骤1得到的json
 String json= "{"a":2}";
 SearchResponse searchResponse2 =
            SearchResponse.fromXContent(new JsonXContentParser(getDefaultNamedXContentRegistry(),
                null, new JsonFactory().createParser(json)));
  private List<NamedXContentRegistry.Entry> getDefaultNamedXContents() {
   
  // 解析es返回的字段,其中不需要的可以自行删除
        Map<String, ContextParser<Object, ? extends Aggregation>> map = new HashMap<>();
        map.put("cardinality", (p, c) -> ParsedCardinality.fromXContent(p, (String) c));
        map.put("hdr_percentiles", (p, c) -> ParsedHDRPercentiles.fromXContent(p, (String) c));
        map.put("hdr_percentile_ranks", (p, c) -> ParsedHDRPercentileRanks.fromXContent(p, (String) c));
        map.put("tdigest_percentiles", (p, c) -> ParsedTDigestPercentiles.fromXContent(p, (String) c));
        map.put("tdigest_percentile_ranks", (p, c) -> ParsedTDigestPercentileRanks.fromXContent(p, (String) c));
        map.put("percentiles_bucket", (p, c) -> ParsedPercentilesBucket.fromXContent(p, (String) c));
        map.put("min", (p, c) -> ParsedMin.fromXContent(p, (String) c));
        map.put("max", (p, c) -> ParsedMax.fromXContent(p, (String) c));
        map.put("sum", (p, c) -> ParsedSum.fromXContent(p, (String) c)
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 要写一个 Java 工具来操作 Elasticsearch,可以使用官方提供的 Java API。 首先需要导入相关的依赖,在 Maven 中可以在 pom.xml 文件中加入如下内容: ``` <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.10.0</version> </dependency> ``` 然后就可以使用 Java API 来操作 Elasticsearch 了。以下是一个简单的示例,用来连接到 Elasticsearch 并执行一次搜索操作: ``` import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.index.query.MatchAllQueryBuilder; import org.elasticsearch.search.builder.SearchSourceBuilder; public class EsExample { public static void main(String[] args) throws Exception { RestHighLevelClient client = new RestHighLevelClient( RestClient.builder( new HttpHost("localhost", 9200, "http") ) ); SearchRequest searchRequest = new SearchRequest("my_index"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(new MatchAllQueryBuilder()); searchRequest.source(searchSourceBuilder); SearchResponse searchResponse = client.search(searchRequest); System.out.println(searchResponse); client.close(); } } ``` 这只是一个简单的示例,实际使用中可以根据需要调整更多的参数和执行更复杂的操作。 ### 回答2: ES(Elasticsearch)是一个开源的分布式、高性能的搜索和分析引擎,常用于存储和检索大量的结构化和非结构化数据。下面是一个用Java编写的ES工具的示例: ```java import org.apache.http.HttpHost; import org.elasticsearch.action.admin.indices.create.CreateIndexRequest; import org.elasticsearch.action.admin.indices.create.CreateIndexResponse; import org.elasticsearch.action.delete.DeleteRequest; import org.elasticsearch.action.delete.DeleteResponse; 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.client.RequestOptions; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.builder.SearchSourceBuilder; import java.io.IOException; public class ESUtils { private RestHighLevelClient client; public ESUtils() { client = new RestHighLevelClient( RestClient.builder(new HttpHost("localhost", 9200, "http"))); } public void createIndex(String indexName) throws IOException { CreateIndexRequest request = new CreateIndexRequest(indexName); CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT); if (response.isAcknowledged() && response.isShardsAcknowledged()) { System.out.println("Index created successfully."); } } public void insertDocument(String indexName, String document) throws IOException { IndexRequest request = new IndexRequest(indexName); request.source(document, XContentType.JSON); IndexResponse response = client.index(request, RequestOptions.DEFAULT); if (response.getResult().getLowercase().equals("created")) { System.out.println("Document inserted successfully."); } } public void deleteDocument(String indexName, String id) throws IOException { DeleteRequest request = new DeleteRequest(indexName, id); DeleteResponse response = client.delete(request, RequestOptions.DEFAULT); if (response.getResult().getLowercase().equals("deleted")) { System.out.println("Document deleted successfully."); } } public void searchDocuments(String indexName, String field, String value) throws IOException { SearchRequest request = new SearchRequest(indexName); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(QueryBuilders.matchQuery(field, value)); request.source(sourceBuilder); SearchResponse response = client.search(request, RequestOptions.DEFAULT); for (SearchHit hit : response.getHits().getHits()) { System.out.println(hit.getSourceAsString()); } } public void closeClient() throws IOException { client.close(); System.out.println("Client closed."); } public static void main(String[] args) throws IOException { ESUtils esUtils = new ESUtils(); esUtils.createIndex("my_index"); esUtils.insertDocument("my_index", "{\"name\":\"John Doe\",\"age\":30}"); esUtils.searchDocuments("my_index", "name", "John"); esUtils.deleteDocument("my_index", "1"); esUtils.closeClient(); } } ``` 以上代码是一个简单的ES工具,提供了创建索引、插入文档、删除文档和搜索文档的功能。使用RestHighLevelClient来与ES进行交互,通过HTTP进行通信。可以根据需要进行扩展和修改,实现更多的ES操作功能。 ### 回答3: Java写一个ES工具可以使用ElasticsearchJava客户端来实现。Elasticsearch是一个开源的分布式搜索引擎,提供了丰富的RESTful API接口,可以用于构建高性能的搜索功能。 首先,需要引入ElasticsearchJava客户端依赖,可以在Maven或者Gradle中添加相应的依赖项。然后,创建一个ES工具类,用于封装与Elasticsearch的交互逻辑。 在工具类中,可以实现一些常用的操作方法,例如索引文档、更新文档、删除文档、搜索文档等。这些方法可以通过调用Elasticsearch Java客户端提供的API来实现。 例如,可以使用TransportClient来与Elasticsearch集群建立连接,并通过API来执行相关操作。假设要实现一个索引文档的方法,可以按照以下步骤: 1. 创建一个TransportClient对象,并指定连接的Elasticsearch集群的地址和端口。 2. 创建一个IndexRequest对象,设置要索引的文档内容。 3. 调用TransportClient的index方法,传入IndexRequest对象,来执行索引操作。 4. 根据返回结果判断操作是否成功,并进行相应的处理。 类似地,可以实现其他操作方法,根据具体需求调用相应的API即可。在使用工具类时,可以根据具体的业务需求来调用相应的方法,实现对Elasticsearch的操作。 需要注意的是,在使用ES工具时,应该合理处理异常情况,并需要保证ES集群的数据一致性和安全性。此外,还可以对ES工具进行扩展,根据实际需求添加其他功能,例如分页查询、聚合操作等。 总之,通过使用ElasticsearchJava客户端,结合具体的业务需求,可以编写一个实用的ES工具,用于方便地与Elasticsearch集群进行交互操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值