【大数据】Elastic Search入门,看这一篇就够了!

前言:Elastics Search(以后全部简称es)入门看这一篇就够了?是的,看这一篇就可以学习到es从入门到使用到生产的相关核心点,但Es家族庞大,如果深入学习或者去啃的话,没个一年半载是不可能的,所以仅这一篇也是在开玩笑了,光是Elastics Search + Logstash + Kibana (以后全部简称ELK)技术栈就有的学了,里面还涉及到这三大神器的很多插件及监控工具,一言难尽,不过也不必慌,我也没打算在ELK上花太多时间,如果仅作为上手开发和基础的原理掌握,搞定ELK数周内即可.本篇可以作为学习es家族的索引或是目录,顺着这条线学习,一篇即可,否则思路会过于混乱.标题下没内容的部分不要问,问就是暂时没写完!


目录

1.基础部分

1.1什么是es?

1.2什么是logstash?

1.3什么是kinaba?

1.4ELK安装及启动

1.4.1Es安装及启动

1.4.2Logstash安装及启动

1.4.3Kibana安装及启动

1.5Es常用插件

1.5.1 Elasticsearch-head

1.5.2 Marvel

1.5.3 Graph

1.5.4 IK中文分词器

2.进阶部分

2.1数据同步

2.1.1与关系型数据库同步

2.1.2与非关系型数据库同步

2.1.3与消息中间件同步

2.2数据检索

2.3数据聚合

3.实战部分

3.1Es与SpringData结合实战

3.2Es全文搜索项目实战

4.升华部分

4.1Es架构设计

4.2Es性能优化

4.3Es监控

5.总结


 

1.基础部分

 

1.1什么是es?

Es是一款开源的搜索服务器,底层技术用的仍是Lucene,Es和Solr都是在Luncene上进一步的封装,根据DB-Engines的排名显示,目前市场上搜索引擎的受欢迎度Es排第一,其次是solr,lucene.Es具有开源,分布式,Restful,Json响应等多种天然优势,受到各大企业青睐,这也是我把es作为主要学习的搜索引擎的原因.关于solr和lunce简单了解即可.

Lucene 简介:https://blog.csdn.net/lovexiaotaozi/article/details/103125034

Solr 简介:https://blog.csdn.net/lovexiaotaozi/article/details/103368154

 

1.2什么是logstash?

logstash是es家族提供的一款日志收集管道,可以定义数据源的输入和输出,数据的输入源可以是多种,支持同时从关系型数据库及非关系型数据库实时采集,如下图所示,至于采集到的数据最终输出到哪,用户可以自己定义,一般会输出到es进行存储,便于检索及分析。

 

1.3什么是kinaba?

kinaba是为 Elasticsearch设计的开源分析和可视化平台,可以用来查询,监控,分析,简而言之就是一款数据可视化的利器。

 

1.4ELK安装及启动

 

1.4.1Es安装及启动

①下载:https://www.elastic.co/cn/downloads/elasticsearch 根据自己环境及要求选择版本和包类型,因为公司电脑原因,我这里以win64为例,所以版本均选择一个中间的稳定版演示:6.8.5 (下面也这个版本,不再赘述)

②安装:其实都是绿色版,解压即可用,将下载后的压缩包解压即可。

③启动:进入解压后的安装目录,按下shift+鼠标右键->在此处打开命令窗口->./bin/elasticsearch.bat->敲下回车:

当你看到下面这句就是成功了,可以在浏览器打开访问 http://127.0.0.1:9200验证

 

1.4.2Logstash安装及启动

①下载:https://www.elastic.co/cn/downloads/logstash

②安装:解压即可

③启动:在解压后的config目录下找到logstash-sample.conf,然后把里面的配置内容稍作修改(置空):

input { 
    stdin {} 
} 
output { 
    stdout {} 
}

然后在解压后的目录下shift+鼠标右键->在此处打开命令窗口->键入 ./bin/logstash.bat -f ../config/logstash-sample.conf 

启动成功后可以在浏览器输入:http://localhost:9600/ 进行验证。(更多配置及使用我会在接下来用到时提到,这里能启动即可)

 

1.4.3Kibana安装及启动

①下载:https://www.elastic.co/cn/downloads/kibana

②安装:解压即可

③启动:进入bin目录,双击kibana.bat 敲几下回车静候即可,看到下面这句即说明已启动:

打开浏览器输入该地址访问即可完成验证。

 

1.5Es常用插件

 

