diff --git a/spring-boot-elasticsearch/pom.xml b/spring-boot-elasticsearch/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..939098a08d8be0883d4a92c74e13745b47a5f0c0
--- /dev/null
+++ b/spring-boot-elasticsearch/pom.xml
@@ -0,0 +1,47 @@
+
+
+ 4.0.0
+
+ com.neo
+ spring-boot-elasticsearch
+ 1.0
+ jar
+
+ spring-boot-elasticsearch
+ Demo project for Spring Boot
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.1.0.RELEASE
+
+
+
+ UTF-8
+ 1.8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-elasticsearch
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
+
diff --git a/spring-boot-elasticsearch/src/main/java/com/neo/ElasticsearchApplication.java b/spring-boot-elasticsearch/src/main/java/com/neo/ElasticsearchApplication.java
new file mode 100644
index 0000000000000000000000000000000000000000..e16db52a388b4180d7cc1e8004e6711c61438f64
--- /dev/null
+++ b/spring-boot-elasticsearch/src/main/java/com/neo/ElasticsearchApplication.java
@@ -0,0 +1,12 @@
+package com.neo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class ElasticsearchApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ElasticsearchApplication.class, args);
+ }
+}
diff --git a/spring-boot-elasticsearch/src/main/java/com/neo/model/Customer.java b/spring-boot-elasticsearch/src/main/java/com/neo/model/Customer.java
new file mode 100644
index 0000000000000000000000000000000000000000..e71076db0c9e4caca6bf25d996bdf798d27a0b3e
--- /dev/null
+++ b/spring-boot-elasticsearch/src/main/java/com/neo/model/Customer.java
@@ -0,0 +1,71 @@
+
+package com.neo.model;
+
+import org.springframework.data.annotation.Id;
+import org.springframework.data.elasticsearch.annotations.Document;
+import org.springframework.data.elasticsearch.annotations.Field;
+
+@Document(indexName = "customer", type = "customer", shards = 1, replicas = 0, refreshInterval = "-1")
+public class Customer {
+
+ //Id注解加上后,在Elasticsearch里相应于该列就是主键了,在查询时就可以直接用主键查询
+ @Id
+ private String id;
+
+ private String userName;
+
+ private String address;
+
+ private int age;
+
+ public Customer() {
+ }
+
+ public Customer(String userName, String address, int age) {
+ this.userName = userName;
+ this.address = address;
+ this.age = age;
+ }
+
+ public String getId() {
+ return this.id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public void setUserName(String userName) {
+ this.userName = userName;
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ @Override
+ public String toString() {
+ return "Customer{" +
+ "id='" + id + '\'' +
+ ", userName='" + userName + '\'' +
+ ", address='" + address + '\'' +
+ ", age=" + age +
+ '}';
+ }
+}
diff --git a/spring-boot-elasticsearch/src/main/java/com/neo/repository/CustomerRepository.java b/spring-boot-elasticsearch/src/main/java/com/neo/repository/CustomerRepository.java
new file mode 100644
index 0000000000000000000000000000000000000000..fec24b4d4574c2cfc3fb63debeb8120e84d0e1e4
--- /dev/null
+++ b/spring-boot-elasticsearch/src/main/java/com/neo/repository/CustomerRepository.java
@@ -0,0 +1,19 @@
+
+package com.neo.repository;
+
+import com.neo.model.Customer;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
+
+import java.util.List;
+
+
+public interface CustomerRepository extends ElasticsearchRepository {
+ public List findByAddress(String address);
+ public Customer findByUserName(String userName);
+ public int deleteByUserName(String userName);
+ public Page findByAddress(String address, Pageable pageable);
+
+
+}
diff --git a/spring-boot-elasticsearch/src/main/java/com/neo/service/CustomersInterface.java b/spring-boot-elasticsearch/src/main/java/com/neo/service/CustomersInterface.java
new file mode 100644
index 0000000000000000000000000000000000000000..ad36175a908689c00090310c4c00e4f8c087564a
--- /dev/null
+++ b/spring-boot-elasticsearch/src/main/java/com/neo/service/CustomersInterface.java
@@ -0,0 +1,12 @@
+package com.neo.service;
+
+import com.neo.model.Customer;
+
+import java.util.List;
+
+public interface CustomersInterface {
+
+ public List searchCity(Integer pageNumber, Integer pageSize, String searchContent);
+
+
+}
diff --git a/spring-boot-elasticsearch/src/main/java/com/neo/service/impl/CustomersInterfaceImpl.java b/spring-boot-elasticsearch/src/main/java/com/neo/service/impl/CustomersInterfaceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..742a52b1daed2635c5c0775d5ff40ad832195f3d
--- /dev/null
+++ b/spring-boot-elasticsearch/src/main/java/com/neo/service/impl/CustomersInterfaceImpl.java
@@ -0,0 +1,50 @@
+package com.neo.service.impl;
+
+import com.neo.model.Customer;
+import com.neo.repository.CustomerRepository;
+import com.neo.service.CustomersInterface;
+import org.elasticsearch.index.query.QueryBuilders;
+import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;
+import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
+import org.springframework.data.elasticsearch.core.query.SearchQuery;
+
+import java.util.List;
+
+public class CustomersInterfaceImpl implements CustomersInterface {
+
+ Logger logger= LoggerFactory.getLogger(this.getClass());
+ @Autowired
+ private CustomerRepository customerRepository;
+
+ @Override
+ public List searchCity(Integer pageNumber, Integer pageSize, String searchContent) {
+/* // 分页参数
+ Pageable pageable = new PageRequest(pageNumber, pageSize);
+
+ // Function Score Query
+ FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery()
+ .add(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("cityname", searchContent)),
+ ScoreFunctionBuilders.weightFactorFunction(1000))
+ .add(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("description", searchContent)),
+ ScoreFunctionBuilders.weightFactorFunction(100));
+
+ // 创建搜索 DSL 查询
+ SearchQuery searchQuery = new NativeSearchQueryBuilder()
+ .withPageable(pageable)
+ .withQuery(functionScoreQueryBuilder).build();
+
+ logger.info("\n searchCity(): searchContent [" + searchContent + "] \n DSL = \n " + searchQuery.getQuery().toString());
+
+ Page searchPageResults = customerRepository.search(searchQuery);
+ return searchPageResults.getContent();
+ */
+ return null;
+ }
+}
diff --git a/spring-boot-elasticsearch/src/main/resources/application.properties b/spring-boot-elasticsearch/src/main/resources/application.properties
new file mode 100644
index 0000000000000000000000000000000000000000..6b48fb388e283694e229f28d461672dac48233c5
--- /dev/null
+++ b/spring-boot-elasticsearch/src/main/resources/application.properties
@@ -0,0 +1,2 @@
+spring.data.elasticsearch.cluster-name=es-mongodb
+spring.data.elasticsearch.cluster-nodes=192.168.0.53:9300
\ No newline at end of file
diff --git a/spring-boot-elasticsearch/src/test/java/com/neo/ElasticsearchApplicationTests.java b/spring-boot-elasticsearch/src/test/java/com/neo/ElasticsearchApplicationTests.java
new file mode 100644
index 0000000000000000000000000000000000000000..4a07e8e842c91f37ebd3204822a5ccdce8478571
--- /dev/null
+++ b/spring-boot-elasticsearch/src/test/java/com/neo/ElasticsearchApplicationTests.java
@@ -0,0 +1,18 @@
+package com.neo;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class ElasticsearchApplicationTests {
+
+ @Test
+ public void contextLoads() {
+ System.out.println("Spring Boot Test");
+ }
+
+}
diff --git a/spring-boot-elasticsearch/src/test/java/com/neo/repository/CustomerRepositoryTest.java b/spring-boot-elasticsearch/src/test/java/com/neo/repository/CustomerRepositoryTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..a9e3c42861778c4dd74f1367a00ad24bd8d2c036
--- /dev/null
+++ b/spring-boot-elasticsearch/src/test/java/com/neo/repository/CustomerRepositoryTest.java
@@ -0,0 +1,135 @@
+package com.neo.repository;
+
+import com.neo.model.Customer;
+import org.elasticsearch.action.search.SearchResponse;
+import org.elasticsearch.index.query.QueryBuilder;
+import org.elasticsearch.index.query.QueryBuilders;
+import org.elasticsearch.search.aggregations.Aggregation;
+import org.elasticsearch.search.aggregations.AggregationBuilders;
+import org.elasticsearch.search.aggregations.Aggregations;
+import org.elasticsearch.search.aggregations.metrics.sum.InternalSum;
+import org.elasticsearch.search.aggregations.metrics.sum.SumAggregationBuilder;
+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.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
+import org.springframework.data.elasticsearch.core.ResultsExtractor;
+import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
+import org.springframework.data.elasticsearch.core.query.SearchQuery;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.List;
+import java.util.Map;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class CustomerRepositoryTest {
+ @Autowired
+ private CustomerRepository repository;
+ @Autowired
+ private ElasticsearchTemplate elasticsearchTemplate;
+
+ @Test
+ public void saveCustomers() {
+ repository.save(new Customer("Alice", "北京",13));
+ repository.save(new Customer("Bob", "北京",23));
+ repository.save(new Customer("neo", "西安",30));
+ repository.save(new Customer("summer", "烟台",22));
+ }
+
+ @Test
+ public void fetchAllCustomers() {
+ System.out.println("Customers found with findAll():");
+ System.out.println("-------------------------------");
+ Iterable iterable=repository.findAll();
+ for (Customer customer :iterable) {
+ System.out.println(customer);
+ }
+ }
+
+ @Test
+ public void deleteCustomers() {
+ repository.deleteAll();
+// repository.deleteByUserName("neo");
+ }
+
+ @Test
+ public void updateCustomers() {
+ Customer customer= repository.findByUserName("summer");
+ System.out.println(customer);
+ customer.setAddress("北京市海淀区西直门");
+ repository.save(customer);
+ Customer xcustomer=repository.findByUserName("summer");
+ System.out.println(xcustomer);
+ }
+
+ @Test
+ public void fetchIndividualCustomers() {
+ System.out.println("Customer found with findByUserName('summer'):");
+ System.out.println("--------------------------------");
+ System.out.println(repository.findByUserName("summer"));
+ System.out.println("--------------------------------");
+ System.out.println("Customers found with findByAddress(\"北京\"):");
+ String q="北京";
+ for (Customer customer : repository.findByAddress(q)) {
+ System.out.println(customer);
+ }
+ }
+
+ @Test
+ public void fetchPageCustomers() {
+ System.out.println("Customers found with fetchPageCustomers:");
+ System.out.println("-------------------------------");
+ Sort sort = new Sort(Sort.Direction.DESC, "address.keyword");
+ Pageable pageable = PageRequest.of(0, 10, sort);
+ Page customers=repository.findByAddress("北京", pageable);
+ System.out.println("Page customers "+customers.getContent().toString());
+ }
+
+ @Test
+ public void fetchPage2Customers() {
+ System.out.println("Customers found with fetchPageCustomers:");
+ System.out.println("-------------------------------");
+ QueryBuilder customerQuery = QueryBuilders.boolQuery()
+ .must(QueryBuilders.matchQuery("address", "北京"));
+ Page page = repository.search(customerQuery, PageRequest.of(0, 10));
+ System.out.println("Page customers "+page.getContent().toString());
+ page = repository.search(customerQuery, PageRequest.of(1, 10));
+ System.out.println("Page customers "+page.getContent().toString());
+ }
+
+ @Test
+ public void fetchAggregation() {
+ System.out.println("Customers found with fetchAggregation:");
+ System.out.println("-------------------------------");
+
+ QueryBuilder customerQuery = QueryBuilders.boolQuery()
+ .must(QueryBuilders.matchQuery("address", "北京"));
+
+ SumAggregationBuilder sumBuilder = AggregationBuilders.sum("sumAge").field("age");
+
+ SearchQuery searchQuery = new NativeSearchQueryBuilder()
+ .withQuery(customerQuery)
+ .addAggregation(sumBuilder)
+ .build();
+
+ Aggregations aggregations = elasticsearchTemplate.query(searchQuery, new ResultsExtractor() {
+ @Override
+ public Aggregations extract(SearchResponse response) {
+ return response.getAggregations();
+ }
+ });
+
+ //转换成map集合
+ Map aggregationMap = aggregations.asMap();
+ //获得对应的聚合函数的聚合子类,该聚合子类也是个map集合,里面的value就是桶Bucket,我们要获得Bucket
+ InternalSum sumAge = (InternalSum) aggregationMap.get("sumAge");
+ System.out.println("sum age is "+sumAge.getValue());
+ }
+
+}