springboot博客(7)全文搜索ElasticSearch

该篇为:慕课网基于Spring Boot技术栈博客系统企业级前后端实战第7章的学习笔记

引言:搜索即检索  如网页搜索,关系数据库查询其实也是一个搜索。那么这些搜索和全文搜索ElasticSearch有什么关系呢

1.全文搜索

(1)数据结构:

我们以往学习的是数据库查询是结构化搜索,非结构化数据的搜索:

顺序扫描法我们在windows系统中搜索文件时候,用的就是这种方法,适合小数据量文件。

当数据量大时,就要采取全文搜索。

全文搜索是一种将文件中所有文本与搜索项匹配的搜索方法。

非结构化数据转化为结构化数据去搜索。

(2)全文搜索的原理:

建立索引的策略各有不同,一般结果用分页形式返回,将相关度高的排到前面,有些甚至将广告商的排在前面。

(3)全文搜索实现技术

基于Java的开源实现

   

Lucene是一种全文搜索引擎,ES本身也是Lucene的实现,Solr和ES一样全文搜索系统。ES自己有一套自带的分布式管理功能。Solr支持较多的数据格式,而ES只支持Json,ES提供的功能较少较核心,实时搜索效果更好,目前ES更受欢迎。

2. ElasticSearch

(1)ES特点

(2)ES核心概念

3 ES与Spring Boot集成

(1)环境

按照网上教程安装对应版本的ES 

(2) 修改build.gradle

添加相应的依赖


dependencies {
	compile 'org.springframework.boot:spring-boot-starter-web'
	compile group: 'net.java.dev.jna', name: 'jna', version: '4.3.0'
	compile group: 'org.springframework.data', name: 'spring-data-elasticsearch', version: '2.1.3.RELEASE'
	testCompile 'org.springframework.boot:spring-boot-starter-test'
}

(3)修改application.properties

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

(4)后台编码

EsBlog.class

@Document(indexName = "blog",type = "blog")  //文档
public class EsBlog implements Serializable {
    private  static  final long serialVersionUID = 1L;
    @Id //
    private String id;
    private  String title;
    private  String summary;
    private  String content;
    protected EsBlog(){} //JPA构造要求 防止直接使用

    public EsBlog(String title, String summary, String content) {
        this.title = title;
        this.summary = summary;
        this.content = 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 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("EsBlog[id='%s',title='%s',summary='%s',content='%s']",
                id,title,summary,content);
    }
}

EsBlogRepository.java   继承ES的接口,这里要注意的是传入的参数需要有一个pageable,函数命名采用JPA中的命名

public interface EsBlogRepository extends ElasticsearchRepository<EsBlog,String> {
    /**
     * 分页查询博客 (去重)
     *  JPA不用自己写SQL
     * @param title
     * @param content
     * @param summary
     * @return
     */
    Page<EsBlog> findDistinctByTitleContainingOrContentContainingOrSummaryContaining(String title, String content,String summary,Pageable pageable);
}

编写控制器BlogControl.java

@RestController
@RequestMapping("/blogs")
public class BlogControl {


    @Autowired
    private EsBlogRepository esBlogRepository;
    @Before     //在执行test前会执行
    public void  initRepositoryDate(){
        //清除所有数据
        esBlogRepository.deleteAll();

        esBlogRepository.save(new EsBlog("登鹳雀楼","白日依山尽","白日依山尽,黄河入海流。\n" +
                "欲穷千里目,更上一层楼。"));
        esBlogRepository.save(new EsBlog("问刘十九","绿蚁新醅酒","绿蚁新醅酒,红泥小火炉。\n" +
                "晚来天欲雪,能饮一杯无?"));
        esBlogRepository.save(new EsBlog("寻隐者不遇","松下问童子","松下问童子,言师采药去。\n" +
                "只在此山中,云深不知处。"));
    }
    @GetMapping
    public List<EsBlog> list(@RequestParam(value = "title") String title, @RequestParam(value = "summary") String summary,
                             @RequestParam(value = "content") String content,
                             @RequestParam(value = "pageIndex",defaultValue = "0") int pageIndex,
                             @RequestParam(value = "pageSize",defaultValue = "10") int pageSize){

        Pageable pageable =new PageRequest(pageIndex,pageSize);
        Page<EsBlog> page = esBlogRepository.findDistinctByTitleContainingOrContentContainingOrSummaryContaining(title,content,summary,pageable);
        return page.getContent();
    }
}

(5)启动Elasticsearch.bat

(6)运行程序;

然后在浏览器中测试,测试通过

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值