elasticsearch安装步骤

一 elasticsearch概念

1 概念

Elasticsearch是用Java开发并且是当前最流行的开源的企业级搜索引擎。能够达到实时搜索,稳定,可靠,快速,安装使用方便。

客户端支持Java、.NET(C#)、PHP、Python、Ruby等多种语言。

官方网站:Elasticsearch Platform --- Find real-time answers at scale | Elastic

下载地址:https://www.elastic.co/cn/start

创始人:Shay Banon(谢巴农)

2 应用场景

  • 百度搜索
  • 电商检索商品

  • 在打车软件搜索附近的车

3 ElasticSearch与Lucene的关系

Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库(框架)

但是想要使用Lucene,必须使用Java来作为开发语言并将其直接集成到你的应用中,并且Lucene的配置及使用非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。

Lucene缺点:

1)只能在Java项目中使用,并且要以jar包的方式直接集成项目中.

2)使用非常复杂-创建索引和搜索索引代码繁杂

3)不支持集群环境-索引数据不同步(不支持大型项目)

4)索引数据如果太多就不行,索引库和应用所在同一个服务器,共同占用硬盘.共用空间少.

上述Lucene框架中的缺点,ES全部都能解决.

4 哪些公司在使用ElasticSearch

京东、携程、 去哪儿、58同城、 滴 滴、今日头条、小米、哔哩哔哩、联想、GitHup、微 软、Facebook

5 ES 和 solr比较

  • 当单纯的对已有数据进行搜索时,Solr更快。

  • 当实时建立索引时, Solr会产生io阻塞,查询性能较差, Elasticsearch具有明显的优势。

  • 大型互联网公司,实际生产环境测试,将搜索引擎从Solr转到 Elasticsearch以后的平均查询速度有了50倍的提升。

虽然在早期,Apache Solr是最主要的搜索引擎技术,但随着发展elasticsearch已经渐渐超越了Solr,独占鳌头:

6总结

什么是elasticsearch?

  • 一个开源的分布式搜索引擎,可以用来实现搜索、日志统计、分析、系统监控(ELK)等功能。

什么是elastic stack(ELK)?

  • 是以elasticsearch为核心的技术栈,包括Logstash、kibana、elasticsearch

什么是Lucene?

  • 是Apache的开源搜索引擎类库,提供了搜索引擎的核心API

二 Lucene全文检索框架

1 什么是全文检索

全文检索是指:

通过一个程序扫描文本中的每一个单词,针对单词建立索引,并保存该单词在文本中的位置、以及出现的次数,用户查询时,通过之前建立好的索引来查询,将索引中单词对应的文本位置、出现的次数返回给用户,因为有了具体文本的位置,所以就可以将具体内容读取出来了

2 分词原理之倒排索引

倒排索引的概念是基于MySQL这样的正向索引而言的。

1 正向索引

那么什么是正向索引呢?例如给下表(tb_goods)中的id创建索引:

如果是根据id查询,那么直接走索引,查询速度非常快。

但如果是基于title做模糊查询,只能是逐行扫描数据,流程如下:

1)用户搜索数据,条件是title符合"%手机%"

2)逐行获取数据,比如id为1的数据

3)判断数据中的title是否符合用户搜索条件

4)如果符合则放入结果集,不符合则丢弃。回到步骤1

逐行扫描,也就是全表扫描,随着数据量增加,其查询效率也会越来越低。当数据量达到数百万时,就是一场灾难。

2 倒排索引

倒排索引中有两个非常重要的概念:

  • 文档(Document):用来搜索的数据,其中的每一条数据就是一个文档。例如一个网页、一个商品信息

  • 词条(Term):对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词条。例如:我是中国人,就可以分为:我、是、中国人、中国、国人这样的几个词条

创建倒排索引是对正向索引的一种特殊处理,流程如下:

  • 将每一个文档的数据利用算法分词,得到一个个词条

  • 创建表,每行数据包括词条、词条所在文档id、位置等信息

  • 因为词条唯一性,可以给词条创建索引,例如hash表结构索引

如图:

倒排索引:根据分词算法,我们把文档中的词条和对应的文档id记录下来,当我们下次搜索的时候,我们输入词条信息,就能获取到文档的id,然后再根据id找到对应的文档。

倒排索引的搜索流程如下(以搜索"华为手机"为例):

1)用户输入条件"华为手机"进行搜索。

2)对用户输入内容分词 ,得到词条:华为手机

