Browse Source

es文档触发

liukx 5 years ago
parent
commit
56ade9d689

+ 7 - 1
elab-cache/pom.xml

@@ -14,7 +14,7 @@
     <properties>
         <java-version>1.8</java-version>
         <profiles.active>skyforest</profiles.active>
-        <elasticsearch>5.3.2</elasticsearch>
+        <!--<elasticsearch>5.3.2</elasticsearch>-->
         <cachecloud-open-client-basic>1.0-SNAPSHOT</cachecloud-open-client-basic>
         <cachecloud-jedis>1.0-SNAPSHOT</cachecloud-jedis>
         <cachecloud-open-common.version>1.0-SNAPSHOT</cachecloud-open-common.version>
@@ -161,6 +161,12 @@
                             <goals>
                                 <goal>jar</goal>
                             </goals>
+                            <configuration>
+                                <additionalparam>-Xdoclint:none</additionalparam>
+                                <charset>UTF-8</charset>
+                                <encoding>UTF-8</encoding>
+                                <docencoding>UTF-8</docencoding>
+                            </configuration>
                         </execution>
                     </executions>
                 </plugin>

+ 4 - 1
elab-core/pom.xml

@@ -57,7 +57,10 @@
                             <goal>jar</goal>
                         </goals>
                         <configuration>
-                            <additionalOptions>-Xdoclint:none</additionalOptions>
+                            <additionalparam>-Xdoclint:none</additionalparam>
+                            <charset>UTF-8</charset>
+                            <encoding>UTF-8</encoding>
+                            <docencoding>UTF-8</docencoding>
                         </configuration>
                     </execution>
                 </executions>

+ 34 - 3
elab-es/pom.xml

@@ -11,8 +11,18 @@
 
     <artifactId>elab-es</artifactId>
 
+    <properties>
+        <!--<spring.version>5.0.9.RELEASE</spring.version>-->
+    </properties>
+
 
     <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <optional>true</optional>
+            <version>${springboot.version}</version>
+        </dependency>
         <dependency>
             <artifactId>elab-core</artifactId>
             <groupId>com.elab.core</groupId>
@@ -20,13 +30,19 @@
         </dependency>
         <dependency>
             <artifactId>elab-spring</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>gson</artifactId>
+                    <groupId>com.google.code.gson</groupId>
+                </exclusion>
+            </exclusions>
             <groupId>com.elab.core</groupId>
             <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.zxp</groupId>
             <artifactId>esclientrhl</artifactId>
-            <version>1.0.0</version>
+            <version>7.0.0</version>
         </dependency>
         <!--        <dependency>-->
         <!--            <groupId>org.springframework.boot</groupId>-->
@@ -38,17 +54,32 @@
         <!--            <artifactId>elasticsearch-rest-client</artifactId>-->
         <!--            <version>6.7.2</version>-->
         <!--        </dependency>-->
+        <dependency>
+            <groupId>org.elasticsearch</groupId>
+            <artifactId>elasticsearch</artifactId>
+            <version>7.4.0</version>
+        </dependency>
         <dependency>
             <groupId>org.elasticsearch.client</groupId>
             <artifactId>elasticsearch-rest-high-level-client</artifactId>
-            <version>6.7.2</version>
+            <version>7.4.0</version>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-test</artifactId>
-            <version>2.1.6.RELEASE</version>
+            <version>${springboot.version}</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.yaml</groupId>
+            <artifactId>snakeyaml</artifactId>
+            <version>1.19</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <version>${springboot.version}</version>
+        </dependency>
     </dependencies>
 
 </project>

+ 1 - 0
elab-es/src/main/java/com/elab/es/client/DefaultElasticSearchTemplate.java

@@ -12,4 +12,5 @@ import org.zxp.esclientrhl.repository.ElasticsearchTemplateImpl;
 @Component
 public class DefaultElasticSearchTemplate<K, V> extends ElasticsearchTemplateImpl<K, V> {
 
+
 }

+ 38 - 2
elab-es/src/main/java/com/elab/es/client/configuration/ESConfiguration.java

