0%

Springboot+Elasticsearch整合实例

Springboot+Elasticsearch整合实例

这篇文章主要介绍Springboot与Elasticsearch整合在一起的简单例子,作为自己学习的一个记录

使用到的工具:

  1. Spring Boot 1.5.10.RELEASE
  2. Spring Boot Starter Data Elasticsearch 1.5.10.RELEASE
  3. Spring Data Elasticsearch 2.1.10.RELEASE
  4. Elasticsearch 2.4.0
  5. Maven
  6. Java 8 注意 :Spring Boot 1.5.10.RELEASE和Spring Data Elasticsearch 2.1.10.RELEASE只支持Elasticsearch 2.4.0,不支持最新的ElasticSearch 5.x版本
    详见:Spring Data Elasticsearch Spring Boot version matrix

1.项目依赖:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

4.0.0

com.xmp
elasticsearch
0.0.1-SNAPSHOT
jar

elasticsearch
ElasticsearchDemo project for Spring Boot

org.springframework.boot
spring-boot-starter-parent
1.5.10.RELEASE


UTF-8UTF-81.8



org.springframework.boot
spring-boot-starter-data-elasticsearch


org.springframework.boot
spring-boot-starter-web


org.projectlombok
lomboktrue


org.springframework.boot
spring-boot-starter-test
test



