全站搜索引擎:ElasticSearch整合到SpringBoot

一、什么是Elastic Search

1.ElasticSearch的定义

ElasticSearch(简称:ES)是一个基于Lucene的分布式、高扩展、高实时的搜索与数据分析引擎。
特性:

  • 面向文档的(存储整个对象或文档)
  • 底层基于Lucene封装
  • 采用多shard分片的方式保证数据安全
  • 提供RESTful API
  • 使用JSON作为文档的序列化格式

ElasticSearch官网

作用:提供了一个分布式多用户的全文搜索引擎,用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

ES执行过程:

  1. 用户将数据提交到Elastic Search 数据库;
  2. 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据;
  3. 当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。

ES的数据存储:

Elastic Search要实现快速检索,首先必须要把数据结构化存储起来。那再Elastic Search中是如何存储数据的呢?
Elastic Search通过索引来进行存储数据,一个索引中可以有若干个不同的类型,每种类型都由若干条字段组成,每次存储实际上都是存储一种类型的实例,叫做一个文档。


es架构图.jpg

为了方便理解,可以类比到关系型数据库中的概念进行对比,如下表:

关系型数据库 Elasticsearch
Databases(数据库) Indices(索引)
Tables(表) Types(类型)
Rows(行) Documents(文档)
Columns(列) Fields(字段)

Elasticsearch包含多个索引(indices)(数据库),每个索引可以包含多个类型(types)(表),每个类型包含多个文档(documents)(行),每个文档包含多个字段(Fields)(列)。

例如:若我们开发一个文件检索系统,当要添加一篇文章时,指定Indices为毕业论文,Type为_doc,Fields包括:标题、简介、摘要、论文主体、参考文献等,Document的id为1。

相关概念:

cluster:代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。

shards:代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。

replicas:代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。

recovery:代表数据恢复或叫数据重新分布,es在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。

river:代表es的一个数据源,也是其它存储方式(如:数据库)同步数据到es的一个方法。它是以插件方式存在的一个es服务,通过读取river中的数据并把它索引到es中,官方的river有couchDB的,RabbitMQ的,Twitter的,Wikipedia的。

gateway:代表es索引快照的存储方式,es默认是先把索引存放到内存中,当内存满了时再持久化到本地硬盘。gateway对索引快照进行存储,当这个es集群关闭再重新启动时就会从gateway中读取索引备份数据。es支持多种类型的gateway,有本地文件系统(默认),分布式文件系统,Hadoop的HDFS和amazon的s3云存储服务。

discovery.zen:代表es的自动发现节点机制,es是一个基于p2p的系统,它先通过广播寻找存在的节点,再通过多播协议来进行节点之间的通信,同时也支持点对点的交互。

Transport:代表es内部节点或集群与客户端的交互方式,默认内部是使用tcp协议进行交互,同时它支持http协议(json格式)、thrift、servlet、memcached、zeroMQ等的传输协议(通过插件方式集成)。

资源汇总:

ElasticSearch官网下载地址
spring-data-elasticsearch开源项目
ElasticSearch官方文档

二、Elasitc Search安装与运行

1.JDK安装与环境变量配置

(略)

2.Windows下载并运行Elasitc Search

若使用Spring Data Elasticsearch的方式调用ElasticSearch,则需要注意把版本对应好,如下:

Spring Data Elasticsearch ElasticSearch
3.2.x 6.5.0
3.1.x 6.2.2
3.0.x 5.5.0
2.1.x 2.4.0
2.0.x 2.2.0
1.3.x 1.5.2

下载Elasticsearch:由于我的电脑上JDK使用的是1.8,所以我下载使用ElasticSearch 6.5.0的版本。下载地址:ElasticSearch 6.5.0下载
运行Elasticsearch:双击运行elasticsearch-2.4.4\bin 目录下的elasticsearch.bat文件。
访问Elasticsearch:浏览器访问 http://localhost:9200。(默认使用9200端口)

Elasticsearch运行成功

3.安装head插件

为便于管理Elasticsearch,安装head插件可实现可视化管理。
安装head插件:打开cmd命令行:

> cd C:\elasticsearch-2.4.4\bin
> plugin install mobz/elasticsearch-head

访问head插件:浏览器中访问http://localhost:9200/_plugin/head/

