【搜索分析引擎】Elasticsearch

发布于:2024-08-20 ⋅ 阅读:(32) ⋅ 点赞:(0)

Elasticsearch(简称ES)是一个分布式、可扩展、实时的搜索与数据分析引擎,它基于Apache Lucene构建,提供了全文搜索、结构化搜索、数据分析、复杂的语言处理、地理位置和对象间关联关系等多种功能。

一、Elasticsearch的核心特性

  1. 分布式架构

    • Elasticsearch可以在多个服务器上运行,支持水平扩展,能够处理大规模数据。
    • 它能够自动在服务器之间进行负载均衡,确保数据的高可用性和系统的稳定性。
  2. 高性能

    • 利用Lucene的倒排索引技术,在大规模数据下提供快速的搜索和分析能力。
    • 实时索引和搜索功能,确保数据写入后立即可进行搜索。
  3. 多语言支持

    • 支持多种编程语言的客户端,包括Java、Python、PHP、JavaScript等,便于开发者与Elasticsearch进行交互。
  4. RESTful API

    • 提供了RESTful API,使得用户可以使用HTTP请求进行索引、搜索、分析等操作,便于集成和调用。
  5. 丰富的查询方式

    • 支持全文搜索、精确匹配、范围查询、模糊查询、聚合等多种查询方式,满足不同场景下的需求。
  6. 可扩展性

    • 随着业务需求的变化,Elasticsearch可以灵活增加资源,实现无缝扩展。
  7. 高可用性

    • 在硬件故障或节点故障的情况下,具有容错能力,能够保持数据的完整性和服务的可用性。

二、Elasticsearch的应用场景

  1. 全文搜索

    • 网站、电商平台、在线文档库等场景,通过Elasticsearch实现复杂的搜索需求,如支持同义词查询、拼写纠正、权重调整等。
  2. 日志分析

    • 结合Logstash和Kibana(ELK Stack),构建强大的日志分析平台,实现实时日志监控、运维管理、安全审计、业务监控等功能。
  3. 数据分析

    • 作为分布式的数据分析引擎,Elasticsearch能够处理大规模数据的聚合操作,支持实时分析,在商业智能(BI)、市场趋势分析、用户行为分析等领域有着广泛的应用。
  4. 地理位置搜索

    • 支持基于地理位置的数据索引和查询,包括地理坐标数据的存储、地理形状的搜索等,在地图服务、位置搜索、物流跟踪、地理信息系统(GIS)等应用场景中非常有用。
  5. 个性化推荐

    • 通过分析用户的行为数据、搜索历史等信息,构建个性化推荐系统,在电商、新闻媒体、社交网络等领域实现内容或产品的实时推荐。
  6. 元数据管理

    • 用于管理大量的元数据和内容,如数字资产管理(DAM)、内容管理系统(CMS),高效索引和查询能力使用户能够快速检索到所需资源。

三、Elasticsearch的优缺点

优点

  • 高性能:基于Lucene的倒排索引技术,提供快速搜索和分析能力。
  • 分布式架构:支持水平扩展,能够处理大规模数据。
  • 实时性:支持实时索引和搜索,满足快速响应需求。
  • 丰富的查询方式:支持多种查询方式,满足不同场景需求。
  • 高可用性:具有容错能力,确保数据和服务的高可用性。

缺点

  • 复杂度较高:对于初学者来说,Elasticsearch的配置和使用可能具有一定的复杂度。
  • 资源消耗:在处理大规模数据时,Elasticsearch需要消耗较多的计算资源和存储资源。

四、搜索引擎的基本原理

搜索引擎组成

通常搜索引擎包括了数据采集模块、文本分析模块、索引存储模块、搜索模块等。

  • 数据采集模块:负责采集需要搜索的数据源;
  • 文本分析模块:把结构化数据中的长文本切分成有实际意义的词;
  • 索引存储模块:将数据采集模块写入的数据按定义好的结构写入索引,保存每个词在索引中的文档编号以及它们出现在文档中的位置;
  • 搜索模块的功能是根据用户输入的查询文本找到索引中匹配的文档,相关度越高的文档排名越靠前;
    在这里插入图片描述

倒排索引

  • 倒排索引就是对每个词汇记录出现过在这些词的文档,并且一般还会记录词汇的出现位置、出现频率等。这样在进行全文搜索时,不用遍历每个文档是否出现过目标词汇,可以直接拿到包含目标词汇的文档;
  • 文档在被写入ES时,ES就会对文本进行分词并建立倒排索引,从而查询时可以很方便地根据目标关键词找到相应的文档;
  • 倒排索引的缺点是需要一定的存储空间,并且写入数据时需要重新构建;
    在这里插入图片描述

五、Elasticsearch和Kibana的安装

拉取镜像

docker pull elasticsearch:7.4.2  //存储和检索数据
docker pull kibana:7.4.2		 //可视化检索数据

创建挂载目录

mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticsearch/data
// 任何远程机器都能访问es
echo "http.host: 0.0.0.0" >> /mydata/elasticsearch/config/elasticsearch.yml
chmod -R 777 /mydata/elasticsearch/ 改变文件权限

创建elasticsearch容器实例

docker run -d -p 9200:9200 -p 9300:9300 \
--restart=always \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
--name elasticsearch elasticsearch:7.4.2

命令解释:
-e “discovery.type=single-node”:使es单节点运行
-e ES_JAVA_OPTS=“-Xms64m -Xmx512m”:设置es占用的内存

开放对应的端口

firewall-cmd --zone=public --add-port=9200/tcp --permanent
firewall-cmd --zone=public --add-port=9300/tcp --permanent
systemctl restart firewalld.service
firewall-cmd --zone=public --query-port=9200/tcp

访问9200端口测试
在这里插入图片描述
创建kibana容器实例

docker run -d -p 5601:5601 \
--restart=always \
-e ELASTICSEARCH_HOSTS=http://192.168.26.160:9200 \
--name kibana \
kibana:7.4.2

开放对应端口

firewall-cmd --zone=public --add-port=5601/tcp --permanent
systemctl restart firewalld.service

访问对应的5601端口
在这里插入图片描述

六、概念

文档

elasticsearch是面向文档存储的,可以是数据库中的一条商品数据,一个订单信息。

文档数据会被序列化为json格式后存储在elasticsearch中。

索引

索引(index):相同类型的文档的集合

映射(mapping):索引中文档的字段约束信息,类似表的结构约束

概念对比

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风格的请求语句,用来操作elasticserch,实现CRUD

应用

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

Elaticsearch:擅长海量数据的搜索,分析,计算
在这里插入图片描述

总结
文档:一条数据就是一个文档,es中是Json格式

字段:Json文档中的字段

索引:同类型文档的集合

映射:索引中文档的约束,比如字段名称,类型

elasticaserch与数据库的关系:

  • 数据库负责事物类型操作
  • elasticsearch负责海量数据的搜索,分析,计算

七、入门操作

_cat

GET /_cat/nodes:查看所有节点

GET /_cat/health:查看 es 健康状况

GET /_cat/master:查看主节点

GET /_cat/indices:查看所有索引

​ 相当于Mysql数据库的show databases
在这里插入图片描述

PUT&POST新增数据

PUT 和 POST 都可以, POST 新增。如果不指定 id,会自动生成 id。指定 id 就会修改这个数据,并新增版本号 。

PUT 可以新增可以修改。PUT 必须指定 id;由于 PUT 需要指定 id,我们一般都用来做修改操作,不指定 id 会报错。

保存一个数据,保存在哪个索引的哪个类型下,指定用哪个唯一标识 PUT customer/external/1;

在 customer 索引下的 external 类型下保存 1 号数据为

POST /customer/external/1

保存的数据

{ 
    "name": "zhangsan"
}

在这里插入图片描述
如果当前索引不存在就会自动创建:
在这里插入图片描述

PUT&POST修改数据

POST /customer/external/1/_update

{
    "doc": {
        "name": "lisi"
    }
}

此种方式会查询数据,如果相同不允许修改
在这里插入图片描述

POST /customer/external/1/

{
    "name": "zhangsan"
}

在这里插入图片描述

PUT /customer/external/1/

{
    "name": "zhangsan"
}

在这里插入图片描述

GET查询数据

GET /索引/类型/数据id

在这里插入图片描述
结果:

{
    "_index": "customer",//在哪个索引 
    "_type": "external",//在哪个类型
    "_id": "1", //记录 id
    "_version": 6,//版本号
    "_seq_no": 5,//并发控制字段,每次更新就会+1,用来做乐观锁
    "_primary_term": 1,//同上,主分片重新分配,如重启,就会变化
    "found": true,  //查询是否成功
    "_source": {    //真正的内容
        "name": "zhangsan"
    }
}

DELETE删除数据

DELETE /customer/external/1

在这里插入图片描述

bulk批量操作

POST /customer/external/_bulk

{"index":{"_id":"1"}}
{"name":"John Doe"}
{"index":{"_id":"2"}}
{"name":"Jane Doe"}

语法格式:

{ action: { metadata }}\n
{ request body }\n
{ action: { metadata }}\n
{ request body }\n

切换到kibana的Dev Tools指定命令
在这里插入图片描述

乐观锁字段

对应GET的查询结果,其中有一个字段_sep_no,其为了是进行并发控制,当修改数据后,对应的_sep_no版本就会更改。

实现方式:

更新携带 ?if_seq_no=*&if_primary_term=1

在这里插入图片描述
​ 再次指定_sep_no为相同值将不会生效

在这里插入图片描述

参考

高性能分布式搜索引擎Elasticsearch
Elasticsearch搜索引擎
搜索引擎——Elasticsearch


网站公告

今日签到

点亮在社区的每一天
去签到