org.springframework.boot
spring-boot-maven-plugin

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
D:\springboot-learning\springboot-elasticsearch>mvn dependency:tree
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building elasticsearch 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.10:tree (default-cli) @ elasticsearch ---
[INFO] com.xmp:elasticsearch:jar:0.0.1-SNAPSHOT
[INFO] +- org.springframework.boot:spring-boot-starter-data-elasticsearch:jar:1.5.10.RELEASE:compile
[INFO] | +- org.springframework.boot:spring-boot-starter:jar:1.5.10.RELEASE:compile
[INFO] | | +- org.springframework.boot:spring-boot:jar:1.5.10.RELEASE:compile
[INFO] | | +- org.springframework.boot:spring-boot-autoconfigure:jar:1.5.10.RELEASE:compile
[INFO] | | +- org.springframework.boot:spring-boot-starter-logging:jar:1.5.10.RELEASE:compile
[INFO] | | | +- ch.qos.logback:logback-classic:jar:1.1.11:compile
[INFO] | | | | \- ch.qos.logback:logback-core:jar:1.1.11:compile
[INFO] | | | +- org.slf4j:jul-to-slf4j:jar:1.7.25:compile
[INFO] | | | \- org.slf4j:log4j-over-slf4j:jar:1.7.25:compile
[INFO] | | \- org.yaml:snakeyaml:jar:1.17:compile
[INFO] | \- org.springframework.data:spring-data-elasticsearch:jar:2.1.10.RELEASE:compile
[INFO] | +- org.springframework:spring-context:jar:4.3.14.RELEASE:compile
[INFO] | +- org.springframework:spring-tx:jar:4.3.14.RELEASE:compile
[INFO] | +- org.springframework.data:spring-data-commons:jar:1.13.10.RELEASE:compile
[INFO] | +- commons-lang:commons-lang:jar:2.6:compile
[INFO] | +- joda-time:joda-time:jar:2.9.9:compile
[INFO] | +- org.elasticsearch:elasticsearch:jar:2.4.6:compile
[INFO] | | +- org.apache.lucene:lucene-core:jar:5.5.4:compile
[INFO] | | +- org.apache.lucene:lucene-backward-codecs:jar:5.5.4:compile
[INFO] | | +- org.apache.lucene:lucene-analyzers-common:jar:5.5.4:compile
[INFO] | | +- org.apache.lucene:lucene-queries:jar:5.5.4:compile
[INFO] | | +- org.apache.lucene:lucene-memory:jar:5.5.4:compile
[INFO] | | +- org.apache.lucene:lucene-highlighter:jar:5.5.4:compile
[INFO] | | +- org.apache.lucene:lucene-queryparser:jar:5.5.4:compile
[INFO] | | | \- org.apache.lucene:lucene-sandbox:jar:5.5.4:compile
[INFO] | | +- org.apache.lucene:lucene-suggest:jar:5.5.4:compile
[INFO] | | | \- org.apache.lucene:lucene-misc:jar:5.5.4:compile
[INFO] | | +- org.apache.lucene:lucene-join:jar:5.5.4:compile
[INFO] | | | \- org.apache.lucene:lucene-grouping:jar:5.5.4:compile
[INFO] | | +- org.apache.lucene:lucene-spatial:jar:5.5.4:compile
[INFO] | | | +- org.apache.lucene:lucene-spatial3d:jar:5.5.4:compile
[INFO] | | | \- com.spatial4j:spatial4j:jar:0.5:compile
[INFO] | | +- com.google.guava:guava:jar:18.0:compile
[INFO] | | +- org.elasticsearch:securesm:jar:1.0:compile
[INFO] | | +- com.carrotsearch:hppc:jar:0.7.1:compile
[INFO] | | +- com.fasterxml.jackson.dataformat:jackson-dataformat-smile:jar:2.8.10:compile
[INFO] | | +- com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:jar:2.8.10:compile
[INFO] | | +- com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:jar:2.8.10:compile
[INFO] | | +- io.netty:netty:jar:3.10.6.Final:compile
[INFO] | | +- com.ning:compress-lzf:jar:1.0.2:compile
[INFO] | | +- com.tdunning:t-digest:jar:3.0:compile
[INFO] | | +- org.hdrhistogram:HdrHistogram:jar:2.1.6:compile
[INFO] | | +- commons-cli:commons-cli:jar:1.3.1:compile
[INFO] | | \- com.twitter:jsr166e:jar:1.1.0:compile
[INFO] | +- com.fasterxml.jackson.core:jackson-core:jar:2.8.10:compile
[INFO] | +- org.slf4j:slf4j-api:jar:1.7.25:compile
[INFO] | \- org.slf4j:jcl-over-slf4j:jar:1.7.25:compile
[INFO] +- org.springframework.boot:spring-boot-starter-web:jar:1.5.10.RELEASE:compile
[INFO] | +- org.springframework.boot:spring-boot-starter-tomcat:jar:1.5.10.RELEASE:compile
[INFO] | | +- org.apache.tomcat.embed:tomcat-embed-core:jar:8.5.27:compile
[INFO] | | | \- org.apache.tomcat:tomcat-annotations-api:jar:8.5.27:compile
[INFO] | | +- org.apache.tomcat.embed:tomcat-embed-el:jar:8.5.27:compile
[INFO] | | \- org.apache.tomcat.embed:tomcat-embed-websocket:jar:8.5.27:compile
[INFO] | +- org.hibernate:hibernate-validator:jar:5.3.6.Final:compile
[INFO] | | +- javax.validation:validation-api:jar:1.1.0.Final:compile
[INFO] | | +- org.jboss.logging:jboss-logging:jar:3.3.1.Final:compile
[INFO] | | \- com.fasterxml:classmate:jar:1.3.4:compile
[INFO] | +- com.fasterxml.jackson.core:jackson-databind:jar:2.8.10:compile
[INFO] | | \- com.fasterxml.jackson.core:jackson-annotations:jar:2.8.0:compile
[INFO] | +- org.springframework:spring-web:jar:4.3.14.RELEASE:compile
[INFO] | | +- org.springframework:spring-aop:jar:4.3.14.RELEASE:compile
[INFO] | | \- org.springframework:spring-beans:jar:4.3.14.RELEASE:compile
[INFO] | \- org.springframework:spring-webmvc:jar:4.3.14.RELEASE:compile
[INFO] | \- org.springframework:spring-expression:jar:4.3.14.RELEASE:compile
[INFO] +- org.projectlombok:lombok:jar:1.16.20:compile
[INFO] \- org.springframework.boot:spring-boot-starter-test:jar:1.5.10.RELEASE:test
[INFO] +- org.springframework.boot:spring-boot-test:jar:1.5.10.RELEASE:test
[INFO] +- org.springframework.boot:spring-boot-test-autoconfigure:jar:1.5.10.RELEASE:test
[INFO] +- com.jayway.jsonpath:json-path:jar:2.2.0:test
[INFO] | \- net.minidev:json-smart:jar:2.2.1:test
[INFO] | \- net.minidev:accessors-smart:jar:1.1:test
[INFO] | \- org.ow2.asm:asm:jar:5.0.3:test
[INFO] +- junit:junit:jar:4.12:test
[INFO] +- org.assertj:assertj-core:jar:2.6.0:test
[INFO] +- org.mockito:mockito-core:jar:1.10.19:test
[INFO] | \- org.objenesis:objenesis:jar:2.1:test
[INFO] +- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] +- org.hamcrest:hamcrest-library:jar:1.3:test
[INFO] +- org.skyscreamer:jsonassert:jar:1.4.0:test
[INFO] | \- com.vaadin.external.google:android-json:jar:0.0.20131108.vaadin1:test
[INFO] +- org.springframework:spring-core:jar:4.3.14.RELEASE:compile
[INFO] \- org.springframework:spring-test:jar:4.3.14.RELEASE:test
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.010 s
[INFO] Finished at: 2018-03-01T10:12:42+08:00
[INFO] Final Memory: 26M/228M
[INFO] ------------------------------------------------------------------------