@@ -1,7 +1,20 @@
 package com.elab.es.client.configuration;
 
+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.client.RestClient;
+import org.elasticsearch.client.RestClientBuilder;
+import org.elasticsearch.client.RestHighLevelClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+import org.zxp.esclientrhl.index.ElasticsearchIndexImpl;
 
 /**
  * es的配置类
@@ -10,8 +23,31 @@ import org.springframework.context.annotation.Configuration;
  * @time : 2019/8/6 - 15:48
  */
 @Configuration
-@ComponentScan(basePackages = "com.elab.es.*")
-//@Import({DefaultElasticSearchTemplate.class})
+@ComponentScan(basePackages = {"com.elab.es.*"})
+@Import({ElabESProperties.class, ElasticsearchIndexImpl.class})
 public class ESConfiguration {
 
+    @Bean
+    public RestHighLevelClient restHighLevelClient(@Autowired ElabESProperties properties) throws Exception {
+        CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
+        //访问用户名和密码为您创建阿里云Elasticsearch实例时设置的用户名和密码,也是Kibana控制台的登录用户名和密码。
+        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(properties.getUsername(), properties.getPassword()));
+        // 通过builder创建rest client,配置http client的HttpClientConfigCallback。
+        // 单击所创建的Elasticsearch实例ID,在基本信息页面获取公网地址,即为ES集群地址。
+        if (properties.getUris().size() == 1) {
+            String[] urlInfo = properties.getUris().get(0).split(":");
+            RestClientBuilder builder = RestClient.builder(new HttpHost(urlInfo[0], Integer.valueOf(urlInfo[1])))
+                    .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
+                        @Override
+                        public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
+                            return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
+                        }
+                    });
+            // RestHighLevelClient实例通过REST low-level client builder进行构造。
+            return new RestHighLevelClient(builder);
+        } else if (properties.getUris().size() > 1) {
+            throw new Exception("bucket type is not support");
+        }
+        throw new Exception("RestHighLevelClient 需要指定URL。yaml配置中elab.elasticsearch.jest.uris ..");
+    }
 }

+ 1 - 1
elab-es/src/main/resources/META-INF/spring.factories

@@ -1 +1 @@
-org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.elab.es.client.configuration.ESConfiguration
+#org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.elab.es.client.configuration.ESConfiguration

+ 2 - 0
elab-es/src/test/java/com/elab/es/App.java

@@ -16,10 +16,12 @@
  */
 package com.elab.es;
 
+import com.elab.es.client.annotation.EnableElastaticSearch;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 
 @SpringBootApplication