3)拿着词条在倒排索引中查找,可以得到包含词条的文档id:1、2、3。

4)拿着文档id到正向索引中查找具体文档。

如图:

虽然要先查询倒排索引,再查询正向索引,但是无论是词条、还是文档id都建立了索引,查询速度非常快!无需全表扫描。

3 正向和倒排

那么为什么一个叫做正向索引,一个叫做倒排索引呢?

  • 正向索引 是最传统的,根据id索引的方式。但根据词条查询时,必须先逐条获取每个文档,然后判断文档中是否包含所需要的词条,是根据文档找词条的过程

  • 倒排索引 则相反,是先找到用户要搜索的词条,根据词条得到保护词条的文档的id,然后根据id获取文档。是根据词条找文档的过程

是不是恰好反过来了?

那么两者方式的优缺点是什么呢?

正向索引

  • 优点:

    • 可以给多个字段创建索引

    • 根据索引字段搜索、排序速度非常快

  • 缺点:

    • 根据非索引字段,或者索引字段中的部分词条查找时,只能全表扫描。

倒排索引

  • 优点:

    • 根据词条搜索、模糊搜索时,速度非常快
  • 缺点:

    • 只能给词条创建索引,而不是字段

    • 无法根据字段做排序

3 ES中的概念

elasticsearch中有很多独有的概念,与mysql中略有差别,但也有相似之处。

ES7以前 索引 库 和 type 表

ES7以后,取消了type的概念,我们的ES里面只有一个库/一张表

1 索引 index

索引(Index) ,就是相同类型的文档的集合,相当于数据库中库的概念。 一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。

例如:

  • 所有用户文档,就可以组织在一起,称为用户的索引;

  • 所有商品的文档,可以组织在一起,称为商品的索引;

  • 所有订单的文档,可以组织在一起,称为订单的索引;

因此,我们可以把索引当做是数据库中的表。

2 映射 mapping

ElasticSearch中的映射(Mapping)用来定义一个文档,mapping是处理数据的方式和规则方面做一些限制,如某个字段的数据类型、默认值、分词器、是否被索引等等,这些都是映射里面可以设置的。

mapping可以理解为是用来对字段做限制的

3 文档 document

elasticsearch是面向**文档(Document)**存储的,一个文档是一个可被索引的基础信息单元,类似一条记录,可以是数据库中的一条商品数据,一个订单信息。文档以JSON(Javascript Object Notation)格式来表示

document就是我们搜索的时候,得到的一条记录。

4 字段Field

分词:

我们把一句话,按照某些规则切割出来,把一句话切分成一个一个的词(虚词,标点,实词),拿到实词以后,和我们自己规定好的词做对比

相当于是数据表的列,ES中Field可以指定的类型

  • 字符串类型:

text:一般备用于全文检索。将当前Field进行分词。 我 叫 刘德华

keyword:当前Field不会被分词。 我是中国人

  • 数值类型:

long、 integer、short、byte、double、float

  • 时间类型:

date类型,针对时间类型指定具体的格式

  • 布尔类型:

boolean类型,表达true和false

  • 二进制类型:

binary类型暂时支持Base64 encodestring

5 mysql与elasticsearch

我们统一的把mysql与elasticsearch的概念做一下对比:

MySQL Elasticsearch 说明
Table Index 索引(index),就是文档的集合,类似数据库的表(table)
Row Document 文档(Document),就是一条条的数据,类似数据库中的行(Row),文档都是JSON格式
Column Field 字段(Field),就是JSON文档中的字段,类似数据库中的列(Column)
Schema Mapping Mapping(映射)是索引中文档的约束,例如字段类型约束。类似数据库的表结构(Schema)
SQL DSL DSL是elasticsearch提供的JSON风格的请求语句,用来操作elasticsearch,实现CRUD

注意:

  • Mapping: 可以理解为规定了es中field字段的数据类型

是不是说,我们学习了elasticsearch就不再需要mysql了呢?

并不是如此,两者各自有自己的擅长之处:

  • Mysql:擅长事务类型操作,可以确保数据的安全和一致性

  • Elasticsearch:擅长海量数据的搜索、分析、计算

因此在企业中,往往是两者结合使用:

  • 对安全性要求较高的写操作,使用mysql实现

  • 对查询性能要求较高的搜索需求,使用elasticsearch实现

  • 两者再基于某种方式,实现数据的同步,保证一致性。(一般通过mq来同步的)

三 安装

