赞
踩
本文参考狂神说狂神的视频以及文章,大家可以支持下狂神(狂神ElasticSearch文章地址、狂神ElasticSearch视频地址)
本文涉及一下软件以及版本的声明(以下下载地址除ik之外,都是国内华为镜像)
软件 | 版本 | 下载地址 |
---|---|---|
elasticSearch | 7.6.1 | 注意选择版本 |
elasticSearch-head-master | 7.6.1 | 注意选择版本 |
kibana | 7.6.1 | 注意选择版本 |
elasticsearch-analysis-ik1 | 7.6.1 | 注意选择releases版本,而不是下载源码 |
jdk | 8 (最低要求) | 官网下载 |
需要注意:使用哪个版本的elasticSearch就是使用该版本的对应的软件(注意兼容问题)
注:我是在windows环境下运行的,但是由于elasticSearch相关软件都是开箱即用,也就是说linux版本并无区别(.bat命令与.sh的区别)
Elaticsearch,简称为es,es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别(大数据时代)的数据。es也使用java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是 通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单 。
据国际权威的数据库产品评测机构DB Engines的统计,在2016年1月,ElasticSearch已超过Solr等,成为排名第一的搜索引擎类应用。
es基本是开箱即用(解压就可以用!) ,非常简单。Solr安装略微复杂一丢丢!
Solr 利用Zookeeper进行分布式管理,而Elasticsearch 自身带有分布式协调管理功能 。
Solr 支持更多格式的数据,比如JSON、XML、 CSV ,而Elasticsearch仅支持json文件格式。
Solr 官方提供的功能更多,而Elasticsearch本身更注重于核心功能,高级功能多有第三方插件提供,例如图形化界面需要kibana友好支撑
当单纯的对已有数据进行搜索时,Solr更快
当实时建立索引时, Solr会产生io阻塞,查询性能较差 。
实时建立索引 Elasticsearch具有明显的优势
随着数据量的增加,Solr的搜索效率会变得更低,而Elasticsearch却没有明显的变化。
随数据量的增加 ,solr搜索效率会变得更低
Solr比较成熟,有一个更大,更成熟的用户、开发和贡献者社区,而Elasticsearch相对开发维护者较少,更新太快,学习使用成本较高。
综上所述,Solr的架构不适合实时搜索的应用。
solr同elasticSearch一样使用了lucene作为基础。
那么lucene是什么呢?
Lucene是一套用于全文检索和搜寻的开源程式库,由apache软件基金会支持和提供。
Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具。
就其本身而言,Lucene是当前以及最近几年最受欢迎的免费java信息检索程序库。人们经常提到信息检索程序库,虽然与搜索引擎有关,但不应该将信息检索程序库与搜索引擎相混淆。
lucene是信息检索库,不是搜索引擎。
下载地址请看上面版本说明(都是国内镜像资源,速度比较快)
注意:不要放到中文目录下
bin:启动文件
config:配置文件目录
lib文件夹: 相关jar包
modules文件夹: 功能模块目录
plugins :插件目录 (ik分词器)
双击bin目录下的elasticSearch.bat文件启动
注:注意:如果启动后闪退,可能是文件目录有中午或者空格造成的(具体问题具体百度)
启动成功之后,查看如下:
一些相关的信息
下载地址见本文开始的版本说明,还是直接上地址吧 地址
图解:
首先在elasticSearch下的plugins文件夹下创建文件夹 ik
将elasticsearch-analysis-ik的压缩包解压到ik文件夹下 如下:
然后重启elasticSearch服务
下载地址请看上面版本说明
类似于solr的可视化界面,但是需要单独安装(注意使用环境要有nodejs环境)
查看node版本信息
解压后:
打开cmd窗口至该解压目录下:
执行npm install
安装依赖(注意由于安装的依赖来自外国,所以可以使用阿里的镜像)
切换镜像源:
npm config set registry https://registry.npm.taobao.org
查看是否切换成功:
npm config get registry
执行安装:
npm install
本人在运行中报过一下错误:
npm install报错Failed at the phantomjs-prebuilt@2.1.16 install script
执行一下代码:
npm install phantomjs-prebuilt@2.1.14 --ignore-scripts
执行npm start
运行
如下:
查看可视化界面:
因为该可视化界面端口为9100,而要访问9200的elasticSearch,这就涉及到跨域问题,简单配置一下解决,如下
图解:
配置代码如下:
# 开启跨域
http.cors.enabled: true
# 所有人访问
http.cors.allow-origin: "*"
注意配置文件中不要带注释,可能会闪退(我带了没有闪退)
重启elasticSearch以及head可视化界面(关闭对应的cmd窗口即是关闭进程)
此时便是连接成功了。
Kibana是一个针对ElasticSearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。使用Kibana ,可以通过各种图表进行高级数据分析及展示。
Kibana让海量数据更容易理解。它操作简单,基于浏览器的用户界面可以快速创建仪表板( dashboard )实时显示Elasticsearch查询动态。
设置Kibana非常简单。无需编码或者额外的基础架构,几分钟内就可以完成Kibana安装并启动Elasticsearch索引监测。
当然,如果不想要kibana也是可以的,使用postman模拟各种请求方式也行的(kibana有代码提示)
下载地址见本文最上方(版本说明段落)
注意:解压时间(五分钟)挺长的,不要担心(如果很快解压,注意一下有没有下载错)
解压后的目录
双击直接启动
查看界面
默认是英文界面,接下来根据自己需求是否汉化(汉化请往下看)
修改一下配置文件
重启
如下:
同样是关闭cmd窗口,然后再次双击bat文件
查看可视化界面
此时就是中文界面了,然后打开控制台,准备开始代码之旅了(至此安装工作完成)。
集群,节点,索引,类型,文档,分片,映射是什么?
1、索引(ElasticSearch)
包多个分片
2、字段类型(映射)mapping
字段类型映射(字段是整型,还是字符型…)
3、文档(documents)
4、分片(Lucene索引,倒排索引)
elasticsearch是面向文档,关系型数据库和elasticsearch客观的对比!一切都是json!
初学可以这样认为(对比关系型数据库能够更好的入门):
关系型数据库 | ElasticSearch |
---|---|
数据库(database) | 索引(indices) |
表(table) | 类型(types) |
行(rows) | 文档(documents) |
字段(columns) | fields |
相当于数据库,用于定义文档类型的存储;在同一个索引中,同一个字段只能定义一个数据类型;
类型是文档的逻辑容器,就像关系型数据库一样,表格是行的容器。
文档(”行“)
就是我们的一条条的记录
之前说elasticsearch是面向文档的,那么就意味着索引和搜索数据的最小单位是文档,
elasticsearch中,文档有几个重要属性:
类型中对于字段的定义称为映射,比如name映射为字符串类型。我们说文档是无模式的 ,它们不需要拥有映射中所定义的所有字段,比如新增一个字段,那么elasticsearch是怎么做的呢?
elasticsearch会自动的将新字段加入映射,但是这个字段的不确定它是什么类型, elasticsearch就开始猜,如果这个值是18 ,那么elasticsearch会认为它是整形。
但是elasticsearch也可能猜不对 ,所以最安全的方式就是提前定义好所需要的映射,这点跟关系型数据库殊途同归了,先定义好字段,然后再使用,别整什么幺蛾子。
一个集群至少有一 个节点,而一个节点就是一-个elasricsearch进程 ,节点可以有多个索引默认的,如果你创建索引,那么索引将会有个5个分片( primary shard
,又称主分片)构成的,每一个主分片会有-一个副本( replica shard
,又称复制分片)
分片图:
节点与分片图:
上图是一个有3个节点的集群,可以看到主分片和对应的复制分片都不会在同-个节点内,这样有利于某个节点挂掉了,数据也不至于丢失。实际上, 一个分片是- -个Lucene索引, 一个包含倒排索引的文件目录,倒排索引的结构使得elasticsearch在不扫描全部文档的情况下,就能告诉你哪些文档包含特定的关键字。不过,等等,倒排索引是什么鬼?
elasticsearch使用的是一种称为倒排索引 的结构,采用Lucene倒排索引作为底层。这种结构适用于快速的全文搜索,一个索引由文档中所有不重复的列表构成,对于每一个词,都有一个包含它的文档列表。 例如,现在有两个文档,每个文档包含如下内容:
Study every day, good good up to forever # 文档1包含的内容
To forever, study every day,good good up # 文档2包含的内容
(注意区分大小写)
创建倒排索引,我们首先要将每个文档拆分成独立的词(或称为词条或者tokens) ,然后创建一个包含所有不重复的词条的排序列表,然后列出每个词条出现在哪个文档:
拆分后的列表以及是否在文档中存在:
现在,我们试图搜索 to forever,只需要查看包含每个词条的文档(对比上表拆分后的存在情况)
term | doc_1 | doc_2 |
---|---|---|
to | √ | × |
forever | √ | √ |
total | 2 | 1 |
两个文档都匹配,但是第一个文档比第二个匹配程度更高。如果没有别的条件,现在,这两个包含关键字的文档都将返回。
比如某网上商城中有几个电子设备,标题分别是 ①华为手机、②苹果手机以及③苹果耳机。此时小明搜索标题为 手机的商品,搜到了①和②,那么是如何实现的呢?
首先倒排索引将①华为手机、②苹果手机以及③苹果耳机拆分为以下关键字:
华为、手机、耳机。
其中标题包含华为的商品:
①华为手机
包含手机的商品:
①华为手机、②苹果手机
包含耳机的商品:
③苹果耳机
此时当你搜索标题为手机时,它会帮你找到包含手机关键字的商品即:①华为手机、②苹果手机
分词:即把一段中文或者别的划分成一个个的关键字,我们在搜索时候会把自己的信息进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一 一个匹配操作,默认的中文分词是将每个字看成一个词(不使用用IK分词器的情况下),比如“我爱狂神”会被分为”我”,”爱”,”狂”,”神” ,这显然是不符合要求的,所以我们需要安装中文分词器ik来解决这个问题。
安装ik分词之后:
IK提供了两个分词算法: (ik_smart
和ik_max_word
),其中ik_smart为最少切分,ik_max_word为最细粒度划分!
可以把ik分词想象是一个中文词典,然后对中文分析就是在词典中找词。(以下我便这样描述)
上面的最小划分可以看出“华为手机”由于词典中没有该词,被拆分为“华为”、“手机”两个词,但是实际上“华为手机”在现在很知名,所以我们必须把它加入到我们的词典中,这样下次搜索“华为手机”时,就可以不被拆分,那么该如何做呢?
命名选择英文命名
该目录下创建词典
重启elasticSearch服务,再次查询“华为手机”,如下:
此时“华为手机”不再被拆分为“华为”、“手机”。
拓展停止前,我们搜索“小明爱喝奶”,
ik的两个分词效果如下:
两种分词都将“小明爱喝奶”的“小明”当成了一个词语解析出来了,但是我们并不想让“小明”当做词语被解析出来,那么如何做呢?
同上面的拓展词典
修改配置文件
在该目录下,创建拓展停止词典,如下
此时再次分析“小明爱喝奶”,如下:
此时“小明”并没有被当做词语被解析出来。
然后我们直接分析“小明”,发现如下:
解析不出来词语,那么我们可以用这个东西做什么事呢?
根据上述的功能,我们发现停止拓展词典,可以帮助我们不解析某些词语(“小明”),那么我们可以往拓展停止词典中,加入敏感词,从而实现敏感词汇过滤。
在许多的网上商城平台是不允许贩卖“香烟”的,因此我们同时是搜索不到的,那么如何过滤“香烟”这个词语呢?
过滤前,ik的两种分词效果:
分析“香烟”:
分析“买香烟”:
具体如下:
重启elasticSearch服务,然后再次分析:
分析“买香烟”:
分析“香烟”:
这样就算是过滤掉敏感词汇查询了。
至此本文结束!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。