+@EnableElastaticSearch(basePackages = "com.elab.es.es", printregmsg = true)
 public class App {
 
     public static void main(String[] args) {

+ 451 - 0
elab-es/src/test/java/com/elab/es/data/ALiYunRestHighLevelClientTest.java

@@ -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() {
+//        client = new RestHighLevelClient(
+//                RestClient.builder(
+////                        new HttpHost("localhost", 9200, "http"),
+//                        new HttpHost("192.168.0.24", 9200, "http")));
+        CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
+        //访问用户名和密码为您创建阿里云Elasticsearch实例时设置的用户名和密码,也是Kibana控制台的登录用户名和密码。
+        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
+
+        // 通过builder创建rest client,配置http client的HttpClientConfigCallback。
+        // 单击所创建的Elasticsearch实例ID,在基本信息页面获取公网地址,即为ES集群地址。
+        RestClientBuilder builder = RestClient.builder(new HttpHost(host, 9200))
+                .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
+                    @Override
+                    public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
+                        return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
+                    }
+                });
+
+        // RestHighLevelClient实例通过REST low-level client builder进行构造。
+        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 = mapData("林俊杰", "确认过眼神,我遇上对的人");
+//        request = docData("某某某", "哈哈,终于成功了");
+
+        //设置超时时间
+        request.timeout(TimeValue.timeValueSeconds(1));
+
+        //设置版本号
+//        request.version(1);
+//        request.versionType(VersionType.EXTERNAL);
+//        request.opType(DocWriteRequest.OpType.CREATE);
+//        request.setPipeline("pipeline");
+
+
+        // 同步执行方式posts
+        IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);
+
+        logger.info(" result : " + indexResponse.toString());
+//        String index = indexResponse.getIndex();
+//        String type = indexResponse.getType();
+//        String id = indexResponse.getId();
+//        long version = indexResponse.getVersion();
+
+
+        // 异步方式
+//        client.indexAsync(request, RequestOptions.DEFAULT, new ActionListener<IndexResponse>() {
+//            @Override
+//            public void onResponse(IndexResponse indexResponse) {
+//                RestStatus status = indexResponse.status();
+//                System.out.println(status.getStatus());
+//            }
+//
+//            @Override
+//            public void onFailure(Exception e) {
+//                System.out.println("执行失败.." + e.getMessage());
+//            }
+//        });
+    }
+
+
+    /**
+     * 根据id获取数据
+     *
+     * @throws IOException
+     */
+    @Test
+    public void getApi() throws IOException {
+        GetRequest request = new GetRequest(
+                indexName,
+                "_doc",
+                "3533216d-2b23-4bd2-a129-7c0ede2ed5b3");
+//        request.fetchSourceContext(FetchSourceContext.DO_NOT_FETCH_SOURCE);
+
+//        String[] includes = new String[]{"message", "*Date"};
+//        String[] excludes = Strings.EMPTY_ARRAY;
+//        FetchSourceContext fetchSourceContext =
+//                new FetchSourceContext(true, includes, excludes);
+//        request.fetchSourceContext(fetchSourceContext);
+//        request.storedFields("message");
+        GetResponse getResponse = client.get(request, RequestOptions.DEFAULT);
+        // 批量获取
+        // GetResponse getResponse = client.mget()
+
+//        String message = getResponse.getField("message").getValue();
+        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();
+
+        // deleteResponse.getShardInfo().getTotal()
+        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.retryOnConflict(3);
+        // 当指定了版本号之后,会与ES中的文档数据进行比对,相同才会更改,不同则会异常。
+        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 {
+//        GetRequest request = new GetRequest(indexName, "2da3f2f9-b21d-4bee-8064-64d2f8171db2");
+//        GetResponse documentFields = client.get(request, RequestOptions.DEFAULT);
+//        Map<String, Object> source = documentFields.getSource();
+//        System.out.println(JSON.toJSONString(source));
+        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 {
+        // todo 待研究 1
+//        TermVectorsRequest request = new TermVectorsRequest(indexName, "doc", "1");
+//        request.setFields("user");
+        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 IndexRequest(indexName, "_doc", "1")
+//                .source(XContentType.JSON,"field", "foo"));
+//        request.add(new IndexRequest(indexName, "_doc", "2")
+//                .source(XContentType.JSON,"field", "bar"));
+//        request.add(new IndexRequest(indexName, "_doc", "3")
+//                .source(XContentType.JSON,"field", "baz"));
+
+        // 混合使用
+        BulkRequest request = new BulkRequest();
+//        request.add(new DeleteRequest(indexName, "_doc", "3"));
+        request.add(new UpdateRequest(indexName, "_doc", "633b5f31-8cfd-47d4-bc9a-a151fb23633f")
+                .doc(XContentType.JSON, "user", "林俊杰1"));
+//        request.add(new IndexRequest(indexName, "_doc", "4")
+//                .source(XContentType.JSON,"field", "baz"));
+
+        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对象
+        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) {
+        // 获得response
+        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();
+                }
+            }
+        }
+
+        // 从response中获得结果
+        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();
+    }
+
+}

File diff suppressed because it is too large
+ 563 - 563
elab-es/src/test/java/com/elab/es/data/DataTest.java


+ 127 - 0
elab-es/src/test/java/com/elab/es/data/ElasticsearchTemplateImplCase.java

