Elasticsearch 单机和集群安装与使用

Elasticsearch 7.7.1

1. 简介

Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。底层是开源库 Lucene,是对 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。

2. 主要概念

2.1 Node 与 Cluster

Elastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例。单个 Elastic 实例称为一个节点(node)。一组节点构成一个集群(cluster)。

2.2 Index

ES 会索引所有字段,经过处理后写入一个反向索引(Inverted Index)。查找数据的时候,直接查找该索引。所以,ES 数据管理的顶层单位就叫做 Index(索引)。它是单个数据库的同义词。每个 Index (即数据库)的名字必须是小写。

2.3 Document

Index 里面单条的记录称为 Document(文档),许多条 Document 构成了一个 Index。Document 使用 JSON 格式表示。
同一个 Index 里面的 Document,不要求有相同的结构(scheme),但是最好保持相同,这样有利于提高搜索效率。

2.4 Type

Document 可以分组,比如 weather 这个 Index 里面,可以按城市分组(北京和上海),也可以按气候分组(晴天和雨天)。这种分组就叫做 Type,它是虚拟的逻辑分组,用来过滤 Document。
根据规划,Elastic 6.x 版只允许每个 Index 包含一个 Type,7.x 版将会彻底移除 Type。

2.5 Shard

分片是单个 Lucene 实例。
当有大量的文档时,由于内存的限制、磁盘处理能力不足、无法足够快的响应客户端的请求等,一个节点可能不够。这种情况下,数据可以分为较小的分片。每个分片放到不同的服务器上。
当你查询的索引分布在多个分片上时,ES会把查询发送给每个相关的分片,并将结果组合在一起,而应用程序并不知道分片的存在。即:这个过程对用户来说是透明的。

2.6 Replica

副本是一个分片的精确复制,每个分片可以有零个或多个副本。ES中可以有许多相同的分片,其中之一被选择更改索引操作,这种特殊的分片称为主分片。
当主分片丢失时,如:该分片所在的数据不可用时,集群将副本提升为新的主分片。

2.7 与数据库概念对比

mysql与es概念

  1. 一个数据库(Database),相当于ES中的一个索引(Index)
  2. 一个数据库下有N张表(Table),相当于ES中一个索引下面有N多类型(Type)
  3. 一张表(Table)下有多个行(Row)多个列(Column),相等于ES中一个类型(Type)下有多个文档(Document)和多个Field
  4. 数据库中Schema定义了表,每个表的字段,还有表与字段间的关系。在ES中,Mapping 定义索引(Index)下的类型(Type)的字段(Field)处理规则,即索引如何建立、索引类型、是否保存原始索引JSON文档、是否压缩原始JSON文档、是否需要分词处理、如何进行分词处理等
  5. 在数据库中的增INSERT、删DELETE、改UPDATE、查SELECT操作,相当于ES中的增PUT、删DELETE、改POST、查GET

3. 安装与配置

Elasticsearch 官网下载

ES不能使用root用户启动,所以创建一个新用户essearch,然后将压缩包解压在该用户目录下。
若未特别说明,以下都在 config/elasticsearch.yml 配置文件中修改。

修改集群名和节点名。
修改集群名和节点名
默认情况下,ES 只允许本机访问。这里只用于测试,所有改成0.0.0.0。
修改访问
启动 bin/elasticsearch,后台启动 bin/elasticsearch -d
这里启动后出现三个错误。

