在 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 加密。