@@ -0,0 +1,127 @@
+package com.elab.es.data;
+
+import com.alibaba.fastjson.JSON;
+import com.elab.es.App;
+import com.elab.es.model.Posts;
+import org.elasticsearch.index.query.MatchPhraseQueryBuilder;
+import org.elasticsearch.index.query.MatchQueryBuilder;
+import org.elasticsearch.index.query.QueryBuilder;
+import org.elasticsearch.index.query.QueryBuilders;
+import org.elasticsearch.search.sort.SortOrder;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.zxp.esclientrhl.enums.SqlFormat;
+import org.zxp.esclientrhl.index.ElasticsearchIndex;
+import org.zxp.esclientrhl.repository.*;
+
+import java.util.List;
+
+/**
+ * 模版工具类测试
+ *
+ * @author Liukx
+ * @create 2020-03-24 13:51
+ * @email liukx@elab-plus.com
+ **/
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = App.class)
+public class ElasticsearchTemplateImplCase {
+    @Autowired
+    private ElasticsearchTemplateImpl<Posts, String> searchTemplate;
+
+    @Autowired
+    private ElasticsearchIndex<Posts> searchIndex;
+
+    /**
+     * 新增一条数据
+     *
+     * @throws Exception
+     */
+    @Test
+    public void save() throws Exception {
+        Posts posts = new Posts("测试", "test data!!");
+        boolean save = searchTemplate.save(posts);
+    }
+
+    @Test
+    public void delete() throws Exception {
+        boolean b = searchTemplate.deleteById("b6f35bd3-3e63-402f-90ee-3668fb87272a", Posts.class);
+        System.out.println(b);
+    }
+
+    @Test
+    public void querySQL() throws Exception {
+        String s = searchTemplate.queryBySQL("select message from posts limit 5", SqlFormat.TXT);
+        System.out.println(s);
+    }
+
+    @Test
+    public void queryLike() throws Exception {
+        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("message", "我");
+
+        List<Posts> search = searchTemplate.search(matchQueryBuilder, Posts.class);
+        System.out.println(JSON.toJSONString(search));
+    }
+
+    @Test
+    public void queryHight() throws Exception {
+        MatchPhraseQueryBuilder matchPhraseQueryBuilder = QueryBuilders.matchPhraseQuery("message", "我");
+        List<Posts> search = searchTemplate.search(matchPhraseQueryBuilder, Posts.class);
+        System.out.println(JSON.toJSONString(search));
+    }
+
+    @Test
+    public void existsIndex() throws Exception {
+        boolean exists = searchIndex.exists(Posts.class);
+        System.out.println(exists);
+    }
+
+
+    @Test
+    public void pageSearch1() throws Exception {
+        List<Posts> postses = searchTemplate.searchMore(QueryBuilders.matchAllQuery(), 2, Posts.class);
+        System.out.println(JSON.toJSONString(postses));
+    }
+
+    @Test
+    public void pageSearch2() throws Exception {
+        //定制分页信息
+        int currentPage = 1;
+        int pageSize = 10;
+        PageSortHighLight psh = new PageSortHighLight(currentPage, pageSize);
+        //排序字段,注意如果proposal_no是text类型会默认带有keyword性质,需要拼接.keyword
+        String sorter = "postDate";
+        Sort.Order order = new Sort.Order(SortOrder.ASC, sorter);
+        psh.setSort(new Sort(order));
+        //定制高亮,如果定制了高亮,返回结果会自动替换字段值为高亮内容
+        HighLight message = new HighLight().field("message");
+        //可以单独定义高亮的格式
+        message.setPreTag("<em>");
+        message.setPostTag("</em>");
+        psh.setHighLight(message);
+
+
+        PageList<Posts> pageList = new PageList<>();
+        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("message", "我");
+        pageList = searchTemplate.search(matchQueryBuilder, psh, Posts.class);
+        System.out.println(JSON.toJSONString(pageList));
+    }
+
+    @Test
+    public void queryBuilders() throws Exception {
+        // 精准查询 如果不加.keyword就会变成模糊查询
+//        QueryBuilder queryBuilder = QueryBuilders.termQuery("message.keyword", "我");
+        //必须相邻的查询条件
+//        QueryBuilder queryBuilder = QueryBuilders.matchPhraseQuery("message", "圈圈");
+
+        QueryBuilder queryBuilder = QueryBuilders.matchPhraseQuery("message", "深深你").slop(3);
+
+
+        List<Posts> search = searchTemplate.search(queryBuilder, Posts.class);
+        System.out.println(JSON.toJSONString(search));
+    }
+
+}

