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()); + } + +}