ElasticSearch 实战:Java操作ElasticSearch执行查询

在 Java 中使用 Elasticsearch 进行查询操作,您可以利用 Elasticsearch Java High Level REST Client。以下是一个使用 Java 执行基本查询的实战示例:

准备工作

确保已导入相关依赖。如果您使用 Maven,添加以下依赖到 pom.xml 文件中:

<dependencies>
    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-high-level-client</artifactId>
        <version>最新稳定版</version> <!-- 替换为实际使用的 Elasticsearch 版本对应的客户端版本 -->
    </dependency>
</dependencies>

配置 Elasticsearch 客户端

创建一个 RestHighLevelClient 实例,配置连接参数:

import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;

// ...

RestHighLevelClient client = new RestHighLevelClient(
    RestClient.builder(
        new HttpHost("your_elasticsearch_host", 9200, "http"), // 替换为您的 Elasticsearch 主机地址、端口和协议
        new HttpHost("your_elasticsearch_host", 9201, "http") // 如果有多个节点,可以添加更多 HttpHost
    )
);

执行查询操作

假设您有一个名为 books 的索引,其中包含文档结构如下:

{
  "title": "The Catcher in the Rye",
  "author": "J.D. Salinger",
  "year": 1951,
  "genre": ["Fiction", "Literary Fiction"]
}

以下是如何使用 Java 执行基本查询的示例:

匹配查询(Match Query)

查找标题包含 “Catcher” 的书籍:

import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;

// ...

SearchRequest searchRequest = new SearchRequest("books");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

searchSourceBuilder.query(QueryBuilders.matchQuery("title", "Catcher"));

searchRequest.source(searchSourceBuilder);

SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

searchResponse.getHits().forEach(hit -> {
    String title = hit.getSourceAsMap().get("title").toString();
    String author = hit.getSourceAsMap().get("author").toString();
    int year = (int) hit.getSourceAsMap().get("year");

    System.out.printf("Title: %s, Author: %s, Year: %d%n", title, author, year);
});
过滤查询(Filter Query)

查找出版于 1950 年之后的文学小说:

import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.RangeQueryBuilder;

// ...

BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
    .filter(new RangeQueryBuilder("year").gte(1950))
    .filter(QueryBuilders.termQuery("genre", "Literary Fiction"));

searchSourceBuilder.query(boolQueryBuilder);

// ...(后续步骤同上,执行搜索请求并处理响应)
复合查询(Compound Queries)

查找标题包含 “Catcher”,同时出版于 1950 年之后的文学小说:

// ...(使用上例中的 boolQueryBuilder)

boolQueryBuilder.must(QueryBuilders.matchQuery("title", "Catcher"));

// ...(后续步骤同上,执行搜索请求并处理响应)

关闭客户端

在完成所有操作后,记得关闭客户端以释放资源:

client.close();

以上示例展示了如何使用 Elasticsearch Java High Level REST Client 执行基本的查询操作。实际应用中,您可以根据需要组合不同的查询类型(如 match, term, range, bool 等),构建复杂的查询逻辑。请确保处理可能出现的异常,并遵循良好的编程实践。对于生产环境,请遵循最佳安全实践,如使用身份验证、授权和 SSL/TLS 加密。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值