分散式搜尋Elasticsearch——刪除指定索引
阿新 • • 發佈:2018-12-31
刪除索引的方式很多,這裡列舉三種。
第一種是指定index、type、id執行刪除,示例程式碼如下:
/** * @author Geloin */ package com.gsoft.gsearch.util; import org.elasticsearch.action.get.GetResponse; import org.junit.Test; import com.gsoft.gsearch.BaseTest; import com.gsoft.gsearch.entity.Person; /** * @author Geloin * */ public class DeleteTest extends BaseTest { @Test public void delete() { try { String id = "1234567890"; Person p = new Person(); p.setId(id); p.setAge(20); p.setIsStudent(false); p.setSex("男"); p.setName("張三的車"); String source = ElasticSearchUtil.BeanToJson(p); // 建立索引 client.prepareIndex(index, type, id).setSource(source).execute(); System.out.println("休息6秒鐘,以便建立索引"); Thread.sleep(6000); // Get System.out.println("================================第一次Get"); showById(id); client.prepareDelete(index, type, id).execute(); System.out.println("休息6秒鐘,以便刪除索引"); Thread.sleep(6000); System.out.println("================================第二次Get"); showById(id); } catch (Exception e) { e.printStackTrace(); } finally { if (null != client) { client.close(); } if (null != node) { node.close(); } } } /** * 根據ID查詢,使用Get * * @author Geloin * @param id * @throws Exception */ private void showById(String id) throws Exception { GetResponse response = client.prepareGet(index, type, id).execute() .actionGet(); String json = response.getSourceAsString(); if (null != json) { Person newPerson = mapper.readValue(json, Person.class); System.out.println("id\t\t" + newPerson.getId()); System.out.println("name\t\t" + newPerson.getName()); System.out.println("sex\t\t" + newPerson.getSex()); System.out.println("age\t\t" + newPerson.getAge()); System.out.println("isStudent\t\t" + newPerson.getIsStudent()); } else { log.info("未查詢到任何結果!"); } } }
第二種則使用Bulk執行批量操作,程式碼如下所示:
/** * @author Geloin */ package com.gsoft.gsearch.util; import org.elasticsearch.action.bulk.BulkRequestBuilder; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.junit.Test; import com.gsoft.gsearch.BaseTest; import com.gsoft.gsearch.entity.Person; /** * @author Geloin * */ public class BulkDeleteTest extends BaseTest { @Test public void delete() { try { String id = "1234567890"; BulkRequestBuilder builder1 = client.prepareBulk(); for (int i = 0; i < 5; i++) { String myId = id + "_" + i; Person p = new Person(); p.setId(myId); p.setAge(20); p.setIsStudent(false); p.setSex("男"); p.setName("張三的車"); String source = ElasticSearchUtil.BeanToJson(p); // 建立索引 builder1.add(client.prepareIndex(index, type, myId) .setSource(source).request()); } builder1.execute(); System.out.println("休息6秒鐘,以便建立索引"); Thread.sleep(6000); // Get System.out.println("================================第一次查詢"); query(); BulkRequestBuilder builder = client.prepareBulk(); for (int i = 0; i < 5; i++) { String myId = id + "_" + i; builder.add(client.prepareDelete(index, type, myId) .request()); } builder.execute(); System.out.println("休息6秒鐘,以便刪除索引"); Thread.sleep(6000); System.out.println("================================第二次查詢"); query(); } catch (Exception e) { e.printStackTrace(); } finally { if (null != client) { client.close(); } if (null != node) { node.close(); } } } private void query() throws Exception { // 檢索 QueryBuilder qb = QueryBuilders.matchPhraseQuery("name", "張三的車"); SearchResponse searchResponse = client.prepareSearch(index) .setTypes(type).setQuery(qb).setFrom(0).setSize(12).execute() .actionGet(); SearchHits hits = searchResponse.getHits(); if (null == hits || hits.totalHits() == 0) { log.error("使用\"張三的車\"沒有查詢到任何結果!"); } else { for (SearchHit hit : hits) { String json = hit.getSourceAsString(); Person newPerson = mapper.readValue(json, Person.class); System.out.println("id\t\t" + newPerson.getId()); System.out.println("name\t\t" + newPerson.getName()); System.out.println("sex\t\t" + newPerson.getSex()); System.out.println("age\t\t" + newPerson.getAge()); System.out.println("isStudent\t\t" + newPerson.getIsStudent()); System.out .println("+++++++++++++++++++++++++++++++++++++++++++++++++++"); } } } }
第一二種方案,要求你先知道要刪除的索引的ID後,方可執行刪除,這種方案的侷限性較大。
第三種方案則較簡單,即根據條件刪除匹配的索引,如下所示:
QueryBuilder qb = QueryBuilders.matchAllQuery();
client.prepareDeleteByQuery(indeices).setQuery(qb).execute();