admin管理员组

文章数量:1574959

前言

文章目录

文章目录

    • 前言
      • 文章目录
      • 引用说明
      • 版本说明
    • 一、ElasticSearch概述
      • 简介
      • 使用范围
      • 与solr的对比
        • lucene简介
    • 二、ElasticSearch的安装
      • 下载
      • 解压
      • 目录文件解读
      • 配置
      • 启动
    • 三、安装ik分词器
      • 解压
    • 四、安装elasticsearch-head可视化界面
      • 解压
      • 执行命令
        • 安装依赖
        • 报错
        • 运行
      • 解决跨域问题
      • 重启服务
    • 五、安装kibana
      • 下载
      • 解压
      • 汉化
    • 六、ElasticSearch核心概念
      • 关系型数据库对比ElasticSearch
      • 索引(indices)
      • 类型(types)
      • 文档(documents)
      • 字段(fields)
      • 分片与节点
      • 倒排索引
      • 例子
    • 七、elasticSearch的拓展词典以及拓展停止词典
      • ik分词
        • 查看不同的分词效果
        • 构建我们自己的拓展词典
          • 修改配置文件
          • 创建自己的词典
          • 重启服务
        • 构建我们的拓展停止词典
          • 修改配置文件
          • 创建拓展停止词典
          • 重启服务
        • 敏感词汇过滤
          • 具体实现
          • 往停止拓展词典中加词
          • 重启服务

引用说明

本文参考狂神说狂神的视频以及文章,大家可以支持下狂神(狂神ElasticSearch文章地址、狂神ElasticSearch视频地址)


版本说明

本文涉及一下软件以及版本的声明(以下下载地址除ik之外,都是国内华为镜像)

软件版本下载地址
elasticSearch7.6.1注意选择版本
elasticSearch-head-master7.6.1注意选择版本
kibana7.6.1注意选择版本
elasticsearch-analysis-ik17.6.1注意选择releases版本,而不是下载源码
jdk8 (最低要求)官网下载

需要注意:使用哪个版本的elasticSearch就是使用该版本的对应的软件(注意兼容问题)
注:我是在windows环境下运行的,但是由于elasticSearch相关软件都是开箱即用,也就是说linux版本并无区别(.bat命令与.sh的区别)


一、ElasticSearch概述

简介

Elaticsearch,简称为es,es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别(大数据时代)的数据。es也使用java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是 通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单 。

据国际权威的数据库产品评测机构DB Engines的统计,在2016年1月,ElasticSearch已超过Solr等,成为排名第一的搜索引擎类应用。

使用范围

  • 维基百科
  • github
  • 电商网站
  • stack Overflow网站
  • 等等。。。

与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的架构不适合实时搜索的应用。


lucene简介

solr同elasticSearch一样使用了lucene作为基础。
那么lucene是什么呢?

Lucene是一套用于全文检索和搜寻的开源程式库,由apache软件基金会支持和提供。
Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具。
就其本身而言,Lucene是当前以及最近几年最受欢迎的免费java信息检索程序库。人们经常提到信息检索程序库,虽然与搜索引擎有关,但不应该将信息检索程序库与搜索引擎相混淆。

lucene是信息检索库,不是搜索引擎。


二、ElasticSearch的安装

下载

下载地址请看上面版本说明(都是国内镜像资源,速度比较快)

解压

注意:不要放到中文目录下


目录文件解读

bin:启动文件
config:配置文件目录

  • log4j2 日志配置文件
  • jvm.options java虚拟机相关的配置(默认启动占1g内存,内容不够需要自己调整)
  • elasticsearch.yml elasticsearch的配置文件(默认9200端口)

lib文件夹: 相关jar包
modules文件夹: 功能模块目录
plugins :插件目录 (ik分词器)


配置

  • 对启动所需运存的配置(如果你是阿里云,1G的内存等小内存,注意修改,避免无法启动)比如256m

    除此之外,没有多余的配置工作(有需要的根据自己的需求配配置)

启动

双击bin目录下的elasticSearch.bat文件启动


注:注意:如果启动后闪退,可能是文件目录有中午或者空格造成的(具体问题具体百度)


启动成功之后,查看如下:

一些相关的信息


三、安装ik分词器

下载地址见本文开始的版本说明,还是直接上地址吧 地址

图解:

解压

首先在elasticSearch下的plugins文件夹下创建文件夹 ik

将elasticsearch-analysis-ik的压缩包解压到ik文件夹下 如下:

然后重启elasticSearch服务

四、安装elasticsearch-head可视化界面

下载地址请看上面版本说明

类似于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

Kibana是一个针对ElasticSearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。使用Kibana ,可以通过各种图表进行高级数据分析及展示。
Kibana让海量数据更容易理解。它操作简单,基于浏览器的用户界面可以快速创建仪表板( dashboard )实时显示Elasticsearch查询动态。
设置Kibana非常简单。无需编码或者额外的基础架构,几分钟内就可以完成Kibana安装并启动Elasticsearch索引监测。


当然,如果不想要kibana也是可以的,使用postman模拟各种请求方式也行的(kibana有代码提示)


下载

下载地址见本文最上方(版本说明段落)


解压

注意:解压时间(五分钟)挺长的,不要担心(如果很快解压,注意一下有没有下载错)


解压后的目录


双击直接启动

查看界面

默认是英文界面,接下来根据自己需求是否汉化(汉化请往下看)


汉化

修改一下配置文件


重启
如下:
同样是关闭cmd窗口,然后再次双击bat文件


查看可视化界面

此时就是中文界面了,然后打开控制台,准备开始代码之旅了(至此安装工作完成)。