[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
切换root用户,修改 /etc/security/limits.conf
修改limits.conf
然后登出essearch再登录。使用ulimit -Hn验证是否是65535

[2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
切换root用户,修改 /etc/sysctl.conf 文件,添加一行

vm.max_map_count=262144

然后执行命令 sysctl -p 生效

[3]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured
修改 config/elasticsearch.yml,添加上节点
添加上节点
然后再启动,访问 ip:9200 验证启动成功
ip:9200验证

4. 安装 Kibana

Kibana 官网下载

修改config/kibana.yml
修改server.host,这里用于测试,改成0.0.0.0。
修改server.host
添加ES地址
添加ES地址
修改时区
修改时区
启动 bin/kibana,访问 ip:5601

在管理->高级设置中,将Browser改为Asia/Shanghai
修改时区

5. 安装中文分词插件ik

GitHub 下载
在ES的plugins文件夹下创建 ik 文件夹,然后解压到 ik 文件夹中。
重启ES,通过日志,可看到加载了 ik
添加ik成功

在 Kibana 中 Dev Tools 中进行测试。

未使用ik

GET _analyze
{
  "text": "我是中国人"
}

未使用ik结果
使用ik_smart
ik_smart 会做最粗粒度的拆分,适合 Phrase 查询。

GET _analyze
{
  "analyzer": "ik_smart",
  "text": "我是中国人"
}

使用ik_smart结果
使用ik_max_word
ik_max_word 会将文本做最细粒度的拆分,会穷尽各种可能的组合,适合 Term Query;

GET _analyze
{
  "analyzer": "ik_max_word",
  "text": "我是中国人"
}

使用ik_max_word结果

6. 测试

在 Kibana 中 Dev Tools 中进行测试。

创建索引和Mapping
这里使用PUT创建索引student;使用POST创建mapping,指定属性name和address使用ik_max_word分词。

PUT student

POST student/_mapping
{
  "properties": {
    "name": {
      "type": "text",
      "analyzer": "ik_max_word",
      "search_analyzer": "ik_max_word"
    },
    "englishName": {
      "type": "text"
    },
    "age": {
      "type": "integer"
    },
    "address": {
      "type": "text",
      "analyzer": "ik_max_word",
      "search_analyzer": "ik_max_word"
    }
  }
}

新增数据
使用PUT新增三条数据。

PUT student/_create/1
{
  "name": "张三",
  "englishName": "amy",
  "age": 17,
  "address": "鼓楼区解放路2号小区二栋"
}

PUT student/_create/2
{
  "name": "李四",
  "englishName": "bob",
  "age": 22,
  "address": "鼓楼区五一路"
}

PUT student/_create/3
{
  "name": "王五",
  "englishName": "ccc",
  "age": 26,
  "address": "静安区五四路"
}

根据id更新数据

POST student/_update/1
{
  "doc": {
    "name": "张三_更新_update"
  }
}

根据id查询单条数据

GET student/_doc/1

根据id查询单条数据结果
查询索引全部数据

GET student/_search

查询索引数据结果
年龄条件查询索引数据

GET student/_search
{
  "query": {
    "range": {
      "age": {
        "gte": 20,
        "lte": 30
      }
    }
  }
}

年龄条件查询索引数据结果
年龄和地址条件查询索引数据

GET student/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "address": "区"
          }
        },
        {
          "range": {
            "age": {
              "gte": 20,
              "lte": 30
            }
          }
        }
      ]
    }
  }
}

年龄和地址条件查询索引数据结果
from size分页

GET student/_search
{
  "from": 0,
  "size": 2,
  "query": {
    "match_all": {}
  }
}

scroll 分页
可设置scroll_id有效时间

GET student/_search?scroll=1m
{
  "size": 2,
  "query": {
    "match_all": {}
  }
}

之后使用scroll_id获取内容

GET _search/scroll
{
  "scroll": "1m",
  "scroll_id": "..."
}

search_after 分页
根据上一页的最后一条数据来确定下一页的位置。from必须设为0。

GET student/_search
{
  "from": 0,
  "size": 2,
  "sort": [
    {
      "_id": {
        "order": "asc"
      }
    }
  ]
}

search_after

GET student/_search
{
  "from": 0,
  "size": 2,
  "search_after": [
    3
  ],
  "sort": [
    {
      "_id": {
        "order": "asc"
      }
    }
  ]
}

search_after

删除单个索引数据

DELETE student/_doc/1

删除索引

DELETE student

7. 集群

Elasticsearch
伪集群,创建elasticsearch-cluster文件夹,在一台虚拟机上启动2个es实例,组成集群。

复制安装包为elasticsearch-1,修改 config/elasticsearch.yml

cluster.name: es_cluster
node.name: node-1
network.host: 0.0.0.0
http.port: 9201
#节点间交互的tcp端口
transport.tcp.port: 9301
discovery.seed_hosts: ["192.168.110.40:9301", "192.168.110.40:9302"]
#引导集群,值为node.name
cluster.initial_master_nodes: ["node-1", "node-2"]

再复制修改elasticsearch-2,修改node.name为node-2,http.port为9202,transport.tcp.port为9302。

新增启动脚本

vi start-all.sh
cd elasticsearch-1
./bin/elasticsearch -d
cd ..
cd elasticsearch-2
./bin/elasticsearch -d
chmod u+x start-all.sh

启动测试
9201
9202
检查节点健康状态
检查节点健康状态

Kibana
修改config/kibana.yml

elasticsearch.hosts: ["http://192.168.110.40:9201", "http://192.168.110.40:9202"]

参考:
ES官方文档
全文搜索引擎 Elasticsearch 入门教程
Elasticsearch简介与实战
搜索引擎选择: Elasticsearch与Solr
Elasticsearch的由来、原理及应用场景分析
Elasticsearch-基础介绍及索引原理分析
Elasticsearch集群+kibana
ES最新版7.9.0集群环境搭建(单机伪集群)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值