Skip to content

Commit 758102e

Browse files
committed
add elasticsearch example
1 parent 4dbdb96 commit 758102e

File tree

9 files changed

+366
-0
lines changed

9 files changed

+366
-0
lines changed

spring-boot-elasticsearch/pom.xml

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
6+
<groupId>com.neo</groupId>
7+
<artifactId>spring-boot-elasticsearch</artifactId>
8+
<version>1.0</version>
9+
<packaging>jar</packaging>
10+
11+
<name>spring-boot-elasticsearch</name>
12+
<description>Demo project for Spring Boot</description>
13+
14+
<parent>
15+
<groupId>org.springframework.boot</groupId>
16+
<artifactId>spring-boot-starter-parent</artifactId>
17+
<version>2.1.0.RELEASE</version>
18+
</parent>
19+
20+
<properties>
21+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
22+
<java.version>1.8</java.version>
23+
</properties>
24+
25+
<dependencies>
26+
<dependency>
27+
<groupId>org.springframework.boot</groupId>
28+
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
29+
</dependency>
30+
<dependency>
31+
<groupId>org.springframework.boot</groupId>
32+
<artifactId>spring-boot-starter-test</artifactId>
33+
<scope>test</scope>
34+
</dependency>
35+
</dependencies>
36+
37+
<build>
38+
<plugins>
39+
<plugin>
40+
<groupId>org.springframework.boot</groupId>
41+
<artifactId>spring-boot-maven-plugin</artifactId>
42+
</plugin>
43+
</plugins>
44+
</build>
45+
46+
47+
</project>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.neo;
2+
3+
import org.springframework.boot.SpringApplication;
4+
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
6+
@SpringBootApplication
7+
public class ElasticsearchApplication {
8+
9+
public static void main(String[] args) {
10+
SpringApplication.run(ElasticsearchApplication.class, args);
11+
}
12+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
2+
package com.neo.model;
3+
4+
import org.springframework.data.annotation.Id;
5+
import org.springframework.data.elasticsearch.annotations.Document;
6+
import org.springframework.data.elasticsearch.annotations.Field;
7+
8+
@Document(indexName = "customer", type = "customer", shards = 1, replicas = 0, refreshInterval = "-1")
9+
public class Customer {
10+
11+
//Id注解加上后,在Elasticsearch里相应于该列就是主键了,在查询时就可以直接用主键查询
12+
@Id
13+
private String id;
14+
15+
private String userName;
16+
17+
private String address;
18+
19+
private int age;
20+
21+
public Customer() {
22+
}
23+
24+
public Customer(String userName, String address, int age) {
25+
this.userName = userName;
26+
this.address = address;
27+
this.age = age;
28+
}
29+
30+
public String getId() {
31+
return this.id;
32+
}
33+
34+
public void setId(String id) {
35+
this.id = id;
36+
}
37+
38+
public String getUserName() {
39+
return userName;
40+
}
41+
42+
public void setUserName(String userName) {
43+
this.userName = userName;
44+
}
45+
46+
public String getAddress() {
47+
return address;
48+
}
49+
50+
public int getAge() {
51+
return age;
52+
}
53+
54+
public void setAge(int age) {
55+
this.age = age;
56+
}
57+
58+
public void setAddress(String address) {
59+
this.address = address;
60+
}
61+
62+
@Override
63+
public String toString() {
64+
return "Customer{" +
65+
"id='" + id + '\'' +
66+
", userName='" + userName + '\'' +
67+
", address='" + address + '\'' +
68+
", age=" + age +
69+
'}';
70+
}
71+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
2+
package com.neo.repository;
3+
4+
import com.neo.model.Customer;
5+
import org.springframework.data.domain.Page;
6+
import org.springframework.data.domain.Pageable;
7+
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
8+
9+
import java.util.List;
10+
11+
12+
public interface CustomerRepository extends ElasticsearchRepository<Customer, String> {
13+
public List<Customer> findByAddress(String address);
14+
public Customer findByUserName(String userName);
15+
public int deleteByUserName(String userName);
16+
public Page<Customer> findByAddress(String address, Pageable pageable);
17+
18+
19+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.neo.service;
2+
3+
import com.neo.model.Customer;
4+
5+
import java.util.List;
6+
7+
public interface CustomersInterface {
8+
9+
public List<Customer> searchCity(Integer pageNumber, Integer pageSize, String searchContent);
10+
11+
12+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.neo.service.impl;
2+
3+
import com.neo.model.Customer;
4+
import com.neo.repository.CustomerRepository;
5+
import com.neo.service.CustomersInterface;
6+
import org.elasticsearch.index.query.QueryBuilders;
7+
import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;
8+
import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders;
9+
import org.slf4j.Logger;
10+
import org.slf4j.LoggerFactory;
11+
import org.springframework.beans.factory.annotation.Autowired;
12+
import org.springframework.data.domain.Page;
13+
import org.springframework.data.domain.PageRequest;
14+
import org.springframework.data.domain.Pageable;
15+
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
16+
import org.springframework.data.elasticsearch.core.query.SearchQuery;
17+
18+
import java.util.List;
19+
20+
public class CustomersInterfaceImpl implements CustomersInterface {
21+
22+
Logger logger= LoggerFactory.getLogger(this.getClass());
23+
@Autowired
24+
private CustomerRepository customerRepository;
25+
26+
@Override
27+
public List<Customer> searchCity(Integer pageNumber, Integer pageSize, String searchContent) {
28+
/* // 分页参数
29+
Pageable pageable = new PageRequest(pageNumber, pageSize);
30+
31+
// Function Score Query
32+
FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery()
33+
.add(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("cityname", searchContent)),
34+
ScoreFunctionBuilders.weightFactorFunction(1000))
35+
.add(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("description", searchContent)),
36+
ScoreFunctionBuilders.weightFactorFunction(100));
37+
38+
// 创建搜索 DSL 查询
39+
SearchQuery searchQuery = new NativeSearchQueryBuilder()
40+
.withPageable(pageable)
41+
.withQuery(functionScoreQueryBuilder).build();
42+
43+
logger.info("\n searchCity(): searchContent [" + searchContent + "] \n DSL = \n " + searchQuery.getQuery().toString());
44+
45+
Page<Customer> searchPageResults = customerRepository.search(searchQuery);
46+
return searchPageResults.getContent();
47+
*/
48+
return null;
49+
}
50+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
spring.data.elasticsearch.cluster-name=es-mongodb
2+
spring.data.elasticsearch.cluster-nodes=192.168.0.53:9300
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.neo;
2+
3+
import org.junit.Test;
4+
import org.junit.runner.RunWith;
5+
import org.springframework.boot.test.context.SpringBootTest;
6+
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
7+
import org.springframework.test.context.junit4.SpringRunner;
8+
9+
@RunWith(SpringRunner.class)
10+
@SpringBootTest
11+
public class ElasticsearchApplicationTests {
12+
13+
@Test
14+
public void contextLoads() {
15+
System.out.println("Spring Boot Test");
16+
}
17+
18+
}
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
package com.neo.repository;
2+
3+
import com.neo.model.Customer;
4+
import org.elasticsearch.action.search.SearchResponse;
5+
import org.elasticsearch.index.query.QueryBuilder;
6+
import org.elasticsearch.index.query.QueryBuilders;
7+
import org.elasticsearch.search.aggregations.Aggregation;
8+
import org.elasticsearch.search.aggregations.AggregationBuilders;
9+
import org.elasticsearch.search.aggregations.Aggregations;
10+
import org.elasticsearch.search.aggregations.metrics.sum.InternalSum;
11+
import org.elasticsearch.search.aggregations.metrics.sum.SumAggregationBuilder;
12+
import org.junit.Test;
13+
import org.junit.runner.RunWith;
14+
import org.springframework.beans.factory.annotation.Autowired;
15+
import org.springframework.boot.test.context.SpringBootTest;
16+
import org.springframework.data.domain.Page;
17+
import org.springframework.data.domain.PageRequest;
18+
import org.springframework.data.domain.Pageable;
19+
import org.springframework.data.domain.Sort;
20+
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
21+
import org.springframework.data.elasticsearch.core.ResultsExtractor;
22+
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
23+
import org.springframework.data.elasticsearch.core.query.SearchQuery;
24+
import org.springframework.test.context.junit4.SpringRunner;
25+
26+
import java.util.List;
27+
import java.util.Map;
28+
29+
@RunWith(SpringRunner.class)
30+
@SpringBootTest
31+
public class CustomerRepositoryTest {
32+
@Autowired
33+
private CustomerRepository repository;
34+
@Autowired
35+
private ElasticsearchTemplate elasticsearchTemplate;
36+
37+
@Test
38+
public void saveCustomers() {
39+
repository.save(new Customer("Alice", "北京",13));
40+
repository.save(new Customer("Bob", "北京",23));
41+
repository.save(new Customer("neo", "西安",30));
42+
repository.save(new Customer("summer", "烟台",22));
43+
}
44+
45+
@Test
46+
public void fetchAllCustomers() {
47+
System.out.println("Customers found with findAll():");
48+
System.out.println("-------------------------------");
49+
Iterable<Customer> iterable=repository.findAll();
50+
for (Customer customer :iterable) {
51+
System.out.println(customer);
52+
}
53+
}
54+
55+
@Test
56+
public void deleteCustomers() {
57+
repository.deleteAll();
58+
// repository.deleteByUserName("neo");
59+
}
60+
61+
@Test
62+
public void updateCustomers() {
63+
Customer customer= repository.findByUserName("summer");
64+
System.out.println(customer);
65+
customer.setAddress("北京市海淀区西直门");
66+
repository.save(customer);
67+
Customer xcustomer=repository.findByUserName("summer");
68+
System.out.println(xcustomer);
69+
}
70+
71+
@Test
72+
public void fetchIndividualCustomers() {
73+
System.out.println("Customer found with findByUserName('summer'):");
74+
System.out.println("--------------------------------");
75+
System.out.println(repository.findByUserName("summer"));
76+
System.out.println("--------------------------------");
77+
System.out.println("Customers found with findByAddress(\"北京\"):");
78+
String q="北京";
79+
for (Customer customer : repository.findByAddress(q)) {
80+
System.out.println(customer);
81+
}
82+
}
83+
84+
@Test
85+
public void fetchPageCustomers() {
86+
System.out.println("Customers found with fetchPageCustomers:");
87+
System.out.println("-------------------------------");
88+
Sort sort = new Sort(Sort.Direction.DESC, "address.keyword");
89+
Pageable pageable = PageRequest.of(0, 10, sort);
90+
Page<Customer> customers=repository.findByAddress("北京", pageable);
91+
System.out.println("Page customers "+customers.getContent().toString());
92+
}
93+
94+
@Test
95+
public void fetchPage2Customers() {
96+
System.out.println("Customers found with fetchPageCustomers:");
97+
System.out.println("-------------------------------");
98+
QueryBuilder customerQuery = QueryBuilders.boolQuery()
99+
.must(QueryBuilders.matchQuery("address", "北京"));
100+
Page<Customer> page = repository.search(customerQuery, PageRequest.of(0, 10));
101+
System.out.println("Page customers "+page.getContent().toString());
102+
page = repository.search(customerQuery, PageRequest.of(1, 10));
103+
System.out.println("Page customers "+page.getContent().toString());
104+
}
105+
106+
@Test
107+
public void fetchAggregation() {
108+
System.out.println("Customers found with fetchAggregation:");
109+
System.out.println("-------------------------------");
110+
111+
QueryBuilder customerQuery = QueryBuilders.boolQuery()
112+
.must(QueryBuilders.matchQuery("address", "北京"));
113+
114+
SumAggregationBuilder sumBuilder = AggregationBuilders.sum("sumAge").field("age");
115+
116+
SearchQuery searchQuery = new NativeSearchQueryBuilder()
117+
.withQuery(customerQuery)
118+
.addAggregation(sumBuilder)
119+
.build();
120+
121+
Aggregations aggregations = elasticsearchTemplate.query(searchQuery, new ResultsExtractor<Aggregations>() {
122+
@Override
123+
public Aggregations extract(SearchResponse response) {
124+
return response.getAggregations();
125+
}
126+
});
127+
128+
//转换成map集合
129+
Map<String, Aggregation> aggregationMap = aggregations.asMap();
130+
//获得对应的聚合函数的聚合子类,该聚合子类也是个map集合,里面的value就是桶Bucket,我们要获得Bucket
131+
InternalSum sumAge = (InternalSum) aggregationMap.get("sumAge");
132+
System.out.println("sum age is "+sumAge.getValue());
133+
}
134+
135+
}

0 commit comments

Comments
 (0)