spring boot elasticsearch 全文检索
Elastic Search是一个开源的,分布式,实时搜索和分析引擎。Spring Boot为Elasticsearch及Spring Data Elasticsearch提供的基于它的抽象提供了基本的配置。Spring Boot提供了一个用于聚集依赖的spring-boot-starter-data-elasticsearch 'StarterPOM'。
1.首先下载elasticsearch-6.4.2 安装
就是普通的zip包,然后解压。
启动 在bin目录下 ‘
elasticsearch.bat’
页面如下:说明安装成功

成功以后,就新建一个spring boot项目
目录如下:

Controller层:
package com.example.demo.controller; import com.example.demo.entity.Poem; import com.example.demo.service.PoemServiceImpl; 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.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import java.util.ArrayList; import java.util.List; /** * Created by linziyu on 2018/5/19. * 控制层 * */ @Controller public class WebController { @Autowired private PoemServiceImpl poemService; @RequestMapping("/") public String index(){ List<Poem> poems = new ArrayList<>(); poems.add(new Poem(4,"湘春夜月·近清明","近清明,翠禽枝上消魂,可惜一片清歌,都付与黄昏。欲共柳花低诉,怕柳花轻薄,不解伤春。念楚乡旅宿,柔情别绪,谁与温存。")); poems.add(new Poem(5,"卜算子·不是爱风尘","不是爱风尘,似被前缘误。花落花开自有时,总赖东君主。\n" + "去也终须去,住也如何住!若得山花插满头,莫问奴归处")); poems.add(new Poem(6,"御街行·秋日怀旧","纷纷坠叶飘香砌。夜寂静,寒声碎。真珠帘卷玉楼空,天淡银河垂地。年年今夜,月华如练,长是人千里。")); for(int i=0;i<poems.size();i++){ poemService.save(poems.get(i)); } return "/index"; } @RequestMapping("/tt") public String index1( @RequestParam(value="pageIndex",required=false,defaultValue="0") int pageIndex, @RequestParam(value="pageSize",required=false,defaultValue="10") int pageSize, Model model) { Pageable pageable = new PageRequest(pageIndex,pageSize); Page<Poem> poems = poemService.findAll(pageable); List<Poem> poems1 = poems.getContent(); model.addAttribute("poems",poems); return "/index"; } @RequestMapping("/t") public String index2(@RequestParam(value="content",required=false,defaultValue="香") String content, @RequestParam(value="pageIndex",required=false,defaultValue="0") int pageIndex, @RequestParam(value="pageSize",required=false,defaultValue="10") int pageSize, Model model) { Pageable pageable = new PageRequest(pageIndex,pageSize); Page<Poem> poems = poemService.search(content,pageable); List<Poem> list = poems.getContent(); model.addAttribute("poems",list); return "/t"; } @RequestMapping("/search") public String search(String content, @RequestParam(value="pageIndex",required=false,defaultValue="0") int pageIndex, @RequestParam(value="pageSize",required=false,defaultValue="10") int pageSize,Model model) { Pageable pageable = new PageRequest(pageIndex,pageSize); Page<Poem> poems = poemService.search(content,pageable); List<Poem> list = poems.getContent(); model.addAttribute("poems",list); return "/list"; } }
entity实体类:
package com.example.demo.entity; import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Document; /** * Created by linziyu on 2018/5/19. * 实体类 * * */ //定义索引名字及类型 @Document(indexName = "poem",type = "poem",shards = 1, replicas = 0) public class Poem { @Id private long id; private String title; private String content; public Poem(long id, String title, String content) { this.id = id; this.title = title; this.content = content; } public Poem(String title, String content) { this.title = title; this.content = content; } public Poem() { } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
接口以及实现类
package com.example.demo.service; import com.example.demo.entity.Poem; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; /** * Created by linziyu on 2018/5/19. * 业务逻辑 * */ public interface PoemService { //保存Poem实体 void save (Poem poem); //基于title和content进行搜索,返回分页 Page<Poem> search(String title, String content, Pageable pageable); //基于content进行搜索,返回分页 Page<Poem> search(String content,Pageable pageable); //返回所有数据集合 Page<Poem> findAll(Pageable pageable); }
package com.example.demo.service; import com.example.demo.entity.Poem; import com.example.demo.repository.PoemRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; /** * Created by linziyu on 2018/5/19. */ @Service public class PoemServiceImpl implements PoemService{ @Autowired private PoemRepository poemRepository; @Override public void save(Poem poem) { poemRepository.save(poem); } @Override public Page<Poem> search(String title, String content, Pageable pageable) { return poemRepository.findByTitleLikeOrContentLike(title,content,pageable); } @Override public Page<Poem> search(String content, Pageable pageable) { return poemRepository.findByContentLike(content,pageable); } @Override public Page<Poem> findAll(Pageable pageable) { return poemRepository.findAll(pageable); } }
repository类:
package com.example.demo.repository; import com.example.demo.entity.Poem; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; /** * Created by linziyu on 2018/5/19. * dao层 * */ public interface PoemRepository extends ElasticsearchRepository<Poem,Long>{ Page<Poem> findByTitleLikeOrContentLike(String title, String content, Pageable pageable); Page<Poem> findByContentLike(String content,Pageable pageable); }
application.properties配置:
spring.data.elasticsearch.properties.transport.tcp.connect_timeout=120s spring.data.elasticsearch.repositories.enabled=true spring.data.elasticsearch.cluster-nodes=localhost:9300
DemoApplication启动类:
package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
静态图片以及,显示可以根据原始返回值问题解决
引入spring-boot-starter-data-elasticsearch依赖
<?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.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>demo</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.2.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-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</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>
前台页面访问:

致辞,流程已经完成。
需要源码请加:499749405 免费提供源码
Elasticsearch与Solr的比较*
当单纯的对已有数据进行搜索时,Solr更快。

当实时建立索引时, Solr会产生io阻塞,查询性能较差, Elasticsearch具有明显的优势。

随着数据量的增加,Solr的搜索效率会变得更低,而Elasticsearch却没有明显的变化。

综上所述,Solr的架构不适合实时搜索的应用
Elasticsearch 与 Solr 的比较总结
- 二者安装都很简单;
- Solr 利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能;
- Solr 支持更多格式的数据,而 Elasticsearch 仅支持json文件格式;
- Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高级功能多有第三方插件提供;
- Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用时效率明显低于 Elasticsearch。
Solr 是传统搜索应用的有力解决方案,但 Elasticsearch 更适用于新兴的实时搜索应用

浙公网安备 33010602011771号