六、ElasticSearch核心概念

集群,节点,索引,类型,文档,分片,映射是什么?

1、索引(ElasticSearch)

包多个分片

2、字段类型(映射)mapping

字段类型映射(字段是整型,还是字符型…)

3、文档(documents)

4、分片(Lucene索引,倒排索引)

elasticsearch是面向文档,关系型数据库和elasticsearch客观的对比!一切都是json!

关系型数据库对比ElasticSearch

初学可以这样认为(对比关系型数据库能够更好的入门):

关系型数据库ElasticSearch
数据库(database)索引(indices)
表(table)类型(types)
行(rows)文档(documents)
字段(columns)fields

索引(indices)

相当于数据库,用于定义文档类型的存储;在同一个索引中,同一个字段只能定义一个数据类型;

类型(types)

类型是文档的逻辑容器,就像关系型数据库一样,表格是行的容器。

文档(documents)

文档(”行“)

就是我们的一条条的记录

之前说elasticsearch是面向文档的,那么就意味着索引和搜索数据的最小单位是文档,
elasticsearch中,文档有几个重要属性:

  • 自我包含, 一篇文档同时包含字段和对应的值,也就是同时包含key:value !
  • 可以是层次型的,一个文档中包含自文档,复杂的逻辑实体就是这么来的! {就是一 个json对象! fastjson进行自动转换!}
  • 灵活的结构,文档不依赖预先定义的模式,我们知道关系型数据库中,要提前定义字段才能使用,在elasticsearch中,对于字段是非常灵活的,有时候,我们可以忽略该字段,或者动态的添加一个新的字段。

字段(fields)

类型中对于字段的定义称为映射,比如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,只需要查看包含每个词条的文档(对比上表拆分后的存在情况)

termdoc_1doc_2
to×
forever
total21

两个文档都匹配,但是第一个文档比第二个匹配程度更高。如果没有别的条件,现在,这两个包含关键字的文档都将返回。


例子

比如某网上商城中有几个电子设备,标题分别是 ①华为手机、②苹果手机以及③苹果耳机。此时小明搜索标题为 手机的商品,搜到了①和②,那么是如何实现的呢?

首先倒排索引将①华为手机、②苹果手机以及③苹果耳机拆分为以下关键字:
华为、手机、耳机。

其中标题包含华为的商品:
①华为手机
包含手机的商品:
①华为手机、②苹果手机
包含耳机的商品:
③苹果耳机


此时当你搜索标题为手机时,它会帮你找到包含手机关键字的商品即:①华为手机、②苹果手机


七、elasticSearch的拓展词典以及拓展停止词典

ik分词

分词:即把一段中文或者别的划分成一个个的关键字,我们在搜索时候会把自己的信息进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一 一个匹配操作,默认的中文分词是将每个字看成一个词(不使用用IK分词器的情况下),比如“我爱狂神”会被分为”我”,”爱”,”狂”,”神” ,这显然是不符合要求的,所以我们需要安装中文分词器ik来解决这个问题。

安装ik分词之后:
IK提供了两个分词算法: (ik_smartik_max_word ),其中ik_smart为最少切分,ik_max_word为最细粒度划分!

查看不同的分词效果

可以把ik分词想象是一个中文词典,然后对中文分析就是在词典中找词。(以下我便这样描述)

  • 最小划分

    可以看出词典中有“中国共产党”这个词语,但是没有“华为手机”这个词语,所以将“华为手机”拆分为“华为”、“手机”两个词进行查询,词典有“华为”、“手机”这两个词语。所以不再对其拆分。

  • ik_max_word:最细粒度划分(穷尽词库的可能)

    此时我们可以看到“中国共产党”被拆分之后组成了多个词语。

构建我们自己的拓展词典

上面的最小划分可以看出“华为手机”由于词典中没有该词,被拆分为“华为”、“手机”两个词,但是实际上“华为手机”在现在很知名,所以我们必须把它加入到我们的词典中,这样下次搜索“华为手机”时,就可以不被拆分,那么该如何做呢?


修改配置文件

命名选择英文命名

创建自己的词典

该目录下创建词典


重启服务

重启elasticSearch服务,再次查询“华为手机”,如下:

此时“华为手机”不再被拆分为“华为”、“手机”。


构建我们的拓展停止词典

拓展停止前,我们搜索“小明爱喝奶”,
ik的两个分词效果如下:

两种分词都将“小明爱喝奶”的“小明”当成了一个词语解析出来了,但是我们并不想让“小明”当做词语被解析出来,那么如何做呢?

同上面的拓展词典

修改配置文件

修改配置文件

创建拓展停止词典

在该目录下,创建拓展停止词典,如下

重启服务

此时再次分析“小明爱喝奶”,如下:

此时“小明”并没有被当做词语被解析出来。
然后我们直接分析“小明”,发现如下:

解析不出来词语,那么我们可以用这个东西做什么事呢?

敏感词汇过滤

根据上述的功能,我们发现停止拓展词典,可以帮助我们不解析某些词语(“小明”),那么我们可以往拓展停止词典中,加入敏感词,从而实现敏感词汇过滤。

具体实现

在许多的网上商城平台是不允许贩卖“香烟”的,因此我们同时是搜索不到的,那么如何过滤“香烟”这个词语呢?

过滤前,ik的两种分词效果:

分析“香烟”:


分析“买香烟”:

往停止拓展词典中加词

具体如下:

重启服务

重启elasticSearch服务,然后再次分析:

分析“买香烟”:

分析“香烟”:

这样就算是过滤掉敏感词汇查询了。


至此本文结束!!!

本文标签: 词典分词中文屏蔽汉化