Java连接Elasticsearch实战指南

Elasticsearch是一个分布式、 RESTful风格、基于Lucene的全文搜索和分析引擎。它可以用于各种用例,例如网站搜索、日志分析、安全情报等。

由于其性能出色和易于使用的API,越来越多的企业选择使用Elasticsearch作为其搜索引擎。

一、连接Elasticsearch

连接Elasticsearch可以使用Java的TransportClient或Java High-Level REST Client两种方式。

1、TransportClient

TransportClient是Elasticsearch提供的Java API,使用它可以直接连接到Elasticsearch服务。下面是一个使用TransportClient连接Elasticsearch的示例:

TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
        .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));

创建TransportClient实例时需要指定连接的地址和端口号。这里我们可以使用默认的Settings和本地的9300端口。

2、Java High-Level REST Client

Java High-Level REST Client是Elasticsearch推荐的Java客户端,它使用HTTP协议与Elasticsearch进行通信。下面是一个使用Java High-Level REST Client连接Elasticsearch的示例:

RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));

通过HTTP Host和端口号创建RestHighLevelClient实例。这里我们使用本地的9200端口连接http。

二、索引操作

1、创建索引

创建索引需要指定索引名称和索引映射。下面是一个创建名为“my_index”的索引的示例:

CreateIndexRequest request = new CreateIndexRequest("my_index");
request.mapping("doc", "field1", "type=string", "field2", "type=integer");
CreateIndexResponse response = client.indices().create(request);

创建CreateIndexRequest对象并指定索引名称“my_index”,然后通过mapping()方法设定属性。最后通过indices()方法的create()方法创建索引。

2、添加文档

添加文档需要指定索引名称、类型和文档ID。文档格式一般为JSON,可以通过Map或实体类转换得到。下面是一个添加文档的示例:

IndexRequest request = new IndexRequest("my_index", "doc", "1");
request.source(XContentType.JSON, "field1", "value1", "field2", 2);
IndexResponse response = client.index(request);

添加文档需要指定索引名称、类型和文档ID,然后通过source()方法指定文档内容。通过index()方法添加文档。

3、查询文档

查询文档需要指定查询条件和索引名称,结果一般为SearchResponse对象。下面是一个查询文档的示例:

SearchRequest searchRequest = new SearchRequest("my_index");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.termQuery("field1", "value1"));
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest);

查询文档需要指定查询条件和索引名称,然后通过source()方法设置查询条件。通过search()方法查询文档。

三、聚合操作

1、统计文档数量

统计文档数量可以使用count()方法。下面是一个统计所有文档数量的示例:

CountRequest countRequest = new CountRequest("my_index");
CountResponse countResponse = client.count(countRequest);
long count = countResponse.getCount();

通过CountRequest对象指定索引名称,然后通过count()方法统计文档数量。

2、按条件聚合

聚合操作可以根据条件聚合文档。下面是一个按“field1”字段聚合所有文档的示例:

SearchRequest searchRequest = new SearchRequest("my_index");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.aggregation(AggregationBuilders.terms("by_field1").field("field1"));
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest);
Terms terms = searchResponse.getAggregations().get("by_field1");
for (Terms.Bucket entry : terms.getBuckets()) {
    String key = (String) entry.getKey();
    long docCount = entry.getDocCount();
}

通过AggregationBuilders对象的terms()方法指定聚合条件,结果保存在SearchResponse对象中。通过getAggregations()方法获取所有聚合结果,然后通过get()方法获取指定聚合结果,并使用for循环获取聚合结果中的所有数据。

四、数据分析

1、Term Vectors

Term Vectors可以分析文档中每个单词的词频和位置等信息。下面是一个获取Term Vectors的示例:

TermVectorsRequest request = new TermVectorsRequest("my_index", "doc", "1");
request.setFields("field1");
TermVectorsResponse response = client.termvectors(request);

通过TermVectorsRequest对象指定索引名称、类型和文档ID,然后通过Fields()方法设置需要分析的字段类型。使用termvectors()方法分析文档。

2、多关键字查询

可以使用MultiMatchQuery查询多个关键字。下面是一个查询同时匹配“field1”和“field2”的文档的示例:

SearchRequest searchRequest = new SearchRequest("my_index");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.multiMatchQuery("value1", "field1", "field2"));
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest);

通过QueryBuilders对象的multiMatchQuery()方法指定多个查询字段,然后使用source()方法设置查询条件。使用search()方法查询文档。

3、词条查询

词条查询可以查询特定词条的文档。下面是一个查询“field1”字段包含“value1”的文档的示例:

SearchRequest searchRequest = new SearchRequest("my_index");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.termQuery("field1", "value1"));
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest);

