最近项目中须要作一些大数据的全文检索功能,之前项目中都是基于 Lucene 进行的开发。而随着互联网技术架构的发展,近几年搜索引擎技术发展迅速,其中ElasticSearch进行技术的预演。 的热度一直都在搜索引擎排在前面,它的实时搜索、稳定、分布式、REST API 封装都是它的特色。结合网上其余资料对比,这个项目也打算使用 ElasticSearch 进行技术的预演。node
既然技术选型已经肯定,接下来就是围绕这个目标进行一步一步的任务细化。并且由于时间线不能拉太长,因此目前是先可以和业务集成,对应一些底层的集群、分片等原理性的内容,放到最后再去深刻了解。web
本文主要介绍一些 ElasticSearch 基本概念,以及和 Apache solr 的一些对比。数据库
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并做为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,可以达到实时搜索,稳定,可靠,快速,安装使用方便。-----百度百科json
涉及到like的大数据量模糊查询,若是是直接对数据库进行查询的话,因为like模糊查询没法对数据列应用索引,因此须要一条条字符串进行比对查询,效率很是低下。因此在Java中,解决大数据量的模糊查询,就会用到创建索引库,全文检索的查询技术。服务器
全文搜索引擎是目前普遍应用的主流搜索引擎。它的工做原理是计算机索引程序经过扫描文章中的每个词,对每个词创建一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先创建的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程相似于经过字典中的检索字表查字的过程。-----百度百科网络
采用分词器,对文本每一个词进行切分,创建词条,方便进行查找数据结构
一个索引就是一个拥有几分类似特征的文档的集合。好比说,你能够有一个客户数据的索引,另外一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须所有是小写字母的),而且当咱们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。在一个集群中,若是你想,能够定义任意多的索引。 这里索引至关于关系型数据库中的库。架构
也常被称为反向索引,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最经常使用的数据结构。经过倒排索引,能够根据单词快速获取包含这个单词的文档列表。倒排索引主要由两个部分组成:“单词词典”和“倒排文件”。源于实际应用中须要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具备该属性值的各记录的地址。因为不是由记录来肯定属性值,而是由属性值来肯定记录的位置,于是称为倒排索引(inverted index)。带有倒排索引的文件咱们称为倒排索引文件,简称倒排文件(inverted file)。这里的倒排索引至关于关系型数据库中的索引elasticsearch
在一个索引中,你能够定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义彻底由你来定。一般,会为具备一组共同字段的文档定义一个类型。好比说,咱们假设你运营一个博客平台而且将你全部的数据存储到一个索引中。在这个索引中,你能够为用户数据定义一个类型,为博客数据定义另外一个类型,固然,也能够为评论数据定义另外一个类型。这里的类型至关于关系型数据库中的表分布式
一个文档是一个可被索引的基础信息单元。好比,你能够拥有某一个客户的文档,某一个产品的一个文档,固然,也能够拥有某个订单的一个文档。文档以JSON(Javascript Object Notation)格式来表示,而JSON是一个处处存在的互联网数据交互格式。在一个index/type里面,只要你想,你能够存储任意多的文档。注意,尽管一个文档,物理上存在于一个索引之中,文档必须被索引/赋予一个索引的type。这里的文档至关于关系型数据库中表的记录
文档元数据_index:文档在哪存放_type:文档表示的对象类别_id:文档惟一标识ID 是一个字符串,当它和 _index 以及 _type 组合就能够惟一肯定 Elasticsearch中的一个文档。 当你建立一个新的文档,要么提供本身的 _id ,要么让 Elasticsearch 帮你生成。这里的文档元数据至关于关系型数据库中的表中的字段
分词就是把一段连续的文本按照语义拆分红多个单词,而后Es按照单词来给记录作索引,分词后的集合就是做为倒排索引的key值。 ES 内部内置了多种分词器,若是要对中文分词则须要ik分词器。例如:苹果手机,经过分词器分析可能被拆分为苹果、手机。
一个索引能够存储超出单个结点硬件限制的大量数据。好比,一个具备10亿文档的索引占据1TB的磁盘空间,而任一节点都没有这样大的磁盘空间;或者单个节点处理搜索请求,响应太慢。为了解决这个问题,Elasticsearch提供了将索引划分红多份的能力,这些份就叫作分片。当你建立一个索引的时候,你能够指定你想要的分片的数量。每一个分片自己也是一个功能完善而且独立的“索引”,这个“索引”能够被放置到集群中的任何节点上。 分片之因此重要,主要有两方面的缘由:
一个集群就是由一个或多个节点组织在一块儿,它们共同持有你整个的数据,并一块儿提供索引和搜索功能。一个集群由一个惟一的名字标识,这个名字默认就是“elasticsearch”。这个名字是重要的,由于一个节点只能经过指定某个集群的名字,来加入这个集群。在产品环境中显式地设定这个名字是一个好习惯,可是使用默认值来进行测试/开发也是不错的。
一个节点是你集群中的一个服务器,做为集群的一部分,它存储你的数据,参与集群的索引和搜索功能。和集群相似,一个节点也是由一个名字来标识的,默认状况下,这个名字是一个随机的漫威漫画角色的名字,这个名字会在启动的时候赋予节点。这个名字对于管理工做来讲挺重要的,由于在这个管理过程当中,你会去肯定网络中的哪些服务器对应于Elasticsearch集群中的哪些节点。 一个节点能够经过配置集群名称的方式来加入一个指定的集群。默认状况下,每一个节点都会被安排加入到一个叫作 “elasticsearch” 的集群中,这意味着,若是你在你的网络中启动了若干个节点,并假定它们可以相互发现彼此,它们将会自动地造成并加入到一个叫作 “elasticsearch” 的集群中。 在一个集群里,只要你想,能够拥有任意多个节点。并且,若是当前你的网络中没有运行任何Elasticsearch节点,这时启动一个节点,会默认建立并加入一个叫作 “elasticsearch” 的集群。
创建索引时,搜索效率降低,实时索引搜索效率不高。
先说下ELK,ELK是一个流行的日志系统解决方案,注意,ELK不是一个软件名,而是一个解决方案的缩写,即Elasticsearch+Logstash+Kibana(ELK Stack)这三个软件的集合。
这篇文章主要是对一些基本概念进行总结,要引入一门新的技术栈,就必须先对这门技术的基本概念有必定了解,而后和市场经常使用技术进行对比,了解优点和劣势,在有必定的了解以后,就能够进入下一阶段了,下一阶段将介绍如何安装 Elasticsearch 如何使用它的Api进行查询。 若是以为有用,能够关注公众号:科比可比克。 原文连接:ES 入门