2. Spring Data ElasticSearch Application

现在开始Spring Boot + Spring Data + Elasticsearch
2.1 编写我们的实体类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package com.xmp.entity;

import lombok.*;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;

import java.io.Serializable;
import java.util.Date;

/**
*

*

*
* @author xiemopeng
* @since 2018/2/27
*/
@ToString
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Document(indexName = "xmp", type = "news")
public class Article implements Serializable {
@Id
private Long id;
/**
* 标题
*/
private String title;
/**
* 摘要
*/
private String abstracts;
/**
* 内容
*/
private String content;
/**
* 发表时间
*/
private Date postTime;
/**
* 点击率
*/
private Long clickCount;
/**
* 作者
*/
private Author author;
/**
* 所属教程
*/
private Tutorial tutorial;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package com.xmp.entity;

import lombok.*;

import java.io.Serializable;

/**
*

*

*
* @author xiemopeng
* @since 2018/2/27
*/
@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Author implements Serializable {
/**
* 作者id
*/
private Long id;
/**
* 作者姓名
*/
private String name;
/**
* 作者简介
*/
private String remark;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.xmp.entity;

import lombok.*;

import java.io.Serializable;

/**
*

*

*
* @author xiemopeng
* @since 2018/2/27
*/
@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Tutorial implements Serializable {
private Long id;
private String name;//教程名称
}

2.2 编写Elasticsearch Repository(dao)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package com.xmp.repository;

import com.xmp.entity.Article;
import com.xmp.entity.Author;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

import java.util.List;

/**
*

*

*
* @author xiemopeng
* @since 2018/2/27
*/
public interface ArticleRepository extends ElasticsearchRepository<Article, Long> {

Page

findByAuthor(Author author, Pageable pageable);
List

findByTitle(String title);
Page

findByTitle(String title, Pageable pageable);
}

2.3 编写service

老套路,先写需要的接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package com.xmp.service;

import com.xmp.entity.Article;
import com.xmp.entity.Author;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;

import java.util.List;

/**
*

*

*
* @author xiemopeng
* @since 2018/2/27
*/
public interface ArticleService {

Article save(Article article);

void delete(Article article);

Article findOne(Long id);

Iterable

findAll();
Page

findByAuthor(Author author, PageRequest pageRequest);
Page

findByTitle(String title, PageRequest pageRequest);
List

findByTitle(String title);
Iterable

search(String queryString);
}

再写实现类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package com.xmp.service;

import com.xmp.entity.Article;
import com.xmp.entity.Author;
import com.xmp.repository.ArticleRepository;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.index.query.QueryStringQueryBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;

import java.util.List;

/**
*

*

*
* @author xiemopeng
* @since 2018/2/27
*/
@Service
@Slf4j
public class ArticleServiceImpl implements ArticleService {

@Autowired
private ArticleRepository articleRepository;

@Override
public Article save(Article article) {
return articleRepository.save(article);
}

@Override
public void delete(Article article) {
articleRepository.delete(article);
}

@Override
public Article findOne(Long id) {
return articleRepository.findOne(id);
}

@Override
public Iterable

findAll() {
return articleRepository.findAll();
}
@Override
public Page

findByAuthor(Author author, PageRequest pageRequest) {
return articleRepository.findByAuthor(author, pageRequest);
}
@Override
public Page

findByTitle(String title, PageRequest pageRequest) {
return articleRepository.findByTitle(title, pageRequest);
}
@Override
public List

findByTitle(String title) {
return articleRepository.findByTitle(title);
}
@Override
public Iterable

search(String queryString) {
QueryStringQueryBuilder builder = new QueryStringQueryBuilder(queryString);
return articleRepository.search(builder);
}
}

2.4 配置Elasticsearch
application.yml

1
2
3
4
elasticsearch:
clustername: xmp-cluster
host: localhost
port: 9300

2.5 编写springboot配置,连接Elasticsearch集群

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package com.xmp.config;

import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;

import java.net.InetAddress;

//http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-nosql.html#boot-features-connecting-to-elasticsearch-spring-data
//https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-data-elasticsearch/src/main/java/sample/data/elasticsearch
//http://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#elasticsearch.repositories
//http://geekabyte.blogspot.my/2015/08/embedding-elasticsearch-in-spring.html
//https://github.com/spring-projects/spring-data-elasticsearch/wiki/Spring-Data-Elasticsearch---Spring-Boot---version-matrix
@Configuration
@EnableElasticsearchRepositories(basePackages = "com.xmp.repository")
public class EsConfig {

@Value("${elasticsearch.host}")
private String EsHost;

@Value("${elasticsearch.port}")
private int EsPort;

@Value("${elasticsearch.clustername}")
private String EsClusterName;

@Bean
public Client client() throws Exception {

Settings esSettings = Settings.settingsBuilder()
.put("cluster.name", EsClusterName)
.build();

//https://www.elastic.co/guide/en/elasticsearch/guide/current/_transport_client_versus_node_client.html
return TransportClient.builder()
.settings(esSettings)
.build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(EsHost), EsPort));
}

@Bean
public ElasticsearchOperations elasticsearchTemplate() throws Exception {
return new ElasticsearchTemplate(client());
}

//Embedded Elasticsearch Server
/*@Bean
public ElasticsearchOperations elasticsearchTemplate() {
return new ElasticsearchTemplate(nodeBuilder().local(true).node().client());
}*/

}

