ElasticSearcho从入门到放弃:(一)简介, lucene,概念, 安装

文章目录

  • 一、ElasticSeach简介
    • 1. 介绍
    • 2. ES可以做什么
      • 2.1 信息检索
      • 2.2 企业内部系统搜索
      • 2.3 数据分析引擎
    • 3. ES特点
      • 3.1 海量数据处理
      • 3.2 开箱即用
      • 3.3 作用传统数据库的补充
    • 4. ES对比solr:
  • 二、Lucene全文检索库
    • 1. 什么是全文检索
      • 1.1 结构化数据与非结构化数据
      • 1.2 搜索结构化数据和非结构化数据
      • 1.3 全文检索:
    • 2. Lucene简介
  • 三、ES的核心概念:
    • 1. 索引 index:
    • 2. 映射 mapping
    • 3. 字段 Field
    • 4. 类型type
    • 5. 文档 document
    • 6. 集群 cluster
    • 7. 节点 node
    • 8. 分片和副本: shards & replicas
      • 8.1 分片
      • 8.2 副本
  • 四. 安装ES:
    • 1. 安装es:
      • 1.1 创建普通用户:
      • 1.2 为普通用户添加sudo权限
      • 1.3 准备安装包
      • 1.4 修改配置文件
        • 1.4.1 修改elasticsearch.yml
        • 1.4.2 修改jvm.option
      • 1.5 配置其他节点
      • 1.6 修改系统配置, 解决启动问题
        • 1.6.1 打开文件的最大数限制;
        • 1.6.2 启动线程数限制
        • 1.6.3 调大虚拟内存
      • 1.7 启动es
    • 2. 使用Docker
    • 3. Elasticsearch-head插件
    • 4. 安装IK分词器
    • 5. 准备Vscode开发环境

一、ElasticSeach简介

官方网站: https://www.elastic.co/cn/elasticsearch/

1. 介绍

  • Elasticsearch是一个基于Lucence的搜索服务器;
  • 提供了一个分布式多用户能力的全文搜索引擎, 基于RESTful web接口;
  • Elasticsearch是用java语言发开的, 并作为Apache许可条款下的开放源码发布, 是一种流行的企业级搜索引擎;
  • ES用于云计算中, 能够达到实时搜索, 稳定, 可靠,快速,安装使用方便;官方客户端维护多种编程语言可用;
  • 根据DB-Engines排名显示, ES是最受欢迎的企业所搜索引擎;

2. ES可以做什么

2.1 信息检索

2.2 企业内部系统搜索

  • 关系型数据库使用like进行模糊检索, 会导致索引失效, 效率低下;
  • 可以基于ES来进行检索, 效率非常高;

2.3 数据分析引擎

ES聚合可以对数十一行日志数据进行聚合分析, 套索数据的趋势和规律;

3. ES特点

3.1 海量数据处理

  • 大型分布式集群(数百台规模服务器)
  • 处理PB级数据
  • 小公司也可以进行单机部署;

3.2 开箱即用

  • 简单易用, 操作简单
  • 快速部署生产环境

3.3 作用传统数据库的补充

  • 传统关系型数据库不擅长全文检索(mysql自带的全文索引, 与ES性能差距非常大)
  • 传统关系型数据无法支持搜索排名, 海量数据存储, 分析 等功能;
  • ES可以作为传统关系型数据库的补充, 提供RDBM无法提供的功能;

4. ES对比solr:

  • solr利用Zookeeper进行分布式管理, 而ES自带有分布式协调管理功能;
  • Solr支持更多格式的数据, 而ES仅支持json文件格式;
  • Solr官方提供的功能更多, 而ES本身更注重于核心功能, 高级功能多有第三方插件提供;
  • Solr在传统的搜索应用中表现好于ES, 但在处理实时搜索应用是时, ES的效率更高;

二、Lucene全文检索库

1. 什么是全文检索

1.1 结构化数据与非结构化数据

  • 结构化数据: 指具有固定格式或优先长度的数据, 如: 数据库, 元数据等;
  • 非结构化数据: 指不定长或无固定格式的数据, 如: 邮件, 图片等磁盘上的文件;

1.2 搜索结构化数据和非结构化数据

  • 使用SQL语言专门搜索结构化数据;
  • 使用ES/Lucene/Solr建立倒排索引, 根据关键字就可以搜索一些非结构化数据;

1.3 全文检索:

全文检索是指:

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

2. Lucene简介

https://lucene.apache.org/
ElasticSearcho从入门到放弃:(一)简介, lucene,概念, 安装_第1张图片

  • Lucene是一种高性能的全文检索库, 2000年开源, 最初有Doug Cutting(道格·卡丁)开发;
  • Lucnee是Apache的一个顶级开源醒目, 是一个全文检索引擎工具包; 但Lucene不是一个完整的全文检索引擎, 它只是提供一个基本的全文检索的架构, 还提供了一些基本的分词库;
  • Lucene是一个简单易用的工具包, 可以方便的实现全文检索的功能;

