Java API 操作ES
- Java API 操作ES
- POM依賴
- 創建Bean
- 定義操作資料介面
- 介面實作類API
Java API 操作ES
POM依賴
<repositories><!-- 代碼庫 -->
<repository>
<id>aliyun</id>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
<updatePolicy>never</updatePolicy>
</snapshots>
</repository>
<repository>
<id>elastic.co</id>
<url>https://artifacts.elastic.co/maven</url>
</repository>
</repositories>
<dependencies>
<!-- ES的高階的客戶端API -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.6.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.1</version>
</dependency>
<!-- 阿里巴巴出品的一款將Java物件轉換為JSON、將JSON轉換為Java物件的庫 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
<scope>test</scope>
</dependency>
<!-- ES SQL驅動 -->
<dependency>
<groupId>org.elasticsearch.plugin</groupId>
<artifactId>x-pack-sql-jdbc</artifactId>
<version>7.6.1</version>
</dependency>
</dependencies>
創建Bean
public class JobDetail {
@JSONField(serialize = false)
private long id;
private String area;
private String exp;
private String edu;
private String salary;
private String job_type;
private String cmp;
private String pv;
private String title;
private String jd;
private int age;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getArea() {
return area;
}
public void setArea(String area) {
this.area = area;
}
public String getExp() {
return exp;
}
public void setExp(String exp) {
this.exp = exp;
}
public String getEdu() {
return edu;
}
public void setEdu(String edu) {
this.edu = edu;
}
public String getSalary() {
return salary;
}
public void setSalary(String salary) {
this.salary = salary;
}
public String getJob_type() {
return job_type;
}
public void setJob_type(String job_type) {
this.job_type = job_type;
}
public String getCmp() {
return cmp;
}
public void setCmp(String cmp) {
this.cmp = cmp;
}
public String getPv() {
return pv;
}
public void setPv(String pv) {
this.pv = pv;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getJd() {
return jd;
}
public void setJd(String jd) {
this.jd = jd;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
// 使用FastJSON將一個物件直接轉換為JSON字串
return id + ":" + JSONObject.toJSONString(this);
}
}
定義操作資料介面
public interface JobFullTextService {
// 添加一個職位資料
void add(JobDetail jobDetail) throws IOException;
// 根據ID檢索指定職位資料
JobDetail findById(long id) throws IOException;
// 修改職位薪資
void update(JobDetail jobDetail) throws IOException;
// 根據ID洗掉指定位置資料
void deleteById(long id) throws IOException;
// 根據關鍵字檢索資料
List<JobDetail> searchByKeywords(String keywords) throws IOException;
// 分頁檢索
Map<String, Object> searchByPage(String keywords, int pageNum, int pageSize) throws IOException;
// scroll分頁解決深分頁問題
Map<String, Object> searchByScrollPage(String keywords, String scrollId, int pageSize) throws IOException;
// 關閉ES連接
void close() throws IOException;
}
介面實作類API
public class JobFullTextServiceImpl implements JobFullTextService {
private RestHighLevelClient restHighLevelClient;
// 索引庫的名字
private static final String JOB_IDX = "job_index";
public JobFullTextServiceImpl() {
// 建立與ES的連接
// 1. 使用RestHighLevelClient構建客戶端連接,
// 2. 基于RestClient.builder方法來構建RestClientBuilder
// 3. 用HttpHost來添加ES的節點
RestClientBuilder restClientBuilder = RestClient.builder(
new HttpHost("192.168.21.130", 9200, "http")
, new HttpHost("192.168.21.131", 9200, "http")
, new HttpHost("192.168.21.132", 9200, "http"));
/* RestClientBuilder restClientBuilder = RestClient.builder(
new HttpHost("192.168.21.130", 9200, "http"));*/
restHighLevelClient = new RestHighLevelClient(restClientBuilder);
}
@Override
public void add(JobDetail jobDetail) throws IOException {
//1. 構建IndexRequest物件,用來描述ES發起請求的資料,
IndexRequest indexRequest = new IndexRequest(JOB_IDX);
//2. 設定檔案ID,
indexRequest.id(jobDetail.getId() + "");
//3. 使用FastJSON將物體類物件轉換為JSON,
String json = JSONObject.toJSONString(jobDetail);
//4. 使用IndexRequest.source方法設定檔案資料,并設定請求的資料為JSON格式,
indexRequest.source(json, XContentType.JSON);
//5. 使用ES High level client呼叫index方法發起請求,將一個檔案添加到索引中,
restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
}
@Override
public JobDetail findById(long id) throws IOException {
// 1. 構建GetRequest請求,
GetRequest getRequest = new GetRequest(JOB_IDX, id + "");
// 2. 使用RestHighLevelClient.get發送GetRequest請求,并獲取到ES服務器的回應,
GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
// 3. 將ES回應的資料轉換為JSON字串
String json = getResponse.getSourceAsString();
// 4. 并使用FastJSON將JSON字串轉換為JobDetail類物件
JobDetail jobDetail = JSONObject.parseObject(json, JobDetail.class);
// 5. 記得:單獨設定ID
jobDetail.setId(id);
return jobDetail;
}
@Override
public void update(JobDetail jobDetail) throws IOException {
// 1. 判斷對應ID的檔案是否存在
// a) 構建GetRequest
GetRequest getRequest = new GetRequest(JOB_IDX, jobDetail.getId() + "");
// b) 執行client的exists方法,發起請求,判斷是否存在
boolean exists = restHighLevelClient.exists(getRequest, RequestOptions.DEFAULT);
if(exists) {
// 2. 構建UpdateRequest請求
UpdateRequest updateRequest = new UpdateRequest(JOB_IDX, jobDetail.getId() + "");
// 3. 設定UpdateRequest的檔案,并配置為JSON格式
updateRequest.doc(JSONObject.toJSONString(jobDetail), XContentType.JSON);
// 4. 執行client發起update請求
restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
}
}
@Override
public void deleteById(long id) throws IOException {
// 1. 構建delete請求
DeleteRequest deleteRequest = new DeleteRequest(JOB_IDX, id + "");
// 2. 使用RestHighLevelClient執行delete請求
restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
}
@Override
public List<JobDetail> searchByKeywords(String keywords) throws IOException {
// 1.構建SearchRequest檢索請求
// 專門用來進行全文檢索、關鍵字檢索的API
SearchRequest searchRequest = new SearchRequest(JOB_IDX);
// 2.創建一個SearchSourceBuilder專門用于構建查詢條件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// 3.使用QueryBuilders.multiMatchQuery構建一個查詢條件(搜索title、jd),并配置到SearchSourceBuilder
MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(keywords, "title", "jd");
// 將查詢條件設定到查詢請求構建器中
searchSourceBuilder.query(multiMatchQueryBuilder);
// 4.呼叫SearchRequest.source將查詢條件設定到檢索請求
searchRequest.source(searchSourceBuilder);
// 5.執行RestHighLevelClient.search發起請求
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHit[] hitArray = searchResponse.getHits().getHits();
// 6.遍歷結果
ArrayList<JobDetail> jobDetailArrayList = new ArrayList<>();
for (SearchHit documentFields : hitArray) {
// 1)獲取命中的結果
String json = documentFields.getSourceAsString();
// 2)將JSON字串轉換為物件
JobDetail jobDetail = JSONObject.parseObject(json, JobDetail.class);
// 3)使用SearchHit.getId設定檔案ID
jobDetail.setId(Long.parseLong(documentFields.getId()));
jobDetailArrayList.add(jobDetail);
}
return jobDetailArrayList;
}
@Override
public Map<String, Object> searchByPage(String keywords, int pageNum, int pageSize) throws IOException {
// 1.構建SearchRequest檢索請求
// 專門用來進行全文檢索、關鍵字檢索的API
SearchRequest searchRequest = new SearchRequest(JOB_IDX);
// 2.創建一個SearchSourceBuilder專門用于構建查詢條件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// 3.使用QueryBuilders.multiMatchQuery構建一個查詢條件(搜索title、jd),并配置到SearchSourceBuilder
MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(keywords, "title", "jd");
// 將查詢條件設定到查詢請求構建器中
searchSourceBuilder.query(multiMatchQueryBuilder);
// 每頁顯示多少條
searchSourceBuilder.size(pageSize);
// 設定從第幾條開始查詢
searchSourceBuilder.from((pageNum - 1) * pageSize);
// 4.呼叫SearchRequest.source將查詢條件設定到檢索請求
searchRequest.source(searchSourceBuilder);
// 5.執行RestHighLevelClient.search發起請求
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHit[] hitArray = searchResponse.getHits().getHits();
// 6.遍歷結果
ArrayList<JobDetail> jobDetailArrayList = new ArrayList<>();
for (SearchHit documentFields : hitArray) {
// 1)獲取命中的結果
String json = documentFields.getSourceAsString();
// 2)將JSON字串轉換為物件
JobDetail jobDetail = JSONObject.parseObject(json, JobDetail.class);
// 3)使用SearchHit.getId設定檔案ID
jobDetail.setId(Long.parseLong(documentFields.getId()));
jobDetailArrayList.add(jobDetail);
}
// 8. 將結果封裝到Map結構中(帶有分頁資訊)
// a) total -> 使用SearchHits.getTotalHits().value獲取到所有的記錄數
// b) content -> 當前分頁中的資料
long totalNum = searchResponse.getHits().getTotalHits().value;
HashMap hashMap = new HashMap();
hashMap.put("total", totalNum);
hashMap.put("content", jobDetailArrayList);
return hashMap;
}
@Override
public Map<String, Object> searchByScrollPage(String keywords, String scrollId, int pageSize) throws IOException {
SearchResponse searchResponse = null;
if(scrollId == null) {
// 1.構建SearchRequest檢索請求
// 專門用來進行全文檢索、關鍵字檢索的API
SearchRequest searchRequest = new SearchRequest(JOB_IDX);
// 2.創建一個SearchSourceBuilder專門用于構建查詢條件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// 3.使用QueryBuilders.multiMatchQuery構建一個查詢條件(搜索title、jd),并配置到SearchSourceBuilder
MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(keywords, "title", "jd");
// 將查詢條件設定到查詢請求構建器中
searchSourceBuilder.query(multiMatchQueryBuilder);
// 設定高亮
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.field("title");
highlightBuilder.field("jd");
highlightBuilder.preTags("<font color='red'>");
highlightBuilder.postTags("</font>");
// 給請求設定高亮
searchSourceBuilder.highlighter(highlightBuilder);
// 每頁顯示多少條
searchSourceBuilder.size(pageSize);
// 4.呼叫SearchRequest.source將查詢條件設定到檢索請求
searchRequest.source(searchSourceBuilder);
//--------------------------
// 設定scroll查詢
//--------------------------
searchRequest.scroll(TimeValue.timeValueMinutes(5));
// 5.執行RestHighLevelClient.search發起請求
searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
}
// 第二次查詢的時候,直接通過scroll id查詢資料
else {
SearchScrollRequest searchScrollRequest = new SearchScrollRequest(scrollId);
searchScrollRequest.scroll(TimeValue.timeValueMinutes(5));
// 使用RestHighLevelClient發送scroll請求
searchResponse = restHighLevelClient.scroll(searchScrollRequest, RequestOptions.DEFAULT);
}
//--------------------------
// 迭代ES回應的資料
//--------------------------
SearchHit[] hitArray = searchResponse.getHits().getHits();
// 6.遍歷結果
ArrayList<JobDetail> jobDetailArrayList = new ArrayList<>();
for (SearchHit documentFields : hitArray) {
// 1)獲取命中的結果
String json = documentFields.getSourceAsString();
// 2)將JSON字串轉換為物件
JobDetail jobDetail = JSONObject.parseObject(json, JobDetail.class);
// 3)使用SearchHit.getId設定檔案ID
jobDetail.setId(Long.parseLong(documentFields.getId()));
jobDetailArrayList.add(jobDetail);
// 設定高亮的一些文本到物體類中
// 封裝了高亮
Map<String, HighlightField> highlightFieldMap = documentFields.getHighlightFields();
HighlightField titleHL = highlightFieldMap.get("title");
HighlightField jdHL = highlightFieldMap.get("jd");
if(titleHL != null) {
// 獲取指定欄位的高亮片段
Text[] fragments = titleHL.getFragments();
// 將這些高亮片段拼接成一個完整的高亮欄位
StringBuilder builder = new StringBuilder();
for(Text text : fragments) {
builder.append(text);
}
// 設定到物體類中
jobDetail.setTitle(builder.toString());
}
if(jdHL != null) {
// 獲取指定欄位的高亮片段
Text[] fragments = jdHL.getFragments();
// 將這些高亮片段拼接成一個完整的高亮欄位
StringBuilder builder = new StringBuilder();
for(Text text : fragments) {
builder.append(text);
}
// 設定到物體類中
jobDetail.setJd(builder.toString());
}
}
// 8. 將結果封裝到Map結構中(帶有分頁資訊)
// a) total -> 使用SearchHits.getTotalHits().value獲取到所有的記錄數
// b) content -> 當前分頁中的資料
long totalNum = searchResponse.getHits().getTotalHits().value;
HashMap hashMap = new HashMap();
hashMap.put("scroll_id", searchResponse.getScrollId());
hashMap.put("content", jobDetailArrayList);
return hashMap;
}
@Override
public void close() throws IOException {
restHighLevelClient.close();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/294664.html
標籤:其他
上一篇:RabbitMQ
