1. 程式人生 > >分散式搜尋Elasticsearch——刪除指定索引

分散式搜尋Elasticsearch——刪除指定索引

      刪除索引的方式很多,這裡列舉種。

      第一種是指定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();