用户访问咱们的首页,通常都会直接搜索来寻找本身想要购买的商品。
而商品的数量很是多,并且分类繁杂。如何能正确的显示出用户想要的商品,并进行合理的过滤,尽快促成交易,是搜索系统要研究的核心。
面对这样复杂的搜索业务和数据量,使用传统数据库搜索就显得力不从心,通常咱们都会使用全文检索技术,好比以前你们学习过的Solr。
不过今天,咱们要讲的是另外一个全文检索技术:Elasticsearch。html
1.简介前端
node
Elastic有一条完整的产品线及解决方案:Elasticsearch、Kibana、Logstash等,前面说的三个就是你们常说的ELK技术栈。 git
1.1 github
算法
Elasticsearch和MongoDB/Redis/Memcache同样,是非关系型数据库。是一个接近实时的搜索平台,从索引这个文档到这个文档可以被搜索到只有一个轻微的延迟,企业应用定位:采用Restful API标准的可扩展和高可用的实时数据分析的全文搜索工具。
可拓展:支持一主多从且扩容简易,只要cluster.name一致且在同一个网络中就能自动加入当前集群;自己就是开源软件,也支持不少开源的第三方插件。
高可用:在一个集群的多个节点中进行分布式存储,索引支持shards和复制,即便部分节点down掉,也能自动进行数据恢复和主从切换。
采用RestfulAPI标准:经过http接口使用JSON格式进行操做数据。sql
数据存储的最小单位是文档,本质上是一个JSON 文本:docker
数据库
分布式,无需人工搭建集群(solr就须要人为配置,使用Zookeeper做为注册中心)npm
Restful风格,一切API都遵循Rest原则,容易上手
1.2 为什么使用elasticSearch
实际项目开发中,几乎每一个系统都会有一个搜索的功能,数据量少时能够直接从主数据库中好比Mysql搜索,但当搜索作到必定程度时,好比系统数据量上了10亿、100亿条的时候,传统的关系型数据库的I/O性能和统计分析性能就难以知足用户须要了。因此不少公司都会把搜索单独作成一个独立的模块,用ElasticSearch等来实现。虽然内存缓存数据库的读写性能很高,但彻底把数据放在内存中是不太现实的,好比到PB级别的数据,按照每一个节点96G内存计算,在内存彻底装满的数据状况下,须要的机器是:1PB=1024T=1048576G ,节点数就是1048576/96=10922个 ,再考虑到数据备份,节点数还须要翻倍,成本巨大决定了其不现实。
1.3 市场现状
2013年初,GitHub抛弃了Solr,采起ElasticSearch来作PB级的搜索,包括13亿文件和1300亿行代码”。
百度目前普遍使用ElasticSearch做为文本数据分析,采集百度全部服务器上的各种指标数据及用户自定义数据,经过对各类数据进行多维分析展现,辅助定位分析实例异常或业务层面异常。目前覆盖百度内部20多个业务线(包括casio、云分析、网盟、预测、文库、直达号、钱包、风控等),单集群最大100台机器,200个ES节点,天天导入30TB+数据。
1.4 索引结构
下图是ElasticSearch的索引结构,下边黑色部分是物理结构,上边黄色部分是逻辑结构,逻辑结构也是为了更好的去描述ElasticSearch的工做原理及去使用物理结构中的索引文件。
逻辑结构部分是一个倒排索引表(根据词找文章):
一、将要搜索的文档内容分词,全部不重复的词组成分词列表。
二、将搜索的文档最终以Document方式存储起来。
三、每一个词和docment都有关联。
注意:正排索引(从文章中找词)
如今,若是咱们想搜索 quick brown ,咱们只须要查找包含每一个词条的文档:
两个文档都匹配,可是第一个文档比第二个匹配度更高。若是咱们使用仅计算匹配词条数量的简单类似性算法 ,那么,咱们能够说,对于咱们查询的相关性来说,第一个文档比第二个文档更佳。
1.5 RESTful应用方法
Elasticsearch提供 RESTful Api接口进行索引、搜索,而且支持多种客户端。
下图是es在项目中的应用方式:
1)用户在前端搜索关键字
2)项目前端经过http方式请求项目服务端
3)项目服务端经过Http RESTful方式请求ES集群进行搜索
4)ES集群从索引库检索数据。
2.ElasticSearch安装与配置
(1)安装配置:
下载ES: Elasticsearch 6.2.1,解压 elasticsearch-6.2.1.zip
注意:当解压完成后,文件目录中是没有data文件夹的,咱们应该本身手动添加。
bin:脚本目录,包括:启动、中止等可执行脚本
config:配置文件目录
data:索引目录,存放索引文件的地方
logs:日志目录
modules:模块目录,包括了es的功能模块
plugins :插件目录,es支持插件机制
(2)配置文件
<1>3个配置文件
ES的配置文件的地址根据安装形式的不一样而不一样:
使用zip、tar安装,配置文件的地址在安装目录的config下。
使用RPM安装,配置文件在/etc/elasticsearch下。
使用MSI安装,配置文件的地址在安装目录的config下,而且会自动将config目录地址写入环境变量ES_PATH_CONF。
本教程使用的zip包安装,配置文件在ES安装目录的config下。
配置文件以下:
elasticsearch.yml : 用于配置Elasticsearch运行参数
jvm.options : 用于配置Elasticsearch JVM设置
log4j2.properties: 用于配置Elasticsearch日志
elasticsearch.yml 配置实例:
cluster.name: leyou
node.name: ly_node_1
network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300
node.master: true
node.data: true
discovery.zen.ping.unicast.hosts: ["0.0.0.0:9300", "0.0.0.0:9301"]
discovery.zen.minimum_master_nodes: 1
node.ingest: true
bootstrap.memory_lock: false
node.max_local_storage_nodes: 2
path.data: E:\toolsoftware\elasticsearch-6.2.1\data
path.logs: E:\toolsoftware\elasticsearch-6.2.1\logs
http.cors.enabled: true
http.cors.allow-origin: /.*/
注意:根据实际安装目录,修改path.data和path.logs路径配置
经常使用的配置项以下:
(3)启动ElasticSearch
进入bin目录,在cmd下运行:elasticsearch.bat
能够打开bin目录,双击elasticSearch.bat文件,启动ElasticSearch
启动完成后,访问http://localhost:9200/
可见以下内容:
(4)head插件安装
head插件是ES的一个可视化管理插件,用来监视ES的状态,并经过head客户端和ES服务进行交互,好比建立映
射、建立索引等,head的项目地址在https://github.com/mobz/elasticsearch-head 。
从ES6.0开始,head插件支持使得node.js运行
安装步骤:
此时,访问http://localhost:9100/
注意:若出现问题首先考虑
打开浏览器调试工具发现报错:
Origin null is not allowed by Access-Control-Allow-Origin.
缘由是:head插件做为客户端要链接ES服务(localhost:9200),此时存在跨域问题,elasticsearch默认不容许跨
域访问。
解决方案:
设置elasticsearch容许跨域访问。
在config/elasticsearch.yml 后面增长如下参数:
#开启cors跨域访问支持,默认为false http.cors.enabled: true #跨域访问容许的域名地址,(容许全部域名)以上使
用正则 http.cors.allow-origin: /.*/
注意:将config/elasticsearch.yml另存为utf-8编码格式。
elasticsearch原理介绍:https://www.cnblogs.com/dreamroute/p/8484457.html
Elasticsearch数据库:https://blog.csdn.net/aisemi/article/details/80212836(首先查看,最有价值)
大白话ElasticSearch是什么以及应用场景:https://blog.csdn.net/paicmis/article/details/82535018(次推荐浏览)
ElasticSearch从入门到精通,史上最全:https://blog.csdn.net/JENREY/article/details/81290535