Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 758102e

Browse files
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)

AltStyle によって変換されたページ (->オリジナル) /