head插件可视化管理Elasticsearch

4.把Elasticsearch安装成Windows服务

以上已经把本地的Elasticsearch运行起来了,但生产环境每次都这样启动,未免过于麻烦且不安全。最好的方式是把Elasticsearch加入到Windows服务中(Service),每次开机自动后台启动。
打开cmd命令行:

> cd C:\elasticsearch-2.4.4\bin
> service.bat install
> service.bat start

5.使用RESTful API 向ElasticSearch中进行HTTP访问

使用POSTman软件模拟发送HTTP请求到ElasticSearch服务器

例如:

操作 示例请求 备足
添加1号文档 POST : http://localhost:9200/索引/类型/1 body中写入JSON对象
修改1号文档 PUT : http://localhost:9200/索引/类型/1 body中写入JSON对象
查询1号文档 GET : http://localhost:9200/索引/类型/1 body中返回JSON对象
删除1号文档 DELETE : http://localhost:9200/索引/类型/1 body中返回操作结果
检查是否存在1号文档 HEAD : http://localhost:9200/索引/类型/1 若存在则返回200状态,否则返回404状态
查询所有文档 GET : http://localhost:9200/索引/类型/_search body中的hits返回JSON对象集合
条件过滤查找 GET : http://localhost:9200/索引/类型/_search?q=字段:关键字 body中的hits返回JSON对象集合
表达式过滤查找 POST : http://localhost:9200/索引/类型/_search body中添加查询表达式

三、SpringBoot整合ElasticSearch

SpringBoot默认支持两种形式整合ElasticSearch。

1.Jest(默认不生效)

   使用标准的HTTP请求方式进行交互(略)
   需要手工导入Jest的工具包(io.searchbox.client.JestClient)

2.Spring Data ElasticSearch

SpirngBoot自动完成了以下配置:

  • 完成Client节点信息clusterNodes:clusterName:用于连接ES节点;
  • 完成ElasticsearchTemplate:用于对ES进行数据映射;
  • 编写了一个ElasticsearchRepository的子接口,用于操作ES的CRUD;

1.pom.xml中引入Spring-Data-ElasticSearch的依赖

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-elasticsearch</artifactId>
            <version>3.2.0.RELEASE</version>
        </dependency>

注意:如果Spring-Data-ElasticSearch与ElasticSearch版本不一致,会出现ConnectTransportException异常,使得SpringBoot无法启动。
此时需要修改Spring-Data-ElasticSearch版本,或修改服务器中ElasticSearch的版本。

Spring Data Elasticsearch ElasticSearch
3.2.x 6.5.0
3.1.x 6.2.2
3.0.x 5.5.0
2.1.x 2.4.0
2.0.x 2.2.0
1.3.x 1.5.2

2.配置Spring-Data-ElasticSearch

spring.data.elasticsearch.repositories.enabled = true
#配置ElasticSearch节点名称
spring.data.elasticsearch.cluster-name=elasticsearch
#配置ElasticSearch节点地址
spring.data.elasticsearch.cluster-nodes=localhost:9300
#注: 9300 是 Java 客户端的端口。9200 是支持 Restful HTTP 的接口。

配置完成后,运行SpringBoot;若运行成功,则表示ElasticSearch整合成功!

3.添加绑定的实体类

实体类:文章

package com.zhbit.es.bean

@Document(indexName = "zhbit", type = "article")
public class Article implements Serializable{
    private Integer id;
    private String auther;
    private String title;
    private String content;
    ……
}

4.DAO层继承ElasticsearchRepository

package com.zhbit.es.dao
import com.zhbit.es.bean.Article;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

public interface ArticleDao extends ElasticsearchRepository<Article, Integer>{
    public List<Article> findByTitleLike(String title);
}

更多参考

5.编写测试方法,测试上面的ES访问操作

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootElasticApplicationTests{
    @Autowired
    ArticleDao articleDao;
    @Test
    public void testArticleDao(){
        Article a1 = new Article(1,"肖sir","论智慧城市","智慧城市是现代化发展的必然副产品。");
        articleDao.index(a1);
    }
    @Test
    public void testArticleDao2(){
        for(Article a1 : articleDao.findByTitleLike("智慧"))
        {
            System.out.println(a1);
        }
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容