SpringBoot集成ElasticSearch(ES)实现全文搜索功能
作者:A尘埃
Elasticsearch是一个开源的分布式搜索和分析引擎,它被设计用于处理大规模数据集,它提供了一个分布式多用户能力的全文搜索引擎,本文将给大家介绍SpringBoot集成ElasticSearch(ES)实现全文搜索功能,需要的朋友可以参考下
Document可以看作表中的一条记录,Index可以看作Database数据库,而Type就是里面的Table表。
一、依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>
二、在application.properties文件中添加ElasticSearch连接信息
server.port=8080 #es 配置信息 spring.main.allow-bean-definition-overriding=true elasticsearch.host=127.0.0.1 elasticsearch.port=9300 elasticsearch.clustername=elasticsearch elasticsearch.search.pool.size=5
启动类
@SpringBootApplication public class SSD08Application { public static void main(String[] args) { SpringApplication.run(SSD08Application.class, args); } }
三、创建Elasticsearch配置类
@Slf4j @Configuration @EnableElasticsearchRepositories(basePackages = "com.yoodb.study.demo08.service") public class ElasticsearchConfig{ @Value("${elasticsearch.host}") private String esHost; @Value("${elasticsearch.port}") private int esPort; @Value("${elasticsearch.clustername}") private String esClusterName; @Value("${elasticsearch.search.pool.size}") private Integer threadPoolSearchSize; @Bean public Client client() throws Exception{ Settings esSettings = Settings.builder() .put("cluster.name",esClusterName) .put("client.transoprt.sniff",true) .put("thread_pool.search.size",threadPoolSearchSize) .build(); return new PreBuiltTransportClient(esSettings) .addTransoprtAddress(new TransportAddress(InetAddress.getByName(esHost), esPort)); } @Bean(name="elasticsearchTemplate") public ElasticsearchOperations elasticsearchTemplateCustom() throws Exception { ElasticsearchTemplate elasticsearchTemplate; try{ elasticsearchTemplate = new ElasticsearchTemplate(client()); return elasticsearchTemplate; }catch(Exception e){ return new ElasticsearchTemplate(client()); } } }
四、创建Article实体类
@Document 作用在类,标记实体类为文档对象,一般有两个属性
indexName:对应索引库名称
type:对应在索引库中的类型
shards:分片数量,默认分5片
replicas:副本数量,默认1份
- @Id 作用在成员变量,标记一个字段作为id主键
- @Field 作用在成员变量,标记为文档的字段,并指定字段映射属性
type:字段类型,取值是枚举:FieldType
index:是否索引,布尔类型,默认是true
store:是否存储,布尔类型,默认是false
analyzer和searchAnalyzer中参数名称保持一直,ik_max_word可以改成ik_smart
ik_max_word和ik_smart的区别?
- ik_max_word参数采用穷尽式的分词,比如“我爱家乡”,可能会分出“我”,“我爱”,“家乡”等
- ik_smart参数分的会比较粗,如上语句可能会分出“我爱”,“家乡”这样
如果想要搜索出的结果尽可能全,可以使用ik_max_word参数,如果需要结果尽可能精确,可以使用ik_smart参数
Document(indexName = "blog",type = "article") public class Article { /** * 主键ID */ @Field(type = FieldType.Keyword) private String id; /** * 文章标题 */ @Field(type = FieldType.Text, analyzer = "ik_max_word",searchAnalyzer = "ik_max_word") private String title; /** * 文章内容 */ @Field(type = FieldType.Text, analyzer = "ik_max_word",searchAnalyzer = "ik_max_word") private String content; public String getId() { return id; } public void setId(String 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; } }
五、继承ElasticsearchRepository接口
public interface ElasticRepository extends ElasticsearchRepository<Article, String> { }
六、IElasticService接口以及实现类
public interface IElasticService { public void save(Article article); public void saveAll(List<Article> list); public Iterator<Article> findAll(); public List<Article> findArticleByTitle(String title); }
@Service("elasticService") public class ElasticServiceImpl implements IElasticService { @Autowired private ElasticRepository elasticRepository; @Override public void save(Article article) { elasticRepository.deleteAll(); elasticRepository.save(article); } @Override public void saveAll(List<Article> list) { elasticRepository.saveAll(list); } @Override public Iterator<Article> findAll() { return elasticRepository.findAll().iterator(); } public List<Article> findArticleByTitle(String title) { //matchQuery 对关键字分词后进行搜索 MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("title", title); QueryBuilders.commonTermsQuery("title",title); Iterable<Article> search = elasticRepository.search(matchQueryBuilder); Iterator<Article> iterator = search.iterator(); List<Article> list = new ArrayList<>(); while (iterator.hasNext()){ Article next = iterator.next(); list.add(next); } return list; } }
七、控制层Controller
@Log4j2 @RestController @RequestMapping("/elastic") public class ElasticController { @Autowired private IElasticService elasticService; @GetMapping("/init") public void init(){ String title = "关注“Java精选”微信公众号"; String content = "Java精选专注程序员推送一些Java开发知识,包括基础知识、各大流行框架" + "(Mybatis、Spring、Spring Boot等)、大数据技术(Storm、Hadoop、MapReduce、Spark等)、" + "数据库(Mysql、Oracle、NoSQL等)、算法与数据结构、面试专题、面试技巧经验、职业规划以及" + "优质开源项目等。其中一部分由小编总结整理,另一部分来源于网络上优质资源,希望对大家的学习" + "和工作有所帮助。"; Article article = createArticle(title, content); elasticService.save(article); title = "关注素文宅博客"; content = "素文宅博客主要关于一些Java技术类型文章分享。"; article = createArticle(title, content); List<Article> list = new ArrayList<>(); list.add(article); elasticService.saveAll(list); } public static Article createArticle(String title,String content){ UUID uuid = UUID.randomUUID(); String id = uuid.toString(); Article article = new Article(); article.setId(id); article.setTitle(title); article.setContent(content); return article; } @GetMapping("/all") public Iterator<Article> all(){ return elasticService.findAll(); } @GetMapping("/key") public List<Article> all(String title){ return elasticService.findArticleByTitle(title); } }
运行程序
1)启动ElasticSearch服务
2)启动SpringBoot项目访问地址
初始化生成索引文件访问地址
http://localhost:8080/elastic/init
获取所有索引内容访问地址
http://localhost:8080/elastic/all
[{"id":"62e73653-4658-4d72-9b2e-e541a3ae7d53","title":"关注“Java精选”微信公众号","content":"Java精选专注程序员推送一些Java开发知识,包括基础知识、各大流行框架(Mybatis、Spring、Spring Boot等)、大数据技术(Storm、Hadoop、MapReduce、Spark等)、数据库(Mysql、Oracle、NoSQL等)、算法与数据结构、面试专题、面试技巧经验、职业规划以及优质开源项目等。其中一部分由小编总结整理,另一部分来源于网络上优质资源,希望对大家的学习和工作有所帮助。"},{"id":"1e7c2f0b-e07e-4037-a3a3-3385d8b7d2c1","title":"关注素文宅博客","content":"素文宅博客主要关于一些Java技术类型文章分享。"}]
根据搜索条件,获取索引内容访问地址
http://localhost:8080/elastic/key?title=Java%E7%B2%BE%E9%80%89
返回结果:
[{"id":"62e73653-4658-4d72-9b2e-e541a3ae7d53","title":"关注“Java精选”微信公众号","content":"Java精选专注程序员推送一些Java开发知识,包括基础知识、各大流行框架(Mybatis、Spring、Spring Boot等)、大数据技术(Storm、Hadoop、MapReduce、Spark等)、数据库(Mysql、Oracle、NoSQL等)、算法与数据结构、面试专题、面试技巧经验、职业规划以及优质开源项目等。其中一部分由小编总结整理,另一部分来源于网络上优质资源,希望对大家的学习和工作有所帮助。"}]
以上就是SpringBoot集成ElasticSearch(ES)实现全文搜索功能的详细内容,更多关于SpringBoot ElasticSearch全文搜索的资料请关注脚本之家其它相关文章!