7.x版本以上的es安装需要jdk11版本,否则需要使用es自带的jdk,如何使用自带jdk下面也会讲到。

1 ES安装

md-end-block 复制代码
<span style="background-color:#f8f8f8"><strong><span style="color:#0000ff"># 1 将安装包放到/usr/local目录下,并执行解压命令</span></strong>
    <span style="color:#aa5500">tar -zxvf elasticsearch-7.12.1-linux-x86_64.tar.gz </span>
<strong><span style="color:#0000ff"># 2 修改文件名称</span></strong>
     <span style="color:#aa5500">mv elasticsearch-7.12.1 es</span>
<strong><span style="color:#0000ff"># 3 新增es用户</span></strong>
    <span style="color:#aa5500">useradd es</span>
<strong><span style="color:#0000ff"># 4 为es用户设置密码</span></strong>
    <span style="color:#aa5500">passwd es</span>
<strong><span style="color:#0000ff"># 5 设置文件夹的权限</span></strong>
    <span style="color:#aa5500">chown -R es:es /usr/local/es/</span></span>

jdk8启动ES7.x以上版本会报错,在es的bin/elasticsearch文件打开,最前面添加这几句,配置了jdk11可以不用

md-end-block 复制代码
<span style="background-color:#f8f8f8">#配置自己的jdk11
export JAVA_HOME=/usr/es/jdk
export PATH=$JAVA_HOME/bin:$PATH
 
#添加jdk判断
if [ -x "$JAVA_HOME/bin" ]; then
        <span style="color:#aa5500">JAVA="/usr/es/jdk/bin/java"</span>
else
        <span style="color:#aa5500">JAVA=`which java`</span>
fi</span>

修改/etc/security/limits.conf

vi /etc/security/limits.conf

md-end-block 复制代码
<span style="background-color:#f8f8f8"><strong><span style="color:#0000ff"># 每个进程可以打开的文件数的限制</span></strong>
es soft nofile 65536
es hard nofile 65536</span>

修改/etc/security/limits.d/20-nproc.conf

vi /etc/security/limits.d/20-nproc.conf

md-end-block 复制代码
<span style="background-color:#f8f8f8"><strong><span style="color:#0000ff"># 每个进程可以打开的文件数的限制</span></strong>
es soft nofile 65536
es hard nofile 65536
* hard nproc 4096</span>

修改/etc/sysctl.conf

vi /etc/sysctl.conf

md-end-block 复制代码
<span style="background-color:#f8f8f8"><strong><span style="color:#0000ff"># 一个进程可以拥有的VMA(虚拟内存区域)的数量,默认值为65536</span></strong>
vm.max_map_count=655360</span>
  • 配置文件修改 vi /usr/local/es/config/elasticsearch.yml
md-end-block 复制代码
<span style="background-color:#f8f8f8"><span style="color:#aa5500">#集群名称</span>
<span style="color:#221199">cluster.name</span><span style="color:#555555">: </span>elasticsearch
<span style="color:#aa5500">#节点名称</span>
<span style="color:#221199">node.name</span><span style="color:#555555">: </span>node-1
<span style="color:#aa5500">#ip地址</span>
<span style="color:#221199">network.host</span><span style="color:#555555">: </span><span style="color:#116644">0.0.0.0</span>
<span style="color:#aa5500">#端口号</span>
<span style="color:#221199">http.port</span><span style="color:#555555">: </span><span style="color:#116644">9200</span>
<span style="color:#aa5500">#主节点设置</span>
<span style="color:#221199">cluster.initial_master_nodes</span><span style="color:#555555">: [</span><span style="color:#aa1111">"node-1"</span><span style="color:#555555">]</span></span>

cluster.name: elasticsearch node.name: node-1 network.host: 0.0.0.0 http.port: 9200 cluster.initial_master_nodes: ["node-1"]

执行 sysctl -p 所有得配置文件生效

chown -R es:es /usr/local/es/

  • 切换到es账户,启动服务,并访问 ip:9200 su es 远程服务器一定要开启远程端口 9200

  • 关闭防火墙

    systemctl stop firewalld

    systemctl disable firewalld

md-end-block 复制代码
<span style="background-color:#f8f8f8">./elasticsearch -d</span>

2分词器

