Прежде чем приступить к этой статье, вам необходимо установить ElasticSearch. Если у вас Mac или Linux, вы можете обратиться ку-у-у. Краткое описание.com/afraid/oh 47 no 45137…, Если это Windows, вы можете настроить Baidu.
Ниже приведена официальная формула для введения elasticsearch:
ElasticSearch — это поисковый сервер на базе Lucene. Он предоставляет распределенную многопользовательскую полнотекстовую поисковую систему на основе веб-интерфейса RESTful. Elasticsearch, разработанный на языке Java и выпущенный с открытым исходным кодом в соответствии с условиями лицензии Apache, в настоящее время является популярной корпоративной поисковой системой. Разработанный для использования в облачных вычислениях, он обеспечивает поиск в реальном времени, стабильный, надежный, быстрый и простой в установке и использовании. Мы создаем веб-сайт или приложение и хотим добавить функцию поиска, но создать поисковое задание очень сложно. Мы хотим, чтобы наше решение для поиска было быстрым, нам нужна нулевая конфигурация и полностью бесплатный режим поиска, мы хотим иметь возможность просто использовать JSON для индексации данных по HTTP, мы хотим, чтобы наш поисковый сервер был всегда доступен, мы хотим быть Мы можем начать с одного и масштабировать до сотен, нам нужен поиск в реальном времени, нам нужна простая мультиарендность, и мы хотим создать облачное решение. Поэтому мы используем Elasticsearch для решения всех этих и многих других проблем, которые могут возникнуть.
Конкретные вопросы, связанные с elasticsearch, можно найти на страницеупругое китайское сообществоПроверять.
В этой статье будет рассказано, как Springboot может легко интегрировать elasticsearch.
1. Запустите поиск эластичных материалов.
2. Создайте новый проект и добавьте зависимости elasticsearch в файл pom.Полный pom выглядит следующим образом:
<?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.dalaoyang</groupId>
<artifactId>springboot_elasticsearch</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springboot_elasticsearch</name>
<description>springboot_elasticsearch</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<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-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</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>
Файл конфигурации выглядит следующим образом:
##端口号
server.port=8888
##es地址
spring.data.elasticsearch.cluster-nodes = 127.0.0.1:9300
Создайте новый класс товарной сущности GoodsInfo, который требует внимания:
indexName: имя индекса можно понимать как имя базы данных, которое должно быть в нижнем регистре, иначе будет сообщено об исключении org.elasticsearch.indices.InvalidIndexNameException.
тип: тип можно понимать как имя таблицы
package com.dalaoyang.entity;
import org.springframework.data.elasticsearch.annotations.Document;
import java.io.Serializable;
/**
* @author dalaoyang
* @Description
* @project springboot_learn
* @package com.dalaoyang.entity
* @email yangyang@dalaoyang.cn
* @date 2018/5/4
*/
@Document(indexName = "testgoods",type = "goods")
//indexName索引名称 可以理解为数据库名 必须为小写 不然会报org.elasticsearch.indices.InvalidIndexNameException异常
//type类型 可以理解为表名
public class GoodsInfo implements Serializable {
private Long id;
private String name;
private String description;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public GoodsInfo(Long id, String name, String description) {
this.id = id;
this.name = name;
this.description = description;
}
public GoodsInfo() {
}
}
Создаем GoodsRepository, наследуем ElasticsearchRepository, код такой:
package com.dalaoyang.repository;
import com.dalaoyang.entity.GoodsInfo;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Component;
/**
* @author dalaoyang
* @Description
* @project springboot_learn
* @package com.dalaoyang.repository
* @email yangyang@dalaoyang.cn
* @date 2018/5/4
*/
@Component
public interface GoodsRepository extends ElasticsearchRepository<GoodsInfo,Long> {
}
Наконец, создайте новый контроллер для тестирования, который включает в себя простые добавления, удаления и изменения, а также поиск. Добавления, удаления и изменения здесь не объясняются. Следует отметить, что номер первой страницы es равен 0
package com.dalaoyang.controller;
import com.dalaoyang.entity.GoodsInfo;
import com.dalaoyang.repository.GoodsRepository;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;
import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders;
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 org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @author dalaoyang
* @Description
* @project springboot_learn
* @package com.dalaoyang.controller
* @email yangyang@dalaoyang.cn
* @date 2018/5/4
*/
@RestController
public class GoodsController {
@Autowired
private GoodsRepository goodsRepository;
//http://localhost:8888/save
@GetMapping("save")
public String save(){
GoodsInfo goodsInfo = new GoodsInfo(System.currentTimeMillis(),
"商品"+System.currentTimeMillis(),"这是一个测试商品");
goodsRepository.save(goodsInfo);
return "success";
}
//http://localhost:8888/delete?id=1525415333329
@GetMapping("delete")
public String delete(long id){
goodsRepository.delete(id);
return "success";
}
//http://localhost:8888/update?id=1525417362754&name=修改&description=修改
@GetMapping("update")
public String update(long id,String name,String description){
GoodsInfo goodsInfo = new GoodsInfo(id,
name,description);
goodsRepository.save(goodsInfo);
return "success";
}
//http://localhost:8888/getOne?id=1525417362754
@GetMapping("getOne")
public GoodsInfo getOne(long id){
GoodsInfo goodsInfo = goodsRepository.findOne(id);
return goodsInfo;
}
//每页数量
private Integer PAGESIZE=10;
//http://localhost:8888/getGoodsList?query=商品
//http://localhost:8888/getGoodsList?query=商品&pageNumber=1
//根据关键字"商品"去查询列表,name或者description包含的都查询
@GetMapping("getGoodsList")
public List<GoodsInfo> getList(Integer pageNumber,String query){
if(pageNumber==null) pageNumber = 0;
//es搜索默认第一页页码是0
SearchQuery searchQuery=getEntitySearchQuery(pageNumber,PAGESIZE,query);
Page<GoodsInfo> goodsPage = goodsRepository.search(searchQuery);
return goodsPage.getContent();
}
private SearchQuery getEntitySearchQuery(int pageNumber, int pageSize, String searchContent) {
FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery()
.add(QueryBuilders.matchPhraseQuery("name", searchContent),
ScoreFunctionBuilders.weightFactorFunction(100))
.add(QueryBuilders.matchPhraseQuery("description", searchContent),
ScoreFunctionBuilders.weightFactorFunction(100))
//设置权重分 求和模式
.scoreMode("sum")
//设置权重分最低分
.setMinScore(10);
// 设置分页
Pageable pageable = new PageRequest(pageNumber, pageSize);
return new NativeSearchQueryBuilder()
.withPageable(pageable)
.withQuery(functionScoreQueryBuilder).build();
}
}
Запустите проект, сначала вызовите метод http://localhost:8888/save, вставьте несколько фрагментов данных, а затем перейдите на страницу управления eshttp://localhost:9200/_plugin/head/,Как показано ниже
доступhttp://localhost:8888/getGoodsList?query=Товары, как показано на рисунке:
Загрузка исходного кода:Большой Лао Ян Маюн
Персональный сайт:www.dalaoyang.cn