1.5.1 Elasticsearch-head

Elasticsearch-head是一款用来浏览、与Elastic Search簇进行交互的web前端展示插件,简单来说,就是一款可以在浏览器方便你直接通过图形化界面操作es的工具。

 下载地址:https://github.com/mobz/elasticsearch-head

下载后可以通过nodejs或者docker容器启动,具体请参考github文档,我不再赘述。

补充一句,如果你的插件无法与es连接,可以在你的es解压目录下的config文件夹中找到elasticsearch.yml 加入如下配置:

#-----------------------------------插件支持(es-head)----------------------------
# 是否支持跨域
http.cors.enabled: true

# *表示支持所有域名
http.cors.allow-origin: "*"

然后重启es,启动ok后重写连接即可。 

 

1.5.2 Marvel

Marvel是Elasticsearch的管理和监控工具,作用可以类比spring-cloud的turbine.集群中必须每个节点都安装此插件。

公司电脑原因我暂时无法集群,这块先跳过,后补。

 

1.5.3 Graph

Graph插件一个新的用于 Elasticsearch 和 Kibana 的插件,通过它们您可以很方便的发现、理解和探索现有数据之间的关系。

环境原因,后补。

 

1.5.4 IK中文分词器

学过Lucene或者solr的应该对IK中文分词器比较熟悉了,是一款对中文分词友好支撑的插件。

 

2.进阶部分

 

2.1数据同步

 

2.1.1与关系型数据库同步

这里我仅以最常用的MySQL为例,演示将MySQL作为数据的输入端,将es作为数据的输出端,通过logstash来打通数据的输入和输出。

①进入logstash解压后的目录->进入config文件夹->编辑logstash-sample.conf->输入如下内容:

input {
	stdin{
	}
  jdbc {
  # mysql jdbc connection string to our backup databse  后面的test对应mysql中的test数据库
  jdbc_connection_string => "jdbc:mysql://localhost:3306/costa-spider"
  # the user we wish to excute our statement as
  jdbc_user => "root"
  jdbc_password => "123456"
  # the path to our downloaded jdbc driver
  jdbc_driver_library => "../lib/mysql-connector-java-5.1.47.jar"
  # the name of the driver class for mysql
  jdbc_driver_class => "com.mysql.jdbc.Driver"
  jdbc_paging_enabled => "true"
  jdbc_page_size => "50000"
  #以下对应着要执行的sql的绝对路径。
  statement => "SELECT * FROM main_material"
  #定时字段 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新(测试结果,不同的话请留言指出)
  schedule => "* * * * *"
  #设定ES索引类型

  }

}

output {
  elasticsearch {
    hosts => "127.0.0.1:9200"
    index => "main_material"
    document_id => "%{id}"
  }
  stdout {
   #以JSON格式输出
   codec => json_lines
  }
}

tips1:jdbc_connection_string,指明你要连接的数据库的url及端口号和库名。

tips2:jdbc_driver_liblary,需要指明mysql的jdbc驱动文件路径,这里mysql-connector-java需要自己去mvn仓库下载。

tips3: statement 这里可以指定你要把哪张表里的数据导入到es,以及是否实时同步跟新等,我这里仅演示最基础的,不触发更新.

tips4:index 名字可以随意取,对应的其实是es里的库名,在之后搜索时需要用到,我这里保持与MySQL库名一致.

tip5:document_id 文档的id,我这里与数据库里的id一一对应,以%{id}来表示即可.

②重启logstash,观察数据是否被导入,通过logstash的命令行观察到select * from *** 以及导入的数据会被打印出来基本可以确定数据是否已被导入.

③打卡head插件页面,通过查询验证一下:

可以发现数据已被成功从MySQL导入至ES中。 

 

2.1.2与非关系型数据库同步

 

2.1.3与消息中间件同步

 

2.2数据检索

关于Es数据检索,有非常多的内容,我这里不做演示,仅总结一下,以便在不同的场景下可以找到技术上的解决方案。也会在实战部分结合Sringdata-es演示几个最常用的检索。

Es支持:

全文检索:顾名思义,就是在被搜索文档的全文(全字段)中寻找与搜索内容相匹配的内容。

DSL检索:其实就是以Json格式的es语法进行检索,可以对检索结果加高亮,偏移,分页等功能。

多字段检索 (Multi-field Search):可以针对多个指定的字段进行检索,在这些指定字段中,如果有命中被搜索内容的,会被加入查询结果。

