# elasticsearch(搜索引擎)介绍
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是最流行的企业搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
我们建立一个网站或应用程序,并要添加搜索功能,令我们受打击的是:搜索工作是很难的。我们希望我们的搜索解决方案要快,我们希望有一个零配置和一个完全免费的搜索模式,我们希望能够简单地使用JSON通过HTTP的索引数据,我们希望我们的搜索服务器始终可用,我们希望能够一台开始并扩展到数百,我们要实时搜索,我们要简单的多租户,我们希望建立一个云的解决方案。Elasticsearch旨在解决所有这些问题和更多的问题。
![](https://box.kancloud.cn/ef993e9b1fef42e1826308c7133cc3ab_951x569.png)
Elasticsearch 不仅仅只是一个全文搜索引擎。 它可以被下面这样准确的形容:
一个分布式的实时文档存储,每个字段可以被索引与搜索——作数据库用
一个分布式实时分析搜索引擎
能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据
**ES的诞生
**
![](https://box.kancloud.cn/5e00b0b300b960061037078326416c62_1034x593.png)
**ES的发展历程**
Elasticsearch 后来作为一家公司(Elastic公司)进行运作,定位为数据搜索和分析平台。在2014年6月获得7000万美元融资,累积融资过亿美元。
ES现在可以与Java、Ruby、Python、PHP、Perl、.NET等多种客户端集成。也可与Hadoop、Spark等大数据分析平台进行集成,功能十分强大。
基于Elasticsearch衍生出了一系列开源软件,统称为 Elatic Stack
![](https://box.kancloud.cn/d553d2403fc80defab08536ac088e3f2_1194x407.png)
说明:
因为logstash比较耗内存,所以用Beats来替代
为避免版本混乱,从5.0开始,Elastic公司将各组件的版本号统一。使用时,各组件版本号应一致(版本号形式:x.y.z,z可以不同)
**ES的应用场景**
![](https://box.kancloud.cn/4b52aa8ba7c4e8f163ce6a7c3b2e24c5_693x423.png)
**ES的架构**
![](https://box.kancloud.cn/b5cfa42e3aadde3217b2d2f0d5160455_1158x715.png)
说明:
Gateway是ES用来存储索引的文件系统,支持多种类型。
Gateway的上层是一个分布式的lucene框架。
Lucene之上是ES的模块,包括:索引模块、搜索模块、映射解析模块等
ES模块之上是 Discovery、Scripting和第三方插件。Discovery是ES的节点发现模块,不同机器上的ES节点要组成集群需要进行消息通信,集群内部需要选举master节点,这些工作都是由Discovery模块完成。支持多种发现机制,如 Zen 、EC2、gce、Azure。Scripting用来支持在查询语句中插入javascript、python等脚本语言,scripting模块负责解析这些脚本,使用脚本语句性能稍低。ES也支持多种第三方插件。
**
ES的核心概念**
Near Realtime(NRT) 近实时。数据提交索引后,立马就可以搜索到。
Cluster 集群,一个集群由一个唯一的名字标识,默认为“elasticsearch”。集群名称非常重要,具有相同集群名的节点才会组成一个集群。集群名称可以在配置文件中指定。
Node 节点:存储集群的数据,参与集群的索引和搜索功能。像集群有名字,节点也有自己的名称,默认在启动时会以一个随机的UUID的前七个字符作为节点的名字,你可以为其指定任意的名字。通过集群名在网络中发现同伴组成集群。一个节点也可是集群。
Index 索引: 一个索引是一个文档的集合(等同于solr中的集合)。每个索引有唯一的名字,通过这个名字来操作它。一个集群中可以有任意多个索引。
Type 类型:指在一个索引中,可以索引不同类型的文档,如用户数据、博客数据。从6.0.0 版本起已废弃,一个索引中只存放一类数据。
Document 文档:被索引的一条数据,索引的基本信息单元,以JSON格式来表示。
Shard 分片:在创建一个索引时可以指定分成多少个分片来存储。每个分片本身也是一个功能完善且独立的“索引”,可以被放置在集群的任意节点上。分片的好处:
允许我们水平切分/扩展容量
可在多个分片上进行分布式的、并行的操作,提高系统的性能和吞吐量。
注意:分片数创建索引时指定,创建后不可改了。备份数可以随时改。
Replication 备份: 一个分片可以有多个备份(副本)。备份的好处:
高可用。一个主分片挂了,副本分片就顶上去
扩展搜索的并发能力、吞吐量。搜索可以在所有的副本上并行运行。-高并发下副本也可搜索
再上层是ES的传输模块和JMX.传输模块支持多种传输协议,如 Thrift、memecached、http,默认使用http。JMX是java的管理框架,用来管理ES应用。
最上层是ES提供给用户的接口,可以通过RESTful接口和ES集群进行交互。
## 全文搜索引擎种类
1、elasticsearch
2、solr
3、sphinx
## 关系数据搜索缺点,也就是直接通过数据库搜索
![](https://box.kancloud.cn/48bb633cc73e94b3c3527ee3d21b48a2_838x542.png)
elasticsearch(搜索引擎)都能弥补以上缺点
# elasticsearch安装
1、elasticsearch是由Java开发的,所以首先要安装Java环境
注意:elasticsearch所需要的Java环境必须大于或者等于1.8版本
下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
![](https://box.kancloud.cn/fbc137492dd23551abcd3abe43f55d8c_886x292.png)
我们下载Windows x64版本.exe文件,直接安装
安装好后,我们cmd命令输入:java -version 查看java版本
2、elasticsearch安装
运行系统可用内存>2G
![](https://box.kancloud.cn/f912dd2d5f87537c622f2e6f1b32fb35_1160x466.png)
双击进入bin文件夹里, elasticsearch.bat 回车运行
然后在浏览器输入http://127.0.0.1:9200/ 返回数据说明成功
![](https://box.kancloud.cn/9594db43b1174ab96681fe2ac613effe_915x546.png)
3、安装elasticsearch(搜索引擎)的可视化管理工具elasticsearch-head
注意:(搜索引擎)的可视化管理工具elasticsearch-head,的安装要用到node.js的npm 插件管理器
所以要先安装node.js的npm 插件管理器
下载地址:https://nodejs.org/en/download/
我们下载windows版本即可,下载后安装即可
安装后cmd命令:npm 如下显示表示安装成功
![](https://box.kancloud.cn/9d4b4d1dd35a8c55635d86dd6226937c_1468x766.png)
(搜索引擎)的可视化管理工具elasticsearch-head的安装
下载地址:https://github.com/mobz/elasticsearch-head
下载后解压到指定目录,会得到以下文件
![](https://box.kancloud.cn/11bc3d73930b7ba5fae60f51f13826f5_633x434.png)
cd进入到解压的elasticsearch-head目录
执行命令:cnpm install 安装elasticsearch-head的依赖包
在执行命令:cnpm run start 启动elasticsearch-head(搜索引擎)的可视化管理工具
访问:http://localhost:9100/
访问后可以看到(搜索引擎)的可视化管理工具
![](https://box.kancloud.cn/60bce75505d0d78538b1a8fa10156cc9_742x218.png)
我们看到显示未连接,我们需要配置elasticsearch-rtf(搜索引擎)连接,在elasticsearch/config/elasticsearch.yml 这个文件里配置
在文件的最后面写入
```
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-methods: OPTIONS, HEAD, GET, POST, PUT, DELETE
```
重启elasticsearch(搜索引擎)后就可以连接了