3. Run Spring Boot Application

3.1 运行这个demo,需要按照以下几步
1: 安装 Java 设置 JAVA_HOME 和 PATH variables.
2: 安装 Maven.
3: 安装Elasticsearch2.4.0
配置 ELASTICSEARCH_HOME = C:\elasticsearch-2.4.0
4:配置 ElasticSearch Cluster
打开 ${ELASTICSEARCH_HOME}\config\elasticsearch.yml 添加如下参数
cluster.name: xmp-cluster

5: 运行项目

5.2 运行项目,会插入10条信息到elasticsearch服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package com.xmp;

import com.xmp.entity.Article;
import com.xmp.entity.Author;
import com.xmp.entity.Tutorial;
import com.xmp.service.ArticleService;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.client.Client;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;

import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

@Slf4j
@SpringBootApplication
public class ElasticsearchApplication implements CommandLineRunner {
@Autowired
private ElasticsearchOperations es;

@Autowired
private ArticleService articleService;

public static void main(String[] args) {
SpringApplication.run(ElasticsearchApplication.class, args);
}

@Override
public void run(String... strings) throws Exception {
printElasticSearchInfo();
//插入10条信息
for (long i = 0; i < 10; i++) {
Author author = new Author(null, "xmp", null);
// System.out.println(author);
Tutorial tutorial = new Tutorial(i, "test" + String.valueOf(i));
Article article = new Article(i, "title", "abs", "content", new Date(), i, author, tutorial);
articleService.save(article);
}
//fuzzey search
Page

articles = articleService.findByTitle("title", new PageRequest(0, 5));
List

articleList = articleService.findByTitle("title");
// articles.forEach(x -> System.out.println(x));
// articleList.forEach(article -> {
// System.out.println(article);
// });

String queryString = "test1";//搜索关键字
Iterable

searchResult = articleService.search(queryString);
Iterator
iterator = searchResult.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
private void printElasticSearchInfo() {
log.info("--ElasticSearch-->");
Client client = es.getClient();
Map<String, String> asMap = client.settings().getAsMap();
asMap.forEach((k, v) -> {
log.info(k + "=" + v);
});

}
}

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
"C:\Program Files\Java\jdk1.8.0_121\bin\java" -Dspring.output.ansi.enabled=always -Didea.launcher.port=7537 "-Didea.launcher.bin.path=C:\Program Files (x86)\JetBrains\IntelliJ IDEA 2016.3.5\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_121\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\rt.jar;D:\springboot-learning\springboot-elasticsearch\target\classes;D:\repository\org\springframework\boot\spring-boot-starter-data-elasticsearch\1.5.10.RELEASE\spring-boot-starter-data-elasticsearch-1.5.10.RELEASE.jar;D:\repository\org\springframework\boot\spring-boot-starter\1.5.10.RELEASE\spring-boot-starter-1.5.10.RELEASE.jar;D:\repository\org\springframework\boot\spring-boot\1.5.10.RELEASE\spring-boot-1.5.10.RELEASE.jar;D:\repository\org\springframework\boot\spring-boot-autoconfigure\1.5.10.RELEASE\spring-boot-autoconfigure-1.5.10.RELEASE.jar;D:\repository\org\springframework\boot\spring-boot-starter-logging\1.5.10.RELEASE\spring-boot-starter-logging-1.5.10.RELEASE.jar;D:\repository\ch\qos\logback\logback-classic\1.1.11\logback-classic-1.1.11.jar;D:\repository\ch\qos\logback\logback-core\1.1.11\logback-core-1.1.11.jar;D:\repository\org\slf4j\jul-to-slf4j\1.7.25\jul-to-slf4j-1.7.25.jar;D:\repository\org\slf4j\log4j-over-slf4j\1.7.25\log4j-over-slf4j-1.7.25.jar;D:\repository\org\yaml\snakeyaml\1.17\snakeyaml-1.17.jar;D:\repository\org\springframework\data\spring-data-elasticsearch\2.1.10.RELEASE\spring-data-elasticsearch-2.1.10.RELEASE.jar;D:\repository\org\springframework\spring-context\4.3.14.RELEASE\spring-context-4.3.14.RELEASE.jar;D:\repository\org\springframework\spring-tx\4.3.14.RELEASE\spring-tx-4.3.14.RELEASE.jar;D:\repository\org\springframework\data\spring-data-commons\1.13.10.RELEASE\spring-data-commons-1.13.10.RELEASE.jar;D:\repository\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;D:\repository\joda-time\joda-time\2.9.9\joda-time-2.9.9.jar;D:\repository\org\elasticsearch\elasticsearch\2.4.6\elasticsearch-2.4.6.jar;D:\repository\org\apache\lucene\lucene-core\5.5.4\lucene-core-5.5.4.jar;D:\repository\org\apache\lucene\lucene-backward-codecs\5.5.4\lucene-backward-codecs-5.5.4.jar;D:\repository\org\apache\lucene\lucene-analyzers-common\5.5.4\lucene-analyzers-common-5.5.4.jar;D:\repository\org\apache\lucene\lucene-queries\5.5.4\lucene-queries-5.5.4.jar;D:\repository\org\apache\lucene\lucene-memory\5.5.4\lucene-memory-5.5.4.jar;D:\repository\org\apache\lucene\lucene-highlighter\5.5.4\lucene-highlighter-5.5.4.jar;D:\repository\org\apache\lucene\lucene-queryparser\5.5.4\lucene-queryparser-5.5.4.jar;D:\repository\org\apache\lucene\lucene-sandbox\5.5.4\lucene-sandbox-5.5.4.jar;D:\repository\org\apache\lucene\lucene-suggest\5.5.4\lucene-suggest-5.5.4.jar;D:\repository\org\apache\lucene\lucene-misc\5.5.4\lucene-misc-5.5.4.jar;D:\repository\org\apache\lucene\lucene-join\5.5.4\lucene-join-5.5.4.jar;D:\repository\org\apache\lucene\lucene-grouping\5.5.4\lucene-grouping-5.5.4.jar;D:\repository\org\apache\lucene\lucene-spatial\5.5.4\lucene-spatial-5.5.4.jar;D:\repository\org\apache\lucene\lucene-spatial3d\5.5.4\lucene-spatial3d-5.5.4.jar;D:\repository\com\spatial4j\spatial4j\0.5\spatial4j-0.5.jar;D:\repository\com\google\guava\guava\18.0\guava-18.0.jar;D:\repository\org\elasticsearch\securesm\1.0\securesm-1.0.jar;D:\repository\com\carrotsearch\hppc\0.7.1\hppc-0.7.1.jar;D:\repository\com\fasterxml\jackson\dataformat\jackson-dataformat-smile\2.8.10\jackson-dataformat-smile-2.8.10.jar;D:\repository\com\fasterxml\jackson\dataformat\jackson-dataformat-yaml\2.8.10\jackson-dataformat-yaml-2.8.10.jar;D:\repository\com\fasterxml\jackson\dataformat\jackson-dataformat-cbor\2.8.10\jackson-dataformat-cbor-2.8.10.jar;D:\repository\io\netty\netty\3.10.6.Final\netty-3.10.6.Final.jar;D:\repository\com\ning\compress-lzf\1.0.2\compress-lzf-1.0.2.jar;D:\repository\com\tdunning\t-digest\3.0\t-digest-3.0.jar;D:\repository\org\hdrhistogram\HdrHistogram\2.1.6\HdrHistogram-2.1.6.jar;D:\repository\commons-cli\commons-cli\1.3.1\commons-cli-1.3.1.jar;D:\repository\com\twitter\jsr166e\1.1.0\jsr166e-1.1.0.jar;D:\repository\com\fasterxml\jackson\core\jackson-core\2.8.10\jackson-core-2.8.10.jar;D:\repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;D:\repository\org\slf4j\jcl-over-slf4j\1.7.25\jcl-over-slf4j-1.7.25.jar;D:\repository\org\springframework\boot\spring-boot-starter-web\1.5.10.RELEASE\spring-boot-starter-web-1.5.10.RELEASE.jar;D:\repository\org\springframework\boot\spring-boot-starter-tomcat\1.5.10.RELEASE\spring-boot-starter-tomcat-1.5.10.RELEASE.jar;D:\repository\org\apache\tomcat\embed\tomcat-embed-core\8.5.27\tomcat-embed-core-8.5.27.jar;D:\repository\org\apache\tomcat\tomcat-annotations-api\8.5.27\tomcat-annotations-api-8.5.27.jar;D:\repository\org\apache\tomcat\embed\tomcat-embed-el\8.5.27\tomcat-embed-el-8.5.27.jar;D:\repository\org\apache\tomcat\embed\tomcat-embed-websocket\8.5.27\tomcat-embed-websocket-8.5.27.jar;D:\repository\org\hibernate\hibernate-validator\5.3.6.Final\hibernate-validator-5.3.6.Final.jar;D:\repository\javax\validation\validation-api\1.1.0.Final\validation-api-1.1.0.Final.jar;D:\repository\org\jboss\logging\jboss-logging\3.3.1.Final\jboss-logging-3.3.1.Final.jar;D:\repository\com\fasterxml\classmate\1.3.4\classmate-1.3.4.jar;D:\repository\com\fasterxml\jackson\core\jackson-databind\2.8.10\jackson-databind-2.8.10.jar;D:\repository\com\fasterxml\jackson\core\jackson-annotations\2.8.0\jackson-annotations-2.8.0.jar;D:\repository\org\springframework\spring-web\4.3.14.RELEASE\spring-web-4.3.14.RELEASE.jar;D:\repository\org\springframework\spring-aop\4.3.14.RELEASE\spring-aop-4.3.14.RELEASE.jar;D:\repository\org\springframework\spring-beans\4.3.14.RELEASE\spring-beans-4.3.14.RELEASE.jar;D:\repository\org\springframework\spring-webmvc\4.3.14.RELEASE\spring-webmvc-4.3.14.RELEASE.jar;D:\repository\org\springframework\spring-expression\4.3.14.RELEASE\spring-expression-4.3.14.RELEASE.jar;D:\repository\org\projectlombok\lombok\1.16.20\lombok-1.16.20.jar;D:\repository\org\springframework\spring-core\4.3.14.RELEASE\spring-core-4.3.14.RELEASE.jar;C:\Program Files (x86)\JetBrains\IntelliJ IDEA 2016.3.5\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain com.xmp.ElasticsearchApplication

. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.5.10.RELEASE)