Boosting提升某字段得分的检索:可以帮助实现针对某一字段的得分权重更高,比如我想搜索文章标题中包含“头秃”的文章排序最靠前,文章内容中包含“头秃“的文章排序次之,就可以通过boosting查询获得。

Bool检索:可以使用类似AND / OR / NOT运算符来帮助检索,类似在Mysql中where xxx = ? and xxx != ?

Fuzzy模糊检索:不需要精确匹配搜索内容,只需要部分匹配即可,比如用户本来想搜索beautiful girl,但一不小心打成了beautfoful girl,这种情况仍可以通过模糊检索给用户返回正确的搜索内容。

Wildcard Query 通配符检索:这个就比较熟悉了,类似于Mysql的like %..%这种搜索。

正则表达式检索:正则表达式应该都很熟悉了,这种搜索模式可以通过正则表达式来匹配被搜索内容。

匹配短语检索:匹配短语查询要求查询字符串中的所有词都存在于文档中,对词组在文章中出现的顺序有较高要求,默认与被搜索短语顺序一致,但可以手动指定偏离值。

匹配词组前缀检索:相当于宽泛或自动的匹配短语检索,对单词的顺序和位置没有严格要求,但对性能消耗比较大。

字符串检索 (Query String):可以实现上面提到的几乎全部检索方式,查询语法要遵循es的查询语法,不同的是以一个字符串参数作为查询入参。

简化的字符串检索 (Simple Query String):简化版的字符串查检索,更适合用于暴露给用户的单个搜索框。

Term/Terms检索(指定字段检索):Term搜索是针对结构化数据的,对结构化数据的指定字段进行搜索,在其中找到完全匹配的结果并返回。

Term排序检索-(Term Query - Sorted):Term查询和其他查询一样,轻松的实现排序。多级排序也是允许的。

范围检索(Range query):也是针对结构化数据的检索,比如我要检索出文档中所有创建日期处于某一指定日期之内的数据。

Function 得分:Field值因子( Function Score: Field Value Factor),可以将指定字段纳入得分计算的结果中,从而实现一些特殊功能,比如:想把用户评价最高的商品排在最前面。

Function 得分:衰减函数( Function Score: Decay Functions ):功能跟上面的Field Value Factor相反,得分是根据某一字段的值降低,比如差评的商品排后面,可以借助此功能实现。

Function得分:脚本得分( Function Score: Script Scoring ):得分可以用指定的脚本计算,比如Groovy脚本编写的脚本。

 

2.3数据聚合

Es提供了强大的数据聚合功能,数据聚合功能赋予了es强大的大数据统计能力,通过数据聚合,我们可以做一些分析和统计工作,这块内容比较类似Mysql的count,group by,order by ,distinct等。这里我依旧不演示,因为通过crul这种方式代码量比较重,个人还是更喜欢用Spring造好的轮子去操作,把核心放在业务上,在实战部分会有相应演示。

 

3.实战部分

 

3.1Es与SpringData结合实战

这里主要简单演示集成方法和简单的CRUD操作,具体的操作我甚至不太想演示,因为springdata十分强大,足够简单,只要你用过JPA就可以直接上手,操作起来和JPA没啥两样,而且官方文档也很给力,只要你有一点英文基础,参照官方文档基本上可以轻松上手.

关于实战其实是最无聊的一部分,强烈建议阅读spring官方文档,参照文档,不要为了贪图一时之快选择网上杂七杂八的教程,这样是学不到东西的,Spring的东西更新极快,参照网上教程虽然简单,但版本一换指不定你就掉哪个坑里了.

凡是不懂不要问百度,问就问 https://spring.io

官方文档:https://docs.spring.io/spring-data/elasticsearch/docs/3.2.5.RELEASE/reference/html/

①引入依赖:spring-boot-starter-data-elasticsearch (本篇采用截止2020-3月最新的版本:3.2.5.RELEASE)

②配置连接方式:这里我选最新的连接配置方式,原因是据说原来的EsTemplate性能不咋滴,于是spring官方重新升级了一套高级的Rest API,看名字都可以看出来...

@Configuration
public class EsConf extends AbstractElasticsearchConfiguration {
    @Override
    public RestHighLevelClient elasticsearchClient() {
        return RestClients.create(ClientConfiguration.localhost()).rest();
    }

    // no special bean creation needed

