|
@@ -0,0 +1,451 @@
|
|
|
+package com.elab.es.data;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
+import com.elab.core.utils.DateUtils;
|
|
|
+import org.apache.http.HttpHost;
|
|
|
+import org.apache.http.auth.AuthScope;
|
|
|
+import org.apache.http.auth.UsernamePasswordCredentials;
|
|
|
+import org.apache.http.client.CredentialsProvider;
|
|
|
+import org.apache.http.impl.client.BasicCredentialsProvider;
|
|
|
+import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
|
|
|
+import org.elasticsearch.action.DocWriteResponse;
|
|
|
+import org.elasticsearch.action.bulk.BulkItemResponse;
|
|
|
+import org.elasticsearch.action.bulk.BulkRequest;
|
|
|
+import org.elasticsearch.action.bulk.BulkResponse;
|
|
|
+import org.elasticsearch.action.delete.DeleteRequest;
|
|
|
+import org.elasticsearch.action.delete.DeleteResponse;
|
|
|
+import org.elasticsearch.action.get.GetRequest;
|
|
|
+import org.elasticsearch.action.get.GetResponse;
|
|
|
+import org.elasticsearch.action.get.MultiGetRequest;
|
|
|
+import org.elasticsearch.action.get.MultiGetResponse;
|
|
|
+import org.elasticsearch.action.index.IndexRequest;
|
|
|
+import org.elasticsearch.action.index.IndexResponse;
|
|
|
+import org.elasticsearch.action.search.SearchRequest;
|
|
|
+import org.elasticsearch.action.search.SearchResponse;
|
|
|
+import org.elasticsearch.action.update.UpdateRequest;
|
|
|
+import org.elasticsearch.action.update.UpdateResponse;
|
|
|
+import org.elasticsearch.client.RequestOptions;
|
|
|
+import org.elasticsearch.client.RestClient;
|
|
|
+import org.elasticsearch.client.RestClientBuilder;
|
|
|
+import org.elasticsearch.client.RestHighLevelClient;
|
|
|
+import org.elasticsearch.client.core.TermVectorsRequest;
|
|
|
+import org.elasticsearch.client.core.TermVectorsResponse;
|
|
|
+import org.elasticsearch.common.Strings;
|
|
|
+import org.elasticsearch.common.unit.TimeValue;
|
|
|
+import org.elasticsearch.common.xcontent.XContentBuilder;
|
|
|
+import org.elasticsearch.common.xcontent.XContentFactory;
|
|
|
+import org.elasticsearch.common.xcontent.XContentType;
|
|
|
+import org.elasticsearch.index.query.MatchPhraseQueryBuilder;
|
|
|
+import org.elasticsearch.index.query.QueryBuilders;
|
|
|
+import org.elasticsearch.index.query.TermQueryBuilder;
|
|
|
+import org.elasticsearch.index.reindex.ReindexRequest;
|
|
|
+import org.elasticsearch.index.reindex.UpdateByQueryRequest;
|
|
|
+import org.elasticsearch.rest.RestStatus;
|
|
|
+import org.elasticsearch.search.SearchHit;
|
|
|
+import org.elasticsearch.search.SearchHits;
|
|
|
+import org.elasticsearch.search.builder.SearchSourceBuilder;
|
|
|
+import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
|
|
|
+import org.junit.After;
|
|
|
+import org.junit.Before;
|
|
|
+import org.junit.Test;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+
|
|
|
+import java.io.IOException;
|
|
|
+import java.util.*;
|
|
|
+
|
|
|
+
|
|
|
+ * es基本操作
|
|
|
+ *
|
|
|
+ * @author : liukx
|
|
|
+ * @time : 2019/7/31 - 17:01
|
|
|
+ */
|
|
|
+public class ALiYunRestHighLevelClientTest {
|
|
|
+
|
|
|
+ private Logger logger = LoggerFactory.getLogger(ALiYunRestHighLevelClientTest.class);
|
|
|
+ private RestHighLevelClient client;
|
|
|
+
|
|
|
+
|
|
|
+ private String host = "es-cn-0pp1jc07f001i1t59.public.elasticsearch.aliyuncs.com";
|
|
|
+ private String username = "elastic";
|
|
|
+ private String password = "elab@123";
|
|
|
+
|
|
|
+ private String indexName = "posts";
|
|
|
+
|
|
|
+
|
|
|
+ @Before
|
|
|
+ public void before() {
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
|
|
|
+
|
|
|
+ credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ RestClientBuilder builder = RestClient.builder(new HttpHost(host, 9200))
|
|
|
+ .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
|
|
|
+ @Override
|
|
|
+ public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
|
|
|
+ return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+
|
|
|
+ client = new RestHighLevelClient(builder);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void generateData(String username, String message) throws IOException {
|
|
|
+ IndexRequest request = jsonData(username, message);
|
|
|
+
|
|
|
+ request.timeout(TimeValue.timeValueSeconds(1));
|
|
|
+ IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);
|
|
|
+
|
|
|
+ logger.info(" result : " + indexResponse.toString());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void createData() throws IOException {
|
|
|
+ generateData("周杰伦", "窗外的麻雀,在电线杆上多嘴");
|
|
|
+ generateData("林俊杰", "圈圈圆圆圈圈,天天年年天天的我,深深看你的脸");
|
|
|
+ generateData("潘玮柏", "天天都需要你爱,我的心思由你猜");
|
|
|
+ generateData("周笔畅", "我很想飞,多远都不会累.");
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void indexAPI() throws IOException {
|
|
|
+ IndexRequest request = null;
|
|
|
+
|
|
|
+ request = jsonData("周杰伦", "窗外的麻雀,在电线杆上多嘴。");
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ request.timeout(TimeValue.timeValueSeconds(1));
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);
|
|
|
+
|
|
|
+ logger.info(" result : " + indexResponse.toString());
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ * 根据id获取数据
|
|
|
+ *
|
|
|
+ * @throws IOException
|
|
|
+ */
|
|
|
+ @Test
|
|
|
+ public void getApi() throws IOException {
|
|
|
+ GetRequest request = new GetRequest(
|
|
|
+ indexName,
|
|
|
+ "_doc",
|
|
|
+ "3533216d-2b23-4bd2-a129-7c0ede2ed5b3");
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ GetResponse getResponse = client.get(request, RequestOptions.DEFAULT);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ logger.info("--------" + getResponse.getSource().toString());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void exists() throws IOException {
|
|
|
+ GetRequest getRequest = new GetRequest(
|
|
|
+ indexName,
|
|
|
+ "_doc",
|
|
|
+ "3533216d-2b23-4bd2-a129-7c0ede2ed5b3");
|
|
|
+ getRequest.fetchSourceContext(new FetchSourceContext(false));
|
|
|
+ getRequest.storedFields("_none_");
|
|
|
+ boolean exists = client.exists(getRequest, RequestOptions.DEFAULT);
|
|
|
+ logger.info("result : " + exists);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void delete() throws IOException {
|
|
|
+ DeleteRequest request = new DeleteRequest(
|
|
|
+ indexName,
|
|
|
+ "_doc",
|
|
|
+ "settings");
|
|
|
+ DeleteResponse deleteResponse = client.delete(
|
|
|
+ request, RequestOptions.DEFAULT);
|
|
|
+ RestStatus status = deleteResponse.status();
|
|
|
+
|
|
|
+
|
|
|
+ logger.info(status.toString());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void updateAPI() throws IOException {
|
|
|
+ Map<String, Object> jsonMap = new HashMap<>();
|
|
|
+ jsonMap.put("postDate", new Date());
|
|
|
+ jsonMap.put("user", "daily update");
|
|
|
+ UpdateRequest request = new UpdateRequest(indexName, "_doc", "c9ef49c1-e04b-4d1b-84ef-33ca7004702b")
|
|
|
+ .doc(jsonMap);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ request.version(4);
|
|
|
+ UpdateResponse updateResponse = client.update(
|
|
|
+ request, RequestOptions.DEFAULT);
|
|
|
+ updateResponse.getGetResult();
|
|
|
+ DocWriteResponse.Result result = updateResponse.getResult();
|
|
|
+ if (result == DocWriteResponse.Result.UPDATED) {
|
|
|
+ logger.info("ES 执行了 UPDATE 操作.");
|
|
|
+ }
|
|
|
+ logger.info(" =>> " + updateResponse.toString());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void likeAPI() throws IOException {
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ SearchRequest searchRequest = new SearchRequest(indexName);
|
|
|
+ MatchPhraseQueryBuilder matchPhraseQueryBuilder = QueryBuilders.matchPhraseQuery("message", "我");
|
|
|
+ SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
|
|
|
+ searchSourceBuilder.query(matchPhraseQueryBuilder);
|
|
|
+ searchRequest.source(searchSourceBuilder);
|
|
|
+ List<String> strings = listSearchResult(searchRequest);
|
|
|
+ System.out.println(JSON.toJSONString(strings));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void termVectorsApi() throws IOException {
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ XContentBuilder docBuilder = XContentFactory.jsonBuilder();
|
|
|
+ docBuilder.startObject().field("user", "guest-user").endObject();
|
|
|
+ TermVectorsRequest request = new TermVectorsRequest(indexName,
|
|
|
+ "_doc",
|
|
|
+ docBuilder);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ request.setFieldStatistics(false);
|
|
|
+ request.setTermStatistics(true);
|
|
|
+ request.setPositions(false);
|
|
|
+ request.setOffsets(false);
|
|
|
+ request.setPayloads(false);
|
|
|
+
|
|
|
+ Map<String, Integer> filterSettings = new HashMap<>();
|
|
|
+ filterSettings.put("max_num_terms", 3);
|
|
|
+ filterSettings.put("min_term_freq", 1);
|
|
|
+ filterSettings.put("max_term_freq", 10);
|
|
|
+ filterSettings.put("min_doc_freq", 1);
|
|
|
+ filterSettings.put("max_doc_freq", 100);
|
|
|
+ filterSettings.put("min_word_length", 1);
|
|
|
+ filterSettings.put("max_word_length", 10);
|
|
|
+
|
|
|
+ request.setFilterSettings(filterSettings);
|
|
|
+
|
|
|
+ Map<String, String> perFieldAnalyzer = new HashMap<>();
|
|
|
+ perFieldAnalyzer.put("user", "keyword");
|
|
|
+ request.setPerFieldAnalyzer(perFieldAnalyzer);
|
|
|
+
|
|
|
+ request.setRealtime(false);
|
|
|
+ request.setRouting("routing");
|
|
|
+ TermVectorsResponse response =
|
|
|
+ client.termvectors(request, RequestOptions.DEFAULT);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void bulkApi() throws IOException {
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ BulkRequest request = new BulkRequest();
|
|
|
+
|
|
|
+ request.add(new UpdateRequest(indexName, "_doc", "633b5f31-8cfd-47d4-bc9a-a151fb23633f")
|
|
|
+ .doc(XContentType.JSON, "user", "林俊杰1"));
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ BulkResponse bulkResponse = client.bulk(request, RequestOptions.DEFAULT);
|
|
|
+ for (BulkItemResponse bulkItemResponse : bulkResponse) {
|
|
|
+ DocWriteResponse itemResponse = bulkItemResponse.getResponse();
|
|
|
+
|
|
|
+ switch (bulkItemResponse.getOpType()) {
|
|
|
+ case INDEX:
|
|
|
+ case CREATE:
|
|
|
+ IndexResponse indexResponse = (IndexResponse) itemResponse;
|
|
|
+ break;
|
|
|
+ case UPDATE:
|
|
|
+ UpdateResponse updateResponse = (UpdateResponse) itemResponse;
|
|
|
+ logger.info(updateResponse.toString());
|
|
|
+ break;
|
|
|
+ case DELETE:
|
|
|
+ DeleteResponse deleteResponse = (DeleteResponse) itemResponse;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void multiGetAPI() throws IOException {
|
|
|
+ MultiGetRequest request = new MultiGetRequest();
|
|
|
+ String[] includes = new String[]{"user", "*1"};
|
|
|
+ String[] excludes = Strings.EMPTY_ARRAY;
|
|
|
+ FetchSourceContext fetchSourceContext =
|
|
|
+ new FetchSourceContext(true, includes, excludes);
|
|
|
+ request.add(new MultiGetRequest.Item(indexName, "_doc", "633b5f31-8cfd-47d4-bc9a-a151fb23633f")
|
|
|
+ .fetchSourceContext(fetchSourceContext));
|
|
|
+ MultiGetResponse response = client.mget(request, RequestOptions.DEFAULT);
|
|
|
+ response.forEach((K) -> {
|
|
|
+ logger.info(K.toString());
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void reindexApi() {
|
|
|
+ ReindexRequest request = new ReindexRequest();
|
|
|
+ request.setSourceIndices("source1", "source2");
|
|
|
+ request.setDestIndex("dest");
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void updateByQueryAPI() {
|
|
|
+ UpdateByQueryRequest request =
|
|
|
+ new UpdateByQueryRequest("source1", "source2");
|
|
|
+
|
|
|
+
|
|
|
+ request.setConflicts("proceed");
|
|
|
+
|
|
|
+ request.setQuery(new TermQueryBuilder("user", "kimchy"));
|
|
|
+ request.setSize(10);
|
|
|
+
|
|
|
+ request.setPipeline("my_pipeline");
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private IndexRequest jsonData(String user, String message) {
|
|
|
+
|
|
|
+ IndexRequest request = new IndexRequest(
|
|
|
+ indexName,
|
|
|
+ "_doc",
|
|
|
+ UUID.randomUUID().toString());
|
|
|
+ String date = DateUtils.dateParseString(new Date());
|
|
|
+ String jsonString = "{" +
|
|
|
+ "\"user\":\"" + user + "\"," +
|
|
|
+ "\"postDate\":\"" + new Date().getTime() + "\"," +
|
|
|
+ "\"message\":\"" + message + "\"" +
|
|
|
+ "}";
|
|
|
+ IndexRequest source = request.source(jsonString, XContentType.JSON);
|
|
|
+ return source;
|
|
|
+ }
|
|
|
+
|
|
|
+ private IndexRequest mapData(String user, String message) {
|
|
|
+
|
|
|
+ Map<String, Object> jsonMap = new HashMap<>();
|
|
|
+ jsonMap.put("user", user);
|
|
|
+ jsonMap.put("postDate", new Date());
|
|
|
+ jsonMap.put("message", message);
|
|
|
+ IndexRequest indexRequest = new IndexRequest(indexName, "_doc", UUID.randomUUID().toString())
|
|
|
+ .source(jsonMap);
|
|
|
+ return indexRequest;
|
|
|
+ }
|
|
|
+
|
|
|
+ private IndexRequest docData(String user, String message) throws IOException {
|
|
|
+ XContentBuilder builder = XContentFactory.jsonBuilder();
|
|
|
+ builder.startObject();
|
|
|
+ {
|
|
|
+ builder.field("user", user);
|
|
|
+ builder.timeField("postDate", new Date());
|
|
|
+ builder.field("message", message);
|
|
|
+ }
|
|
|
+ builder.endObject();
|
|
|
+ IndexRequest indexRequest = new IndexRequest(indexName, "_doc", UUID.randomUUID().toString())
|
|
|
+ .source(builder);
|
|
|
+ return indexRequest;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ * 用来处理搜索结果,转换成链表
|
|
|
+ *
|
|
|
+ * @param searchRequest
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public List<String> listSearchResult(SearchRequest searchRequest) {
|
|
|
+
|
|
|
+ SearchResponse searchResponse = null;
|
|
|
+ try {
|
|
|
+ searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } finally {
|
|
|
+ if (client != null) {
|
|
|
+ try {
|
|
|
+ client.close();
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ List<String> list = new LinkedList<>();
|
|
|
+ SearchHits hits = searchResponse.getHits();
|
|
|
+ Iterator<SearchHit> iterator = hits.iterator();
|
|
|
+ while (iterator.hasNext()) {
|
|
|
+ SearchHit next = iterator.next();
|
|
|
+ list.add(next.getSourceAsString());
|
|
|
+ }
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+
|
|
|
+ @After
|
|
|
+ public void after() throws IOException {
|
|
|
+ client.close();
|
|
|
+ }
|
|
|
+
|
|
|
+}
|