通过QueryBuilders对象的termQuery()方法指定查询字段和关键字,然后使用source()方法设置查询条件。使用search()方法查询文档。

以上是Java连接Elasticsearch的一些常用操作,本文介绍的示例代码可以参考下列完整代码:

完整代码:

TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
        .addTransportAddress(new InetSocketTransportAddress(
                InetAddress.getByName("localhost"), 9300));

//创建索引
CreateIndexRequest request = new CreateIndexRequest("my_index");
request.mapping("doc", "field1", "type=string", "field2", "type=integer");
CreateIndexResponse response = client.indices().create(request);

//添加文档
IndexRequest request = new IndexRequest("my_index", "doc", "1");
request.source(XContentType.JSON, "field1", "value1", "field2", 2);
IndexResponse response = client.index(request);

//查询文档
SearchRequest searchRequest = new SearchRequest("my_index");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.termQuery("field1", "value1"));
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest);

//统计文档数量
CountRequest countRequest = new CountRequest("my_index");
CountResponse countResponse = client.count(countRequest);
long count = countResponse.getCount();

//聚合操作
searchSourceBuilder.aggregation(AggregationBuilders.terms("by_field1").field("field1"));
searchRequest.source(searchSourceBuilder);
searchResponse = client.search(searchRequest);
Terms terms = searchResponse.getAggregations().get("by_field1");
for (Terms.Bucket entry : terms.getBuckets()) {
    String key = (String) entry.getKey();
    long docCount = entry.getDocCount();
}

//Term Vectors
TermVectorsRequest request = new TermVectorsRequest("my_index", "doc", "1");
request.setFields("field1");
TermVectorsResponse response = client.termvectors(request);

//多关键字查询
searchSourceBuilder.query(QueryBuilders.multiMatchQuery("value1", "field1", "field2"));
searchRequest.source(searchSourceBuilder);
searchResponse = client.search(searchRequest);

//词条查询
searchSourceBuilder.query(QueryBuilders.termQuery("field1", "value1"));
searchRequest.source(searchSourceBuilder);
searchResponse = client.search(searchRequest);

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/152206.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-12 00:55
下一篇 2024-11-12 00:55

相关推荐

  • Java JsonPath 效率优化指南

    本篇文章将深入探讨Java JsonPath的效率问题,并提供一些优化方案。 一、JsonPath 简介 JsonPath是一个可用于从JSON数据中获取信息的库。它提供了一种DS…

    编程 2025-04-29
  • java client.getacsresponse 编译报错解决方法

    java client.getacsresponse 编译报错是Java编程过程中常见的错误,常见的原因是代码的语法错误、类库依赖问题和编译环境的配置问题。下面将从多个方面进行分析…

    编程 2025-04-29
  • Java腾讯云音视频对接

    本文旨在从多个方面详细阐述Java腾讯云音视频对接,提供完整的代码示例。 一、腾讯云音视频介绍 腾讯云音视频服务(Cloud Tencent Real-Time Communica…

    编程 2025-04-29
  • 运维Python和GO应用实践指南

    本文将从多个角度详细阐述运维Python和GO的实际应用,包括监控、管理、自动化、部署、持续集成等方面。 一、监控 运维中的监控是保证系统稳定性的重要手段。Python和GO都有强…

    编程 2025-04-29
  • Java Bean加载过程

    Java Bean加载过程涉及到类加载器、反射机制和Java虚拟机的执行过程。在本文中,将从这三个方面详细阐述Java Bean加载的过程。 一、类加载器 类加载器是Java虚拟机…

    编程 2025-04-29
  • Python wordcloud入门指南

    如何在Python中使用wordcloud库生成文字云? 一、安装和导入wordcloud库 在使用wordcloud前,需要保证库已经安装并导入: !pip install wo…

    编程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介绍

    本文将详细介绍Java Milvus SearchParam withoutFields的相关知识和用法。 一、什么是Java Milvus SearchParam without…

    编程 2025-04-29
  • Python应用程序的全面指南

    Python是一种功能强大而简单易学的编程语言,适用于多种应用场景。本篇文章将从多个方面介绍Python如何应用于开发应用程序。 一、Web应用程序 目前,基于Python的Web…

    编程 2025-04-29
  • Python小波分解入门指南

    本文将介绍Python小波分解的概念、基本原理和实现方法,帮助初学者掌握相关技能。 一、小波变换概述 小波分解是一种广泛应用于数字信号处理和图像处理的方法,可以将信号分解成多个具有…

    编程 2025-04-29
  • Python字符转列表指南

    Python是一个极为流行的脚本语言,在数据处理、数据分析、人工智能等领域广泛应用。在很多场景下需要将字符串转换为列表,以便于操作和处理,本篇文章将从多个方面对Python字符转列…

    编程 2025-04-29

发表回复

登录后才能评论