使用Elasticsearch与Spring Boot集成实现全文搜索

文章目录

  • 启动Elasticsearch
  • 修改application.properties
  • 创建文档类
  • 创建资源库
  • 创建测试用例

今天在实验室摸索了一天Elasticsearch与Spring Boot集成,终于初见成效,很开心,mark一下。

启动Elasticsearch

首先,确保已经正确启动了Elasticsearch服务器,windows系统运行Elasticsearch解压文件下的bin/elasticsearch.bat文件(linux系统运行bin/elasticsearch文件)即可。

运行成功后,在浏览器中访问http://localhost:9200,查看是否启动成功,启动成功结果如下:

{
  "name" : "Rg9hQgw",   // 默认的节点名称
  "cluster_name" : "elasticsearch", // 默认的集群名称
  "cluster_uuid" : "phE0-t5oTCqeX8XIYsd1Tw",
  "version" : {
    "number" : "6.6.1",
    "build_flavor" : "default",
    "build_type" : "zip",
    "build_hash" : "1fd8f69",
    "build_date" : "2019-02-13T17:10:04.160291Z",
    "build_snapshot" : false,
    "lucene_version" : "7.6.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

修改application.properties

#Elasticsearch 服务地址
spring.data.elasticsearch.cluster-nodes=localhost:9300
#设置连接超时时间
spring.data.elasticsearch.properties.transport.tcp.connect_timeout=120s

这里一定要把端口号改为9300。9300 是 Java 客户端的端口,9200 是支持 Restful HTTP 的接口,这两个在使用中应注意区分。

创建文档类

这里我创建了一个简单的博客类EsBlog,专门用于在ES中存储博客文档。代码如下:

package com.minproject.easynews.model.ES;

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;

import java.io.Serializable;

/**
 * created time: 2019/03/12 17:57
 * author AmyZhang
 **/
@Document(indexName = "blogtest", type = "blogtest")
public class EsBlog implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    private String id;
    private String title;
    private String summary;
    private String content;

    // JPA的规范要求无参构造函数;设置为protected防止直接使用
    protected EsBlog() {}

    public EsBlog(String title, String summary, String content) {
        this.title = title;
        this.content = content;
        this.summary = summary;
    }

    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 getSummary() {
        return summary;
    }

    public void setSummary(String summary) {
        this.summary = summary;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    @Override
    public String toString() {
        return String.format("User[id='%s', title='%s', summary='%s', content='%s']",
                id, title, summary, content);
    }
}

在ES中,主键id采用的是String类型。

创建资源库

package com.minproject.easynews.utils;

import com.minproject.easynews.model.ES.EsBlog;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

/**
 * created time: 2019/03/14 13:46
 * author AmyZhang
 **/
public interface EsBlogRepository extends ElasticsearchRepository<EsBlog, String> {
    Page<EsBlog> findByTitleOrSummaryOrContent(String title, String summary,String content, Pageable pageable);
    // 以下为错误代码
    //Page findByTitleContainningOrSummaryContainningOrContentContainning(String title, String summary,String content, Pageable pageable);
}

这里,最初做的时候存在对Repository不了解,只是从别的地方找来代码直接用,可能借鉴的代码使用版本与我的版本存在差异,导致项目总是报错,错误提示主要为Caused by: org.springframework.data.mapping.PropertyReferenceException: No property containning found for type String! Traversed path: EsBlog.summary.,或者failed to load elasticsearch nodes : org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available,我找了好久不知道问题出在哪里。后来终于在网上找到一篇能解决我这个问题的帖子,将错误的字段名引用去掉后,项目终于能运行了。虽然过程很辛酸,但最终还是解决了,很开心,感谢广大网友。

创建测试用例

package com.minproject.easynews;

import com.minproject.easynews.model.ES.EsBlog;
import com.minproject.easynews.utils.EsBlogRepository;
import org.elasticsearch.index.query.QueryBuilder;
import org.junit.Before;
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.query.SearchQuery;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.Optional;

/**
 * created time: 2019/03/14 13:56
 * author AmyZhang
 **/
@RunWith(SpringRunner.class)
@SpringBootTest
public class EsBlogRepositoryTest {
    @Autowired
    private EsBlogRepository esBlogRepository;

    @Before
    public void initRepositoryData() {
        // 清除所有数据
        esBlogRepository.deleteAll();

        // 初始化数据
        esBlogRepository.save(new EsBlog("青海黄南州泽库县发生4.3级地震 网友:兰州有震感",
                "青海黄南州泽库县发生4.3级地震 网友:兰州有震感",
                "#地震快讯#中国地震台网正式测定:03月14日13时32分在青海黄南州泽库县(北纬34.97度,东经101.83度)" +
                        "发生4.3级地震,震源深度10千米。"));
        esBlogRepository.save(new EsBlog("演技脱胎换骨!吴昕新剧首演“御姐腹黑女”获赞:挺带感",
                "电视剧《爱上北斗星男友》是一部甜甜的网剧,讲述了一位从北斗星来的天星师,到地球来寻找初恋情人姞婉," +
                        "但是在次过程中遇到姞婉能量重组后的“水逆”女制作人文素汐,由此莫名其妙卷入一场娱乐圈纷争的搞笑故事。",
                "该剧请来了徐璐和张铭恩为男女主角,同时湖南卫视主持人吴昕也倾力加盟,让大家倍感期待。从3月13日开播以来," +
                        "该剧的口碑不断发酵,不仅徐璐和张铭恩的对手戏非常甜腻。另外一个亮点就是吴昕了,吴昕此次在剧中饰演了蔡舒萌," +
                        "一个与女主角一样职业的女制片人。作为女二号,自然是演绎的奸角,这次反而让大家看到了吴昕演技脱胎换骨。"));
        esBlogRepository.save(new EsBlog("吴昕新剧演技大翻转 确实进步不少",
                "说起吴昕想必大家都已经很熟悉了吧?是《快本》的主持人,一直以为她非常的快乐、简单,但是看过" +
                        "《我家那闺女》才知道,原来她也有那么多的心事,原来她也很自卑," +
                        "觉得自己做的不好,原来她也是一个十分敏感的小女孩,她也一直在努力,希望能做的好。",
                "除了她的主持能力经常被拿来说,另外一个,大概就是演技了。吴昕出演过得电视剧和电影并不多,不出意外的是" +
                        ",每一部电视剧中,她的演技都要被批评。比如《倾世皇妃》中的小侍女,《深夜食堂》里的的小姑娘," +
                        "还有快乐家族一起出演的电影中的角色。这些角色给吴昕带来的评价大概就是:没有演技,就回去主持吧。"));
    }

    @Test
    public void testFindDistinctEsBlogTitleOrSummaryOrContent() {
        Pageable pageable = PageRequest.of(0, 20);
        String title = "吴昕";
        String summary = "新剧";
        String content = "地震";

        Page<EsBlog> page = esBlogRepository.findByTitleOrSummaryOrContent(title,
                summary, content, pageable);
        System.out.println("-------------start 1");
        for (EsBlog blog : page) {
            System.out.println(blog.toString());
        }
        System.out.println("-------------end 1");

        title = "地震";
        summary = "吴昕";
        content = "地震";
        page = esBlogRepository.findByTitleOrSummaryOrContent(title,
                summary, content, pageable);
        System.out.println("-------------start 2");
        for (EsBlog blog : page) {
            System.out.println(blog.toString());
        }
        System.out.println("-------------end 2");
    }
}

其中Pageable pageable = PageRequest.of(0, 20);是初始化一个分页请求。
执行结果如下:

-------------start 1
User[id='qCYSfGkBd9vIDaEfVme5', title='青海黄南州泽库县发生4.3级地震 网友:兰州有震感', summary='青海黄南州泽库县发生4.3级地震 网友:兰州有震感', content='#地震快讯#中国地震台网正式测定:03月14日13时32分在青海黄南州泽库县(北纬34.97度,东经101.83度)发生4.3级地震,震源深度10千米。']
User[id='qiYSfGkBd9vIDaEfV2eZ', title='吴昕新剧演技大翻转 确实进步不少', summary='说起吴昕想必大家都已经很熟悉了吧?是《快本》的主持人,一直以为她非常的快乐、简单,但是看过《我家那闺女》才知道,原来她也有那么多的心事,原来她也很自卑,觉得自己做的不好,原来她也是一个十分敏感的小女孩,她也一直在努力,希望能做的好。', content='除了她的主持能力经常被拿来说,另外一个,大概就是演技了。吴昕出演过得电视剧和电影并不多,不出意外的是,每一部电视剧中,她的演技都要被批评。比如《倾世皇妃》中的小侍女,《深夜食堂》里的的小姑娘,还有快乐家族一起出演的电影中的角色。这些角色给吴昕带来的评价大概就是:没有演技,就回去主持吧。']
User[id='qSYSfGkBd9vIDaEfV2cu', title='演技脱胎换骨!吴昕新剧首演“御姐腹黑女”获赞:挺带感', summary='电视剧《爱上北斗星男友》是一部甜甜的网剧,讲述了一位从北斗星来的天星师,到地球来寻找初恋情人姞婉,但是在次过程中遇到姞婉能量重组后的“水逆”女制作人文素汐,由此莫名其妙卷入一场娱乐圈纷争的搞笑故事。', content='该剧请来了徐璐和张铭恩为男女主角,同时湖南卫视主持人吴昕也倾力加盟,让大家倍感期待。从3月13日开播以来,该剧的口碑不断发酵,不仅徐璐和张铭恩的对手戏非常甜腻。另外一个亮点就是吴昕了,吴昕此次在剧中饰演了蔡舒萌,一个与女主角一样职业的女制片人。作为女二号,自然是演绎的奸角,这次反而让大家看到了吴昕演技脱胎换骨。']
-------------end 1
-------------start 2
User[id='qCYSfGkBd9vIDaEfVme5', title='青海黄南州泽库县发生4.3级地震 网友:兰州有震感', summary='青海黄南州泽库县发生4.3级地震 网友:兰州有震感', content='#地震快讯#中国地震台网正式测定:03月14日13时32分在青海黄南州泽库县(北纬34.97度,东经101.83度)发生4.3级地震,震源深度10千米。']
User[id='qiYSfGkBd9vIDaEfV2eZ', title='吴昕新剧演技大翻转 确实进步不少', summary='说起吴昕想必大家都已经很熟悉了吧?是《快本》的主持人,一直以为她非常的快乐、简单,但是看过《我家那闺女》才知道,原来她也有那么多的心事,原来她也很自卑,觉得自己做的不好,原来她也是一个十分敏感的小女孩,她也一直在努力,希望能做的好。', content='除了她的主持能力经常被拿来说,另外一个,大概就是演技了。吴昕出演过得电视剧和电影并不多,不出意外的是,每一部电视剧中,她的演技都要被批评。比如《倾世皇妃》中的小侍女,《深夜食堂》里的的小姑娘,还有快乐家族一起出演的电影中的角色。这些角色给吴昕带来的评价大概就是:没有演技,就回去主持吧。']
//-------------end 2

第一次搜索使用"吴昕",“新剧”,"地震"作为查询参数,其中"吴昕"匹配了第二和第三段新闻,"新剧"没有匹配任何新闻,"地震"匹配了第一段新闻,所以总共匹配出三条数据。

第二次搜索使用"地震",“吴昕”,"地震"作为查询参数,其中第一个"地震"匹配了第一段新闻,"吴昕"匹配了第三段新闻,第二个"地震"匹配了第一段新闻,所以去重后总共匹配了两条数据。

这样,一个简单的ES与Spring Boot集成的代码就出来了,在这里记录一下。

你可能感兴趣的:(使用Elasticsearch与Spring Boot集成实现全文搜索)