    // use the ElasticsearchEntityMapper
    @Bean
    @Override
    public EntityMapper entityMapper() {
        ElasticsearchEntityMapper entityMapper = new ElasticsearchEntityMapper(elasticsearchMappingContext(),
                new DefaultConversionService());
        entityMapper.setConversions(elasticsearchCustomConversions());

        return entityMapper;
    }

}

 ③创建实体对象,可以理解为传统关系型数据库中的Model:

@Data
@Document(indexName = "item", type = "docs")
public class Item {
    @Id
    private Long id;
    @Field(type = FieldType.Text, analyzer = "ik_max_word")
    private String title;// 标题
    
    @Field(type = FieldType.Keyword)
    private String brand; // 品牌

    @Field(type = FieldType.Double)
    private Double price; // 价格
}

 ④创建Repository接口,可以理解为传统数据库中的DAO层:

只要命名遵循spring提供的namespace命名规范,就可以直接使用spring封装好的语句,无需自己再去写查询语句,非常方便了,和JPA一毛一样:

public interface ItemRepository extends Repository<Item, Long> {
    List<Item> findByTitleAndPrice(String title, Double price);
    List<Item> findAllByPrice(Double price);
    Boolean deleteItemByTitle(String title);
}

⑤测试CRUD

@RunWith(SpringRunner.class)
@SpringBootTest(classes = EsSpringBootApplication.class)
public class CrudTest {
    @Resource
    ElasticsearchOperations operations;
    @Resource
    private ItemRepository repository;

    @Test
    public void crud(){
        //新增
        IndexQuery query = new IndexQueryBuilder()
                .withId(item.getId().toString())
                .withObject(item)
                .build();
        String documentId = operations.index(query);
        System.out.println("新增成功,Id是:" + documentId);
        //查询
        List<Item> items = repository.findByTitleAndPrice("aa", 6.64);
        System.out.println(items);
        //删除
        boolean deleted = repository.deleteItemByTitle("bb");
        System.out.println("删除状态:"+deleted);
        //更新
        UpdateRequest request = new UpdateRequest();
        //...
        UpdateQuery updateQuery = new UpdateQueryBuilder()
               .withId(item.getId().toString())
               .withIndexName("item")
               .withType("docs")
               .withUpdateRequest(request)
               .build();
        operations.update(updateQuery);
}

其中增删查都比较简单,直接利用Repository提供的namespace方法匹配就可以轻松实现,更新稍微复杂一点,需要用到ElasticsearchOperations,在老版本里是ElasticsearchTemplate,因为性能问题已经不建议使用了.

这个类的使用在官方的文档里并没详细教程,所以值得注意一下.

 

3.2Es全文搜索项目实战

目前暂时没有项目,所以这块暂时跳过不写。

 

4.升华部分

 

4.1Es架构设计

Es采用了经典的分布式架构,采用主从模式进行数据的读写,跟zookeeper类似,在对临界数据的读写上,采用乐观锁机制防止数据被误修改,详情可以参阅这篇,个人觉得写得不错:

https://www.jianshu.com/p/5b1e8d610fea

 

4.2Es性能优化

性能测试工具:esrally

①分片大小:官方建议20-40G,并没有固定值,具体还得看业务场景和硬件条件.

②如果是基于时间的数据流,比如通过网络爬虫实时爬取的数据,可以在建索引时基于时间建立,方便维护.

③可以调整分片数,参照此公式:所需做大节点数=分片数*(副本数+1)https://www.elastic.co/guide/en/elasticsearch/reference/master/tune-for-search-speed.html

完整优化可参考:https://blog.csdn.net/laoyang360/article/details/97695931

 

4.3Es监控

Es监控可以用X-Pack,可以提供登陆安全防控,实时监控,可视化报告等功能。

 

5.总结

Es应该是目前市场上最主流的开源搜索引擎,对比完lucene,solr发现确实如此,而且es的生态也更加丰富,在大数据方向,elk几乎是必学必会的技能,国内外大厂也都有基于es的应用,所以没啥好说的,就两个字:牛逼!持续学就完了。


最后:如果你要深入学习Es,特别推荐一篇包罗万象的博客:https://blog.csdn.net/laoyang360/article/details/52244917

GitHub:https://github.com/elastic/elasticsearch

ES中文网,Es下载,中文文档等:https://www.elastic.co/cn/

有问题可以上Es中文社区:https://elasticsearch.cn/

如果本篇有帮助到你别忘了点个赞,文中若有任何不正之处也欢迎留言斧正,谢谢~

 

  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值