1 分词器安装

  • 下载:https://github.com/medcl/elasticsearch-analysis-ik/releases (已经提供)

  • 安装解压命令:

    yum install zip

    yum install unzip

  • 切换到es用户 ,在es的安装目录下/plugins创建ik。

    su es mkdir -p /usr/local/es/plugins/ik

  • 将下载的ik分词器上传并解压到该目录

    cd /usr/local/es/plugins/ik

    unzip elasticsearch-analysis-ik-7.12.1.zip

  • 记得将zip 文件删除,否则可能报错。

  • 查看插件是否起作用 切换到es的bin目录

    ./elasticsearch-plugin list

2 分词说明

  • ik分词器,有两种ik_smart和ik_max_word

  • ik_smart会将"清华大学"整个分为一个词。

  • ik_max_word会将"清华大学"分为"清华大学","清华"和"大学"。

  • es默认分词是ik_max_word

3 安装kibana

  • 下载Kibana放之/usr/local/es目录中

  • 解压文件:

    tar -zxvf kibana-7.12.1-linux-x86_64.tar.gz

  • 进入kibana配置目录

    cd /usr/local/es/kibana-7.12.1-linux-x86_64/config

  • 使用vi编辑器:vi kibana.yml

    server.port: 5601

    server.host: "服务器IP" 如果是云服务器 0.0.0.0

    elasticsearch.hosts: ["http://IP:9200"]

    server.port: 5601

    server.host: "192.168.56.181"

    elasticsearch.hosts: ["http://192.168.56.181:9200"]

  • 启动kibana,进入kibana的启动目录, 县启动ES再启动kibana,否则启动不了。

    /usr/local/es/kibana-7.12.1-linux-x86_64/bin

    nohup ./kibana &

  • 访问

    http://192.168.192.181:5601/app/kibana

    4 安装header插件

    什么是Head ealsticsearch只是后端提供各种api,那么怎么直观的使用它呢?elasticsearch-head将是一款专门针对于elasticsearch的客户端工具,类似mysql的sqlyog或者navicat

    elasticsearch-head配置包,下载地址:https://github.com/mobz/elasticsearch-head安装

    es5以上版本安装head需要安装node和grunt

    第一步:从地址:Download | Node.js 下载相应系统的msi,双击安装。

    第二步:安装完成用cmd进入安装目录执行 node -v可查看版本号

    第三步:执行 npm install -g grunt-cli 安装grunt ,安装完成后执行grunt -version查看是否安装成功,会显示安装的版本号

    第四步:进入D:\devlop\elasticsearch-head-master文件夹,执行npm install命令,如果报错,可以执行 npm -g install phantomjs-prebuilt@2.1.16 --ignore-script

    第五步:运行head插件,下面命令二选一

    • 命令一:npm run start

    • 命令二:grunt server

    连接测试时发现,存在跨域问题:配置vi /usr/local/es/config/elasticsearch.yml

    md-end-block 复制代码
    <span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">http</span>.<span style="color:#000000">cors</span>.<span style="color:#000000">enabled</span>: <span style="color:#221199">true</span> 
    <span style="color:#000000">http</span>.<span style="color:#000000">cors</span>.<span style="color:#000000">allow</span><span style="color:#981a1a">-</span><span style="color:#000000">origin</span>: <span style="color:#aa1111">"*"</span></span></span>

    重启服务,然后再次连接。

    如果不小心用root账户操作了es文件,那么记得先把进程kill,chown -R es:es /usr/local/es/ ,在切换到你的es账户操作。最好是用xshell开两个窗口,一个root 一个es

相关推荐
陈小桔4 小时前
idea中重新加载所有maven项目失败,但maven compile成功
java·maven
小学鸡!4 小时前
Spring Boot实现日志链路追踪
java·spring boot·后端
xiaogg36784 小时前
阿里云k8s1.33部署yaml和dockerfile配置文件
java·linux·kubernetes
逆光的July4 小时前
Hikari连接池
java
微风粼粼4 小时前
eclipse 导入javaweb项目,以及配置教程(傻瓜式教学)
java·ide·eclipse
番茄Salad4 小时前
Spring Boot临时解决循环依赖注入问题
java·spring boot·spring cloud
天若有情6735 小时前
Spring MVC文件上传与下载全面详解:从原理到实战
java·spring·mvc·springmvc·javaee·multipart
祈祷苍天赐我java之术5 小时前
Redis 数据类型与使用场景
java·开发语言·前端·redis·分布式·spring·bootstrap
Olrookie6 小时前
若依前后端分离版学习笔记(二十)——实现滑块验证码(vue3)
java·前端·笔记·后端·学习·vue·ruoyi
倚栏听风雨7 小时前
java.lang.SecurityException异常
java