三、ES的核心概念:

1. 索引 index:

  • 一个索引就是一个拥有几分相似特征的文档的集合;
  • 一个索引由一个名字来标识(必须全部是小写字母);
  • 在一个集群中, 可以定义任意多的索引;

2. 映射 mapping

  • ES中的映射(Mapping)用来定义一个文档;
  • mapping是处理数据的方式和规则方面做一些限制; 如: 字段的数据类型, 默认值, 分析器, 是否被索引;
  • 类似mysql在建表时, 指定字段和字段类型;

3. 字段 Field

相当于数据表中的字段, 对文档数据根据不同属性进行的分类标识;

4. 类型type

每一个字段都应该有一个对应的类型, 例如: Text, Keyword, Byte等;

5. 文档 document

  • 一个文档是一个可被索引的基础信息单元; 比如: 可以拥有某一个客户的文档, 某一个产品的一个文档; 当然, 也可以是拥有某个订单的一个文档;
  • 文档以json格式来表示;

6. 集群 cluster

  • 一个集群就是由一个或多个节点组织在一起, 它们共同持有整个的数据, 并一起提供索引和搜索功能;
  • 一个集群由一个唯一的名字标识, 这个名字默认就是 “elasticsearch”;
  • 这个名字是重要的, 因为一个节点只能通过指定的某个集群名字来加入这个集群;

7. 节点 node

  • 一个节点时集群中的一个服务器, 作为集群的一部分, 它存储数据, 参与集群的索引和搜索功能;
  • 一个节点可以通过配置集群名称的方式加入一个指定的集群; 默认情况下, 每个节点都会被安排加入到 "elasticsearch"的集群中;
  • 这意味着, 如果网络中启动了若干个节点, 并假定它们能够相互发现, 它们将会自动的形成并加入到集群中;
  • 在一个集群里, 可以拥有任意多个节点, 而且, 如果有网络中没有运行任何的ES节点, 这时启动一个节点, 会默认创建并加入到 "elasticsearch"的集群中;

8. 分片和副本: shards & replicas

8.1 分片

  • 一个索引可以存储超出单个节点硬件限制的大量数据; 比如, 一个具有10亿文档的索引占据1TB的磁盘空间, 而任一节点都没有这样大的磁盘空间, 或者单个节点处理搜索请求, 响应太慢;
  • 为了解决这个问题, ES提供了将索引划分成多份的能力, 这些份被称为分片;
  • 当创建一个索引的时候, 可以指定想要的分片数量;
  • 每个分片本身也是一个功能完善并且独立的"索引", 这个"索引"可以被防止到集群中的任何节点上;
  • 分片功能主要体现在:
    • 允许水平分割/扩展内容容量;
    • 允许在分片之上进行分布式, 并行的操作, 进而提高性能和吞吐;
  • 至于一个分片怎样分布, 文档怎样聚合, 搜索请求怎么处理, 是完全有ES管理的, 对于用户来说, 是透明的;

8.2 副本

  • 在一个网络/云的环境中, 失败随时都可能发生, 在某个分片/节点突然处于离线状态;

四. 安装ES:

1. 安装es:

操作系统: centos7

1.1 创建普通用户:

ES不能使用root用户, 必须使用普通用户来安装启动;

创建一个es专门的用户

useradd esuser
passwd es123

1.2 为普通用户添加sudo权限

执行visudo打开用户权限管理文件

esuser ALL=(ALL) ALL

1.3 准备安装包

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

在服务器上创建es目录, 并修改owner为esuser用户

mkdir -p /export/server/es
chown -R esuser /export/server/es

# 解压ES
su esuser
cd /export/software
tar -zvxf elasticsearch-xxx.tar.gz -C /export/server/es/

1.4 修改配置文件

1.4.1 修改elasticsearch.yml

使用esuser用户来修改配置文件

cd /export/server/es/elasticsearch-xxx/config
mkdir -p /export/server/es/elasticsearch-xxx/log
mkdir -p /export/server/es/elasticsearch-xxx/data
rm -rf elasticsearch.yml

elasticsearch.yml

clister.name: elasticsearch
node.name: node1
path.data: /export/server/es/elasticsearch-xxx/data
path.log: /export/server/es/elasticsearch-xxx/log
network.host: node1
http.port: 9200
discovery.seed_host: ["node1", "node2", "node3"]
cluster.initial_master_nodes: ["node1", "node2"]
bootstrap.system_call_filter: false
bootstrap.memory_lock: false
http.cors.enabled: true
http.cors.allow-origin: "*"

ps: node(x): 为节点地址(域名或ip)

clister.name: 集群名称
node.name: 当前节点名称
path.data, path.log: 数据和日志目录
network.host: 当前网络地址
http.port:服务端口号
discovery.seed_host: 互相发现的地址列表
cluster.initial_master_nodes:初始化master节点列表
bootstrap.system_call_filter: 系统调用过滤
bootstrap.memory_lock: 内存锁定
http.cors.enabled, http.cors.allow-origin: 跨域相关, 开放

