Java对接ES
Elasticsearch(简称ES)是一个基于Lucene的开源搜索引擎,它提供了一个分布式、多租户的全文搜索引擎。在实际开发中,我们经常需要使用Java对接ES进行数据的索引、搜索和分析。本文将介绍如何使用Java对接ES,并给出相应的代码示例。
准备工作
在开始之前,我们需要确保以下几个条件已经满足:
- 安装并启动ES服务器。
- 引入Java客户端库,如Elasticsearch High Level Rest Client。
- 确定要连接的ES服务器地址和端口号。
连接ES服务器
首先,我们需要建立与ES服务器的连接。可以使用ES提供的Java客户端库来实现,以下是一个连接ES服务器的示例代码:
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
public class ESClient {
private RestHighLevelClient client;
public ESClient(String host, int port) {
client = new RestHighLevelClient(
RestClient.builder(new HttpHost(host, port, "http")));
}
public RestHighLevelClient getClient() {
return client;
}
public void close() throws IOException {
client.close();
}
}
索引数据
一旦与ES服务器建立连接,我们就可以进行数据的索引操作了。首先,我们需要定义一个索引和索引中的字段。以下是一个定义索引和字段的示例代码:
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.mapper.ObjectMapper;
public class ESIndex {
private final RestHighLevelClient client;
public ESIndex(RestHighLevelClient client) {
this.client = client;
}
public void createIndex(String indexName, String typeName) throws IOException {
CreateIndexRequest request = new CreateIndexRequest(indexName);
request.mapping(typeName, getMapping());
CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
if (response.isAcknowledged()) {
System.out.println("Index created");
} else {
System.out.println("Index creation failed");
}
}
private XContentBuilder getMapping() throws IOException {
XContentBuilder builder = XContentFactory.jsonBuilder();
builder.startObject();
{
builder.startObject("properties");
{
builder.startObject("title");
{
builder.field("type", "text");
}
builder.endObject();
}
builder.endObject();
}
builder.endObject();
return builder;
}
}
搜索数据
一旦数据被索引到ES服务器中,我们就可以通过搜索来查询数据了。以下是一个搜索数据的示例代码:
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
public class ESSearch {
private final RestHighLevelClient client;
public ESSearch(RestHighLevelClient client) {
this.client = client;
}
public SearchResponse search(String indexName, String keyword) throws IOException {
SearchRequest request = new SearchRequest(indexName);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchQuery("title", keyword));
sourceBuilder.timeout(TimeValue.timeValueSeconds(30));
sourceBuilder.from(0);
sourceBuilder.size(10);
sourceBuilder.sort("_score", SortOrder.DESC);
request.source(sourceBuilder);
return client.search(request, RequestOptions.DEFAULT);
}
}
使用示例
现在我们可以使用以上代码进行数据的索引和搜索操作了,以下是一个完整的示例代码:
public class Main {
public static void main(String[] args) {
ESClient esClient = new ESClient("localhost", 9200);
ESIndex esIndex = new ESIndex(esClient.getClient());
ESSearch esSearch = new ESSearch(esClient.getClient());
try {
// 创建索引
esIndex.createIndex("my_index", "my_type");
// 索引数据
// ...
// 搜索数据
SearchResponse response = esSearch.search("my_index", "keyword");
// 处理搜索结果
// ...
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
esClient.close();
}