Browse Source

add elasticsearch example

纯洁的微笑 6 years ago
parent
commit
758102ecf6

+ 47 - 0
spring-boot-elasticsearch/pom.xml

@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<groupId>com.neo</groupId>
+	<artifactId>spring-boot-elasticsearch</artifactId>
+	<version>1.0</version>
+	<packaging>jar</packaging>
+
+	<name>spring-boot-elasticsearch</name>
+	<description>Demo project for Spring Boot</description>
+
+	<parent>
+		<groupId>org.springframework.boot</groupId>
+		<artifactId>spring-boot-starter-parent</artifactId>
+		<version>2.1.0.RELEASE</version>
+	</parent>
+
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<java.version>1.8</java.version>
+	</properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-test</artifactId>
+			<scope>test</scope>
+		</dependency>
+    </dependencies>
+	
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.springframework.boot</groupId>
+				<artifactId>spring-boot-maven-plugin</artifactId>
+			</plugin>
+		</plugins>
+	</build>
+	
+
+</project>

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

+ 71 - 0
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 +
+				'}';
+	}
+}

+ 19 - 0
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<Customer, String> {
+	public List<Customer> findByAddress(String address);
+	public Customer findByUserName(String userName);
+	public int  deleteByUserName(String userName);
+	public Page<Customer> findByAddress(String address, Pageable pageable);
+
+
+}

+ 12 - 0
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<Customer> searchCity(Integer pageNumber, Integer pageSize, String searchContent);
+
+
+}

+ 50 - 0
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<Customer> 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<Customer> searchPageResults = customerRepository.search(searchQuery);
+        return searchPageResults.getContent();
+        */
+        return null;
+    }
+}

+ 2 - 0
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

+ 18 - 0
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");
+	}
+
+}

+ 135 - 0
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<Customer> 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<Customer> 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<Customer> 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<Aggregations>() {
+            @Override
+            public Aggregations extract(SearchResponse response) {
+                return response.getAggregations();
+            }
+        });
+
+       //转换成map集合
+        Map<String, Aggregation> aggregationMap = aggregations.asMap();
+        //获得对应的聚合函数的聚合子类,该聚合子类也是个map集合,里面的value就是桶Bucket,我们要获得Bucket
+        InternalSum sumAge = (InternalSum) aggregationMap.get("sumAge");
+        System.out.println("sum age is "+sumAge.getValue());
+    }
+
+}