Elasticsearch编程
一、添加职位数据
1、初始化客户端连接
- 使用RestHighLevelClient构建客户端连接。
- 基于RestClient.builder方法来构建RestClientBuilder
- 用HttpHost来添加ES的节点
参考代码:
代码语言:javascript复制private RestHighLevelClient restHighLevelClient;
private static final String JOB_IDX_NAME = "job_idx";
public JobFullTextServiceImpl() {
restHighLevelClient = new RestHighLevelClient(RestClient.builder(
new HttpHost("node1", 9200, "http")
, new HttpHost("node2", 9200, "http")
, new HttpHost("node3", 9200, "http")
));
}
2、实现关闭客户端连接
代码语言:javascript复制@Override
public void close() {
try {
restHighLevelClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
3、编写代码实现新增职位数据
实现步骤:
- 构建IndexRequest对象,用来描述ES发起请求的数据。
- 设置文档ID。
- 使用FastJSON将实体类对象转换为JSON。
- 使用IndexRequest.source方法设置文档数据,并设置请求的数据为JSON格式。
- 使用ES High level client调用index方法发起请求,将一个文档添加到索引中。
参考代码:
代码语言:javascript复制@Override
public void add(JobDetail jobDetail) {
// 1. 构建IndexRequest对象,用来描述ES发起请求的数据。
IndexRequest indexRequest = new IndexRequest(JOB_IDX_NAME);
// 2. 设置文档ID。
indexRequest.id(jobDetail.getId() "");
// 3. 构建一个实体类对象,并使用FastJSON将实体类对象转换为JSON。
String json = JSON.toJSONString(jobDetail);
// 4. 使用IndexRequest.source方法设置请求数据。
indexRequest.source(json);
try {
// 5. 使用ES High level client调用index方法发起请求
restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("索引创建成功!");
}
常见错误:
代码语言:javascript复制java.lang.IllegalArgumentException: The number of object passed must be even but was [1]
at org.elasticsearch.action.index.IndexRequest.source(IndexRequest.java:474)
at org.elasticsearch.action.index.IndexRequest.source(IndexRequest.java:461)
原因:IndexRequest.source要求传递偶数个的参数,但只传递了1个
4、编写测试用例测试添加方法
- 在 test/java 目录中创建一个 cn.it.elasticsearch.service 包。
- 在cn.it.elasticsearch.service 包下创建一个JobFullTextServiceTest类。
- 在@BeforeTest中构建JobFullTextService对象,@AfterTest中调用close方法关闭连接。
- 编写测试用例,构建一个测试用的实体类,测试add方法。
参考代码:
代码语言:javascript复制public class JobFullTextServiceTest {
private JobFullTextService jobFullTextService;
@BeforeTest
public void beforeTest() {
jobFullTextService = new JobFullTextServiceImpl();
}
@Test
public void addTest() {
// 1. 测试新增索引文档
jobFullTextService = new JobFullTextServiceImpl();
JobDetail jobDetail = new JobDetail();
jobDetail.setId(1);
jobDetail.setArea("江苏省-南京市");
jobDetail.setCmp("Elasticsearch大学");
jobDetail.setEdu("本科及以上");
jobDetail.setExp("一年工作经验");
jobDetail.setTitle("大数据工程师");
jobDetail.setJob_type("全职");
jobDetail.setPv("1700次浏览");
jobDetail.setJd("会Hadoop就行");
jobDetail.setSalary("5-9千/月");
jobFullTextService.add(jobDetail);
}
@AfterTest
public void afterTest() {
jobFullTextService.close();
}
}