一、ElasticSearch简介1.1、ElasticSearch简介
Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。但是,Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的 RESTful API 来隐藏Lucene的复杂性,从而让全文搜索变得简单。
1.2、同类产品比较solr
Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化 。并自带了图形管理界面。
数据相对少的请求下Solr的检索效率更高
数据量大时,Solr的搜索效率变低,而ElasticSearch没有明显变化
建立索引时,Solr会产生阻塞IO,查询性能较差,ElasticSearch有优势
安装使用方面ElasticSearch更为简单
总结solr查询快,但更新索引时慢(即插入删除慢),用于电商等查询多的应用,比如商品搜索 。
ES建立索引快(即查询慢),即实时性查询快,适用用于数据频繁更新的应用,比如facebook新浪等搜索。
Solr 是传统搜索应用的有力解决方案,但 Elasticsearch 更适用于新兴的实时搜索应用。
ES没有Solr成熟,学习成本相对较高。
二、 ElasticSearch安装和插件2.1、ElasticSearch安装
下载Es安装包
ElasticSearch的官方地址:https://www.elastic.co/guide/en/elasticsearch/reference/master/index.html
2.2、ES图形化管理界面安装
1)下载head https://github.com/mobz/elasticsearch-head
2) 下载Node.js https://nodejs.org/en/download
安装完成 在cmd窗口执行node -v查看node.js的版本号 检查是否安装成功
3) 安装grunt
通过node.js的包管理器npm安装grunt为全局命令,grunt是基于Node.js的项目构建工具
npm install-g grunt-cli
4)执行 npm install (不执行该命令 使用grunt server命令会报错)
npm install
如有执行该命令报错的 在elasticsearch-head解压目录下执行
5)elasticsearch-head解压目录下打开命令窗口
执行 grunt server 启动服务
访问http://localhost:9100 (elasticsearch-head服务端口)
6、配置ElasticSearch跨域访问 修改 config/elasticsearch.yml 文件
http.cors.enabled: true
http.cors.allow-origin: "*"
需要重启ES服务
7、在head页面输入链接的ElasticSearch地址,点击连接按钮
三、 ElasticSearch的相关概念3.1 概述
Elasticsearch是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(ducoment)。然而它不仅仅是存储,还会索引(index)每个文档的内容使之能搜索。在Elasticsearch中,你可以对文档(而非成行成列的数据 )进行索引、排序、过滤。Elasticsearch比传统关系型数据库如下。
关系型数据库 -> Databases -> Tables -> Rows -> Colums
ElasticSearch -> Indices -> Types ->Documents -> Fields
3.2 ElasticSearch的核心概念
3.2.1 索引 index
一个索引就是有相似特征的文档集合,比如用户数据索引、订单数据索引、商品数据索引。
一个索引由一个全为小写字母的名字标识,我们在对应这个索引文档中进行索引、搜索、更新和删除的时候,都要使用到这个名字。在一个群集中可以定义任意多个索引。
3.2.2 类型type
在一个索引中,你可以定义一个或多个类型,一个类型是你的索引的一个逻辑上的分类,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型,比如说,我们订单数据索引中我们把订单信息作为一个类型,订单相关的物流信息做为一个类型。但在6.0开始建议index只包含一个type,在7.0之后开始去除。
3.2.3 字段field
相当于是数据表的字段,对文档根据不同的属性进行的分类标识
3.2.4 映射 mapping (表结构)
mapping是处理数据的方式和规则方面做一些限制,如某个字段的数据类型、默认值、分析器、是否被索引等等,这些都是映射里面可以设置的,其他的就是处理es里面的数据的一些使用规则设置也叫做映射,按最优规则处理数据对性能提高很大,因此才需要建立映射,并且需要思考如何建立隐射才能对性能更好。
3.2.5 文档 document
一个文档是一个可被索引的基础单元。文档以JSON格式来表示,而JSON是一个到处存在的互联网数据交互格式。
在一个index/type里面,你可以存储任意多的文档。
3.2.6 ElasticSearch版本问题说明
Elasticsearch 官网提出的近期版本对 type 概念的演变情况如下:
在 5.X 版本中,一个 index 下可以创建多个 type;
在 6.X 版本中,一个 index 下只能存在一个 type;
在 7.X 版本中,直接去除了 type的概念,就是说 index 不再会有 type。
去除type的原因 :
因为 Elasticsearch 设计初期,是直接参考了关系型数据库的设计模式,存在了 type(数据表)的概念。但是,其搜索引擎是基于 Lucene的,这种 “基因”决定了 type 是多余的。Lucene 的全文检索功能之所以快,是因为 倒序索引** 的存在。而这种倒序索引 的生成是基于 index 的,而并非 type。