1.4.2 修改jvm.option

修改jvm.option配置文件, 调整jvm堆内存大小

/export/server/es/elasticsearch-xxx/config/ jvm.options

-Xms2g
-Xmx2g

1.5 配置其他节点

1.6 修改系统配置, 解决启动问题

由于现在使用普通用户来安装es服务, 且es服务对服务器要求的资源比较多, 包括内存大小, 线程数等, 所以, 需要给esuser解开资源的束缚;

1.6.1 打开文件的最大数限制;

问题错误信息:
max file descriptors[4096] for elasticsearch process likely too low, increase to at least [65536]
es因为需要大量的创建索引文件, 需要大量的打开系统的文件
sudo vi /etc/security/limits.conf
添加如下内容:
ps: *不要去掉

..... # 原本的内容
* soft nofile 65535
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096

# End of file

修改此文件后, 需要重新登录用户

1.6.2 启动线程数限制

问题错误描述:
max number of threads [1024] for user [esuser] likely too low, increase to at least [4096]
/etc/security/limits.d/20-nproc.conf

* soft nproc 1024
# 修改为:
* soft nproc 4096

1.6.3 调大虚拟内存

问题错误描述
max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least[262144]
手动执行命令:

 sudo sysctl -w vm.max_map_count=262144

修改系统文件(重启后不必在修改)
/etc/sysctl.conf

# 最后一行
vm.max_map_count-262144

1.7 启动es

使用esuser用户来执行

nobup /export/server/es/elasticsearch-xxx/bin/elasticsearch 2> &1 &

使用jps可以看到es服务进程
访问 http://node1:9200/?pretty 可以看到一些信息
ElasticSearcho从入门到放弃:(一)简介, lucene,概念, 安装_第2张图片

2. 使用Docker

镜像地址: https://hub.docker.com/_/elasticsearch

相关文档: https://www.elastic.co/guide/en/elasticsearch/reference/7.5/docker.html

3. Elasticsearch-head插件

  • elasticsearch-head提供一个用于图形化查看的插件工具,

文档网站: http://mobz.github.io/elasticsearch-head/
项目地址: https://github.com/mobz/elasticsearch-head

4. 安装IK分词器

需要使用ES来进行中文分词, 所以要单独给ES安装IK分词器插件:

  • 下载ES Ik分词器:
    • https://github.com/medcl/elasticsearch-analysis-ik
  • 切换用户esuser, 并在es安装目录下的/plugin目录下创建 ik 目录
mkdir -p /export/server/es/elasticsearch-xxx/plugin/ik
  • 将ik分词器解压到该目录下
unzip elasticsearch-analysis-ik-xxx.zip
  • 重启ElasticSearch

使用docker启动, 将ik分词器解压到本地;
macOS会在本地的plugin目录中生成一个文件, 会影响es的启动;
注意版本要一致!!!
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -v /docker/elasticsearch/plugin:/usr/share/elasticsearch/plugins -e "discovery.type=single-node" elasticsearch
使用新版的ES需要密码登录: https://blog.csdn.net/u012999325/article/details/105451855

5. 准备Vscode开发环境

在VScode中安装elasticsearch for vscode插件

插件地址: https://marketplace.visualstudio.com/items?itemName=ria.elastic

ElasticSearcho从入门到放弃:(一)简介, lucene,概念, 安装_第3张图片
使用普通的分词器:

POST _analyze
{
  "analyzer": "standard",
  "text": "我爱你中国"
}

结果:

{
    "tokens": [
        {
            "token": "我",
            "start_offset": 0,
            "end_offset": 1,
            "type": "",
            "position": 0
        },
        {
            "token": "爱",
            "start_offset": 1,
            "end_offset": 2,
            "type": "",
            "position": 1
        },
        {
            "token": "你",
            "start_offset": 2,
            "end_offset": 3,
            "type": "",
            "position": 2
        },
        {
            "token": "中",
            "start_offset": 3,
            "end_offset": 4,
            "type": "",
            "position": 3
        },
        {
            "token": "国",
            "start_offset": 4,
            "end_offset": 5,
            "type": "",
            "position": 4
        }
    ]
}

使用ik分词器

POST _analyze
{
  "analyzer": "ik_max_word", // 尽可能多的分词
  "text": "我爱你中国"
}

结果:

{
    "tokens": [
        {
            "token": "我爱你",
            "start_offset": 0,
            "end_offset": 3,
            "type": "CN_WORD",
            "position": 0
        },
        {
            "token": "爱你",
            "start_offset": 1,
            "end_offset": 3,
            "type": "CN_WORD",
            "position": 1
        },
        {
            "token": "中国",
            "start_offset": 3,
            "end_offset": 5,
            "type": "CN_WORD",
            "position": 2
        }
    ]
}

你可能感兴趣的:(Elastic,搜索引擎,elasticsearch)