1 ElasticSearch简介
1.1 ElasticSearch(简称ES)
Elasticsearch是用Java开发并且是当前最流行的开源的企业级搜索引擎。能够达到实时搜索,稳定,可靠,快速,安装使用方便。客户端支持Java、.NET(C#)、PHP、Python、Ruby等多种语言。
官方网站: https://www.elastic.co/
下载地址: https://www.elastic.co/cn/start
创始人:Shay Banon(谢巴农)
1.2 ElasticSearch与Lucene的关系
Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库(框架),但是想要使用Lucene,必须使用Java来作为开发语言并将其直接集成到你的应用中,并且Lucene的配置及使用非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。
Lucene缺点:
(1) 只能在Java项目中使用,并且要以jar包的方式直接集成项目中。
(2) 使用非常复杂-创建索引和搜索索引代码繁杂。
(3) 不支持集群环境-索引数据不同步(不支持大型项目)。
(4) 索引数据如果太多就不行,索引库和应用所在同一个服务器,共同占用硬盘.共用空间少。
上述Lucene框架中的缺点,ES全部都能解决。
1.3 ES vs Solr比较
1.3.1 ES vs Solr 检索速度
当单纯的对已有数据进行搜索时,Solr更快。
当实时建立索引时, Solr会产生io阻塞,查询性能较差, Elasticsearch具有明显的优势。
大型互联网公司,实际生产环境测试,将搜索引擎从Solr转到 Elasticsearch以后的平均查询速度有了50倍的提升。
1.3.2 总结
(1) Solr 利用 Zookeeper 进行分布式管理,而Elasticsearch 自身带有分布式协调管理功能。
(2) Solr 支持更多格式的数据,比如JSON、XML、CSV,而 Elasticsearch 仅支持json文件格式。
(3) Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用时效率明显低于 Elasticsearch。
(4) Solr 是传统搜索应用的有力解决方案,但 Elasticsearch更适用于新兴的实时搜索应用。
1.3.3 ES vs 关系型数据库
2 Lucene全文检索框架
2.1 什么是全文检索
通过一个程序扫描文本中的每一个单词,针对单词建立索引,并保存该单词在文本中的位置、以及出现的次数。用户查询时,通过之前建立好的索引来查询,将索引中单词对应的文本位置、出现的次数返回给用户,因为有了具体文本的位置,所以就可以将具体内容读取出来了。
2.2 分词原理之倒排索引
3 Elasticsearch中的核心概念
3.1 索引 index
一个索引就是一个拥有几分相似特征的文档的集合。比如说,可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。
3.2 映射 mapping
ElasticSearch中的映射(Mapping)用来定义一个文档mapping是处理数据的方式和规则方面做一些限制,如某个字段的数据类型、默认值、分词器、是否被索引等等,这些都是映射里面可以设置的。
3.3 字段Field
相当于是数据表的字段、列。
3.4 字段类型 Type
每一个字段都应该有一个对应的类型,例如:Text、Keyword、Byte等
3.5 文档 document
一个文档是一个可被索引的基础信息单元,类似一条记录。文档以JSON(Javascript Object
Notation)格式来表示;
3.6 集群 cluster
一个集群就是由一个或多个节点组织在一起,它们共同持有整个的数据,并一起提供索引和搜索功能。
3.7 节点 node
一个节点是集群中的一个服务器,作为集群的一部分,它存储数据,参与集群的索引和搜索功能。一个节点可以通过配置集群名称的方式来加入一个指定的集群。默认情况下,每个节点都会被安排加入到一个叫做“elasticsearch”的集群中。这意味着,如果在网络中启动了若干个节点,并假定它们能够相互发现彼此,它们将会自动地形成并加入到一个叫做“elasticsearch”的集群中。
3.8 分片
一个索引可以存储超出单个结点硬件限制的大量数据。比如,一个具有10亿文档的索引占据1TB的磁盘空间,而任一节点都没有这样大的磁盘空间;或者单个节点处理搜索请求,响应太慢。为了解决这个问题,Elasticsearch提供了将索引划分成多份的能力,这些份就叫做分片。当创建一个索引的时候,可以指定你想要的分片的数量,每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上。
分片很重要,主要有两方面的原因:
(1)允许水平分割/扩展你的内容容量。
(2)允许在分片之上进行分布式的、并行的操作,进而提高性能/吞吐量。
3.9 副本
在一个网络/云的环境里,失败随时都可能发生,在某个分片/节点不知怎么的就处于离线状态,或者由于任何原因消失了,这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的。为此目的,Elasticsearch允许你创建分片的一份或多份拷贝,这些拷贝叫做副本分片,或者直接叫副本。
副本之所以重要,有两个主要原因:
(1) 在分片/节点失败的情况下,提供了高可用性。
(2) 扩展搜索量/吞吐量,因为搜索可以在所有的副本上并行运行。
4 安装ElasticSearch(docker)
4.1 拉取镜像
docker pull elasticsearch:7.4.2
4.2 创建文件
mkdir -p /usr/local/elasticsearch/config
mkdir -p /usr/local/elasticsearch/data
mkdir -p /usr/local/elasticsearch/plugins
4.3 elasticsearch.yml写入值
echo "http.host: 0.0.0.0">>/usr/local/elasticsearch/config/elasticsearch.yml
4.4 给用户权限
#可读,可写,可执行
chmod -R 777 /usr/local/elasticsearch/
4.5 docker run
#9200对外,9300对内通信
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms1g -Xmx1g" \
-v /usr/local/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /usr/local/elasticsearch/data:/usr/share/elasticsearch/data \
-v /usr/local/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.4.2
4.6 查看
http://192.168.38.80:9200/
5 安装kibana
5.1 安装镜像
docker pull kibana:7.4.2
5.2 启动
#ELASTICSEARCH_URL自己的ES地址
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.38.80:9200 -p 5601:5601 -d kibana:7.4.2
5.3 访问
http://192.168.38.80:5601/