+ 68 - 0
elab-es/src/test/java/com/elab/es/model/Posts.java

@@ -0,0 +1,68 @@
+package com.elab.es.model;
+
+import org.zxp.esclientrhl.annotation.ESID;
+import org.zxp.esclientrhl.annotation.ESMetaData;
+
+import java.util.Date;
+import java.util.UUID;
+
+/**
+ * 测试
+ *
+ * @author Liukx
+ * @create 2020-03-24 13:58
+ * @email liukx@elab-plus.com
+ **/
+@ESMetaData(indexName = "posts", indexType = "_doc", printLog = true)
+public class Posts {
+
+    @ESID
+    private String id = UUID.randomUUID().toString();
+
+    private String user;
+
+    private Date postDate;
+
+    private String message;
+
+    public Posts(String user, String message) {
+        this.user = user;
+        this.message = message;
+        this.postDate = new Date();
+    }
+
+    public Posts() {
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getUser() {
+        return user;
+    }
+
+    public void setUser(String user) {
+        this.user = user;
+    }
+
+    public Date getPostDate() {
+        return postDate;
+    }
+
+    public void setPostDate(Date postDate) {
+        this.postDate = postDate;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+}

+ 10 - 3
elab-es/src/test/resources/application.yml

@@ -1,4 +1,11 @@
-spring:
+#spring:
+#  elasticsearch:
+#    rest:
+#      uris: http://192.168.0.24:9100
+
+elab:
   elasticsearch:
-    rest:
-      uris: http://192.168.0.24:9100
+    jest:
+      uris: es-cn-0pp1jc07f001i1t59.public.elasticsearch.aliyuncs.com:9200
+      username: elastic
+      password: elab@123

+ 4 - 4
elab-log/pom.xml

@@ -98,10 +98,10 @@
                             <goal>jar</goal>
                         </goals>
                         <configuration>
-                            <additionalOptions>
-                                <additionalOption>-Xdoclint:none</additionalOption>
-                            </additionalOptions>
-                            <!--<additionalparam></additionalparam>-->
+                            <additionalparam>-Xdoclint:none</additionalparam>
+                            <charset>UTF-8</charset>
+                            <encoding>UTF-8</encoding>
+                            <docencoding>UTF-8</docencoding>
                         </configuration>
                     </execution>
                 </executions>

+ 7 - 5
pom.xml

@@ -27,7 +27,9 @@
     <properties>
         <java-version>1.8</java-version>
         <profiles.active>test</profiles.active>
-        <springframework.version>4.3.16.RELEASE</springframework.version>
+        <!--<springframework.version>4.3.16.RELEASE</springframework.version>-->
+        <springframework.version>5.1.3.RELEASE</springframework.version>
+        <springboot.version>2.0.5.RELEASE</springboot.version>
         <mysql.connector.version>5.1.38</mysql.connector.version>
         <druid.version>1.1.6</druid.version>
         <fastjson.version>1.2.47</fastjson.version>
@@ -344,10 +346,10 @@
                             <goal>jar</goal>
                         </goals>
                         <configuration>
-                            <additionalOptions>
-                                <additionalOption>-Xdoclint:none</additionalOption>
-                            </additionalOptions>
-                            <!--<additionalparam></additionalparam>-->
+                            <additionalparam>-Xdoclint:none</additionalparam>
+                            <charset>UTF-8</charset>
+                            <encoding>UTF-8</encoding>
+                            <docencoding>UTF-8</docencoding>
                         </configuration>
                     </execution>
                 </executions>