2018-03-01 11:31:42.443 INFO 19000 --- [ main] com.xmp.ElasticsearchApplication : Starting ElasticsearchApplication on DESKTOP-AC6RJ04 with PID 19000 (D:\springboot-learning\springboot-elasticsearch\target\classes started by asus in D:\springboot-learning\springboot-elasticsearch)
2018-03-01 11:31:42.448 INFO 19000 --- [ main] com.xmp.ElasticsearchApplication : The following profiles are active: local
2018-03-01 11:31:42.580 INFO 19000 --- [ main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@7f552bd3: startup date [Thu Mar 01 11:31:42 CST 2018]; root of context hierarchy
2018-03-01 11:31:44.167 INFO 19000 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Overriding bean definition for bean 'elasticsearchTemplate' with a different definition: replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=esConfig; factoryMethodName=elasticsearchTemplate; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [com/xmp/config/EsConfig.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration; factoryMethodName=elasticsearchTemplate; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchDataAutoConfiguration.class]]
2018-03-01 11:31:47.184 INFO 19000 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
2018-03-01 11:31:47.211 INFO 19000 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2018-03-01 11:31:47.213 INFO 19000 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.27
2018-03-01 11:31:47.460 INFO 19000 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2018-03-01 11:31:47.461 INFO 19000 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 4901 ms
2018-03-01 11:31:47.721 INFO 19000 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/]
2018-03-01 11:31:47.729 INFO 19000 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*]
2018-03-01 11:31:47.729 INFO 19000 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2018-03-01 11:31:47.729 INFO 19000 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2018-03-01 11:31:47.729 INFO 19000 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*]
2018-03-01 11:31:48.334 INFO 19000 --- [ main] org.elasticsearch.plugins : [Death's Head II] modules [], plugins [], sites []
2018-03-01 11:31:50.385 INFO 19000 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@7f552bd3: startup date [Thu Mar 01 11:31:42 CST 2018]; root of context hierarchy
2018-03-01 11:31:50.498 INFO 19000 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2018-03-01 11:31:50.501 INFO 19000 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2018-03-01 11:31:50.548 INFO 19000 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-03-01 11:31:50.549 INFO 19000 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-03-01 11:31:50.629 INFO 19000 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-03-01 11:31:50.982 INFO 19000 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
2018-03-01 11:31:51.074 INFO 19000 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2018-03-01 11:31:51.080 INFO 19000 --- [ main] com.xmp.ElasticsearchApplication : --ElasticSearch-->
2018-03-01 11:31:51.080 INFO 19000 --- [ main] com.xmp.ElasticsearchApplication : client.type=transport
2018-03-01 11:31:51.081 INFO 19000 --- [ main] com.xmp.ElasticsearchApplication : cluster.name=xmp-cluster
2018-03-01 11:31:51.081 INFO 19000 --- [ main] com.xmp.ElasticsearchApplication : name=Death's Head II
2018-03-01 11:31:51.081 INFO 19000 --- [ main] com.xmp.ElasticsearchApplication : network.server=false
2018-03-01 11:31:51.081 INFO 19000 --- [ main] com.xmp.ElasticsearchApplication : node.client=true
2018-03-01 11:31:51.081 INFO 19000 --- [ main] com.xmp.ElasticsearchApplication : transport.ping_schedule=5s
Article(id=0, title=title, abstracts=abs, content=content, postTime=Thu Mar 01 11:31:51 CST 2018, clickCount=0, author=Author(id=null, name=xmp, remark=null), tutorial=Tutorial(id=0, name=test0))
Article(id=5, title=title, abstracts=abs, content=content, postTime=Thu Mar 01 11:31:52 CST 2018, clickCount=5, author=Author(id=null, name=xmp, remark=null), tutorial=Tutorial(id=5, name=test5))
Article(id=8, title=title, abstracts=abs, content=content, postTime=Thu Mar 01 11:31:52 CST 2018, clickCount=8, author=Author(id=null, name=xmp, remark=null), tutorial=Tutorial(id=8, name=test8))
Article(id=9, title=title, abstracts=abs, content=content, postTime=Thu Mar 01 11:31:53 CST 2018, clickCount=9, author=Author(id=null, name=xmp, remark=null), tutorial=Tutorial(id=9, name=test9))
Article(id=2, title=title, abstracts=abs, content=content, postTime=Thu Mar 01 11:31:52 CST 2018, clickCount=2, author=Author(id=null, name=xmp, remark=null), tutorial=Tutorial(id=2, name=test2))
Article(id=4, title=title, abstracts=abs, content=content, postTime=Thu Mar 01 11:31:52 CST 2018, clickCount=4, author=Author(id=null, name=xmp, remark=null), tutorial=Tutorial(id=4, name=test4))
Article(id=6, title=title, abstracts=abs, content=content, postTime=Thu Mar 01 11:31:52 CST 2018, clickCount=6, author=Author(id=null, name=xmp, remark=null), tutorial=Tutorial(id=6, name=test6))
Article(id=1, title=title, abstracts=abs, content=content, postTime=Thu Mar 01 11:31:51 CST 2018, clickCount=1, author=Author(id=null, name=xmp, remark=null), tutorial=Tutorial(id=1, name=test1))
Article(id=7, title=title, abstracts=abs, content=content, postTime=Thu Mar 01 11:31:52 CST 2018, clickCount=7, author=Author(id=null, name=xmp, remark=null), tutorial=Tutorial(id=7, name=test7))
Article(id=3, title=title, abstracts=abs, content=content, postTime=Thu Mar 01 11:31:52 CST 2018, clickCount=3, author=Author(id=null, name=xmp, remark=null), tutorial=Tutorial(id=3, name=test3))
2018-03-01 11:31:53.335 INFO 19000 --- [ main] com.xmp.ElasticsearchApplication : Started ElasticsearchApplication in 12.028 seconds (JVM running for 13.188)

When we run the application, our data is stored at ${ELASTICSEARCH_HOME}\data\mkyong-cluster.
5.3 Maven package and run it.
$ mvn clean package
$ java -jar target/elasticsearch-0.0.1-SNAPSHOT.jar

5.4 Test with cURL tool.
Terminal:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
$ curl "http://localhost:9200/xmp/news/_search?pretty=true"
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0{
"took" : 5,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 10,
"max_score" : 1.0,
"hits" : [ {
"_index" : "xmp",
"_type" : "news",
"_id" : "0",
"_score" : 1.0,
"_source" : {
"id" : 0,
"title" : "title",
"abstracts" : "abs",
"content" : "content",
"postTime" : 1519875605867,
"clickCount" : 0,
"author" : {
"id" : null,
"name" : "xmp",
"remark" : null
},
"tutorial" : {
"id" : 0,
"name" : "test0"
}
}
}, {
"_index" : "xmp",
"_type" : "news",
"_id" : "5",
"_score" : 1.0,
"_source" : {
"id" : 5,
"title" : "title",
"abstracts" : "abs",
"content" : "content",
"postTime" : 1519875607354,
"clickCount" : 5,
"author" : {
"id" : null,
"name" : "xmp",
"remark" : null
},
"tutorial" : {
"id" : 5,
"name" : "test5"
}
}
}, {
"_index" : "xmp",
"_type" : "news",
"_id" : "8",
"_score" : 1.0,
"_source" : {
"id" : 8,
"title" : "title",
"abstracts" : "abs",
"content" : "content",
"postTime" : 1519875608116,
"clickCount" : 8,
"author" : {
"id" : null,
"name" : "xmp",
"remark" : null
},
"tutorial" : {
"id" : 8,
"name" : "test8"
}
}
}, {
"_index" : "xmp",
"_type" : "news",
"_id" : "9",
"_score" : 1.0,
"_source" : {
"id" : 9,
"title" : "title",
"abstracts" : "abs",
"content" : "content",
"postTime" : 1519875608240,
"clickCount" : 9,
"author" : {
"id" : null,
"name" : "xmp",
"remark" : null
},
"tutorial" : {
"id" : 9,
"name" : "test9"
}
}
}, {
"_index" : "xmp",
"_type" : "news",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"id" : 2,
"title" : "title",
"abstracts" : "abs",
"content" : "content",
"postTime" : 1519875606420,
"clickCount" : 2,
"author" : {
"id" : null,
"name" : "xmp",
"remark" : null
},
"tutorial" : {
"id" : 2,
"name" : "test2"
}
}
}, {
"_index" : "xmp",
"_type" : "news",
"_id" : "4",
"_score" : 1.0,
"_source" : {
"id" : 4,
"title" : "title",
"abstracts" : "abs",
"content" : "content",
"postTime" : 1519875606995,
"clickCount" : 4,
"author" : {
"id" : null,
"name" : "xmp",
"remark" : null
},
"tutorial" : {
"id" : 4,
"name" : "test4"
}
}
}, {
"_index" : "xmp",
"_type" : "news",
"_id" : "6",
"_score" : 1.0,
"_source" : {
"id" : 6,
"title" : "title",
"abstracts" : "abs",
"content" : "content",
"postTime" : 1519875607634,
"clickCount" : 6,
"author" : {
"id" : null,
"name" : "xmp",
"remark" : null
},
"tutorial" : {
"id" : 6,
"name" : "test6"
}
}
}, {
"_index" : "xmp",
"_type" : "news",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"id" : 1,
"title" : "title",
"abstracts" : "abs",
"content" : "content",
"postTime" : 1519875606181,
"clickCount" : 1,
"author" : {
"id" : null,
"name" : "xmp",
"remark" : null
},
"tutorial" : {
"id" : 1,
"name" : "test1"
}
}
}, {
"_index" : "xmp",
"_type" : "news",
"_id" : "7",
100 4992 100 4992 0 0 325k 0 --:--:-- --:--:-- --:--:-- 4875k "_score" : 1.0,
"_source" : {
"id" : 7,
"title" : "title",
"abstracts" : "abs",
"content" : "content",
"postTime" : 1519875607923,
"clickCount" : 7,
"author" : {
"id" : null,
"name" : "xmp",
"remark" : null
},
"tutorial" : {
"id" : 7,
"name" : "test7"
}
}
}, {
"_index" : "xmp",
"_type" : "news",
"_id" : "3",
"_score" : 1.0,
"_source" : {
"id" : 3,
"title" : "title",
"abstracts" : "abs",
"content" : "content",
"postTime" : 1519875606716,
"clickCount" : 3,
"author" : {
"id" : null,
"name" : "xmp",
"remark" : null
},
"tutorial" : {
"id" : 3,
"name" : "test3"
}
}
} ]
}
}

Terminal:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
$ curl "http://localhost:9200/xmp/news/_search?q=_id:3&pretty=true"
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 672 100 672 0 0 10666 0 --:--:-- --:--:-- --:--:-- 14297{
"took" : 22,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 1.0,
"hits" : [ {
"_index" : "xmp",
"_type" : "news",
"_id" : "3",
"_score" : 1.0,
"_source" : {
"id" : 3,
"title" : "title",
"abstracts" : "abs",
"content" : "content",
"postTime" : 1519875606716,
"clickCount" : 3,
"author" : {
"id" : null,
"name" : "xmp",
"remark" : null
},
"tutorial" : {
"id" : 3,
"name" : "test3"
}
}
} ]
}
}

参考文章

-------------本文结束感谢您的阅读-------------