Elasticsearch学习笔记(1)

news2024/11/17 20:36:40

初识 Elasticsearch

认识和安装

Elasticsearch 是由 Elastic 公司开发的一套强大的搜索引擎技术,属于 Elastic 技术栈的一部分。完整的技术栈包括:

  • Elasticsearch:用于数据存储、计算和搜索。
  • Logstash/Beats:用于数据收集。
  • Kibana:用于数据可视化。

这套技术栈通常被称为 elastic stack (ELK),广泛应用于日志收集、系统监控和状态分析等场景。

而elasticsearch是elastic stack的核心,负责存储、搜索、分析数据。

核心组件

Elasticsearch 是整个技术栈的核心,提供了强大的数据存储、搜索和分析功能。

Kibana 是一个用于操作 Elasticsearch 的可视化控制台,它通过 RESTful API 与 Elasticsearch 进行交互,让用户能够更直观地管理和分析数据。Kibana 的主要功能包括:

  • 数据搜索与展示:支持对 Elasticsearch 数据的灵活搜索和展示。
  • 统计与聚合:能够对数据进行统计分析,并生成图表和报表。
  • 集群状态监控:提供对 Elasticsearch 集群健康状态的监控。
  • 开发控制台(DevTools):提供语法提示,帮助用户更方便地使用 Elasticsearch 的 RESTful API。

安装elasticsearch

通过下面的Docker命令(Windows 命令提示符)即可安装单机版本的elasticsearch:

docker run -d ^
  --name es ^
  -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" ^
  -e "discovery.type=single-node" ^
  -v es-data:/usr/share/elasticsearch/data ^
  -v es-plugins:/usr/share/elasticsearch/plugins ^
  --privileged ^
  --network hm-net ^
  -p 9200:9200 ^
  -p 9300:9300 ^
  elasticsearch:7.12.1

安装完成后,访问9200端口,即可看到响应的Elasticsearch服务的基本信息:

安装Kibana

通过下面的Docker命令(Windows 命令提示符),即可部署Kibana:

docker run -d ^
  --name kibana ^
  -e ELASTICSEARCH_HOSTS=http://es:9200 ^
  --network=hm-net ^
  -p 5601:5601 ^
  kibana:7.12.1

安装完成后,直接访问5601端口,即可看到控制台页面:

选择Explore on my own之后,进入主页面:

然后选中Dev tools,进入开发工具页面:

倒排索引

Elasticsearch 之所以能够提供高性能的搜索功能,主要归功于其底层的倒排索引技术。倒排索引是一种特殊的数据结构,它能够极大地提高文本搜索的效率。

正向索引

在传统的数据库系统中,如 MySQL,通常使用的是正向索引。正向索引是基于记录的 ID 或其他字段创建的索引。例如,给定一个商品表 tb_goods,如果为 id 字段创建索引,那么根据 id 查询时,可以直接通过索引快速定位到记录。

然而,如果需要根据 title 字段进行模糊查询,传统的正向索引就无法高效地处理。在这种情况下,数据库系统通常需要进行全表扫描,逐行检查 title 字段是否包含用户搜索的关键词。这种逐行扫描的方式在大数据量的情况下效率非常低下。

倒排索引

倒排索引是对正向索引的一种特殊处理,它将文档中的每个词条与包含该词条的文档进行关联。倒排索引中有两个核心概念:

  • 文档(Document):用于搜索的数据单元,例如一个网页、一个商品信息等。
  • 词条(Term):对文档数据或用户搜索数据进行分词后得到的具有含义的词语。例如,“我是中国人” 可以被分词为 “我”、“是”、“中国人”、“中国”、“国人” 等词条。

创建倒排索引的流程如下:

  1. 分词:将每个文档的数据进行分词,得到一个个词条。
  2. 创建索引表:创建一个表,每行数据包括词条、词条所在的文档 ID、词条在文档中的位置等信息。
  3. 索引优化:由于词条具有唯一性,可以为词条创建索引,例如使用哈希表结构索引。

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

  1. 分词:用户输入 “华为手机”,对其进行分词,得到词条 “华为” 和 “手机”。
  2. 查找词条:拿着词条在倒排索引中查找,得到包含这些词条的文档 ID。
  3. 获取文档:根据文档 ID 在正向索引中查找具体的文档。

通过倒排索引,搜索过程可以避免全表扫描,因为词条和文档 ID 都建立了索引,查询速度非常快。

正向索引与倒排索引的对比

正向索引:

优点:

  • 可以为多个字段创建索引。
  • 根据索引字段进行搜索和排序时速度非常快。

缺点:

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

倒排索引:

优点:

  • 根据词条进行搜索和模糊搜索时速度非常快。

缺点:

  • 只能为词条创建索引,而不是字段。
  • 无法根据字段进行排序。

总结来说,正向索引适用于精确查询和排序,而倒排索引则适用于全文搜索和模糊查询。Elasticsearch 通过结合这两种索引技术,提供了高效的全文搜索能力。

基础概念

Elasticsearch 中有许多独特的概念,与传统的关系型数据库(如 MySQL)有所不同,但也有相似之处。理解这些概念对于掌握 Elasticsearch 的使用至关重要。

文档和字段

Elasticsearch 是面向文档(Document)存储的,文档可以是数据库中的一条商品数据、一个订单信息等。文档数据会被序列化为 JSON 格式后存储在 Elasticsearch 中。

每个 JSON 文档中包含多个字段(Field),类似于数据库中的列。字段是文档的基本组成部分,每个字段都有其数据类型和值。

索引和映射

索引(Index)是相同类型的文档的集合。例如:

  • 所有用户文档可以组织在一起,称为用户的索引。
  • 所有商品的文档可以组织在一起,称为商品的索引。
  • 所有订单的文档可以组织在一起,称为订单的索引。

索引类似于数据库中的表。数据库的表会有约束信息,用来定义表的结构、字段的名称、类型等信息。因此,索引库中就有映射(Mapping),是索引中文档的字段约束信息,类似表的结构约束。

MySQL 与 Elasticsearch 的对比

以下是 MySQL 与 Elasticsearch 中一些关键概念的对比:

MySQLElasticsearch说明
TableIndex索引(Index)是文档的集合,类似数据库的表(Table)
RowDocument文档(Document)是一条条的数据,类似数据库中的行(Row),文档都是 JSON 格式
ColumnField字段(Field)是 JSON 文档中的字段,类似数据库中的列(Column)
SchemaMappingMapping(映射)是索引中文档的约束,例如字段类型约束。类似数据库的表结构(Schema)
SQLDSLDSL 是 Elasticsearch 提供的 JSON 风格的请求语句,用来操作 Elasticsearch,实现 CRUD
是否可以完全替代 MySQL?

虽然 Elasticsearch 在搜索和分析方面表现出色,但它并不能完全替代 MySQL。两者各有擅长之处:

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

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

在企业中,通常会结合使用两者:

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

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

  • 两者再基于某种方式,实现数据的同步,保证一致性。

IK 分词器

Elasticsearch 的关键在于倒排索引,而倒排索引依赖于对文档内容的分词。分词是将文本数据分解为有意义的词条(Term)的过程。对于中文文本,由于中文没有像英文那样的自然分隔符(如空格),因此需要专门的中文分词算法。IK 分词器(IK Analyzer)就是这样一个高效、精准的中文分词工具。

安装 IK 分词器插件

IK 分词器是一个开源的中文分词插件,适用于 Elasticsearch。安装 IK 分词器可以显著提高中文文本的分词效果。以下是在 Windows 系统上安装 IK 分词器(IK Analyzer)的步骤:

方案一:在线安装

进入 Elasticsearch 容器

运行以下命令进入正在运行的 Elasticsearch 容器:

docker exec -it es /bin/bash

安装 IK 分词器插件:

在容器内部运行以下命令来安装 IK 分词器插件:

bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip

请注意,你需要将 7.12.1 替换为你正在使用的 Elasticsearch 版本号。

退出容器

安装完成后,退出容器:

exit

重启 Elasticsearch 容器

安装完成后,你需要重启 Elasticsearch 容器以使插件生效:

docker restart es
方案二:离线安装

下载 IK 分词器插件:

从 GitHub 页面下载 IK 分词器插件的压缩文件。

将插件文件上传到容器:

将下载的压缩文件上传到 Elasticsearch 容器的 /usr/share/elasticsearch/plugins 目录下。你可以使用 docker cp 命令来完成这个操作:

docker cp /path/to/elasticsearch-analysis-ik-7.12.1.zip es:/usr/share/elasticsearch/plugins/

进入 Elasticsearch 容器

运行以下命令进入正在运行的 Elasticsearch 容器:

docker exec -it es /bin/bash

解压插件文件

在容器内部解压插件文件:

cd /usr/share/elasticsearch/plugins
unzip elasticsearch-analysis-ik-7.12.1.zip
rm elasticsearch-analysis-ik-7.12.1.zip

退出容器

解压完成后,退出容器:

exit

重启 Elasticsearch 容器

安装完成后,你需要重启 Elasticsearch 容器以使插件生效:

docker restart es
IK分词器包含三种模式
  • standard:标准分词器
  • ik_smart:智能语义切分
  • ik_max_word:最细粒度切分

首先,测试 Elasticsearch 官方提供的标准分词器:

POST /_analyze
{
  "analyzer": "standard",
  "text": "我是中国人"
}

执行结果如下:

{
  "tokens" : [
    {
      "token" : "我",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "<IDEOGRAPHIC>",
      "position" : 0
    },
    {
      "token" : "是",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "<IDEOGRAPHIC>",
      "position" : 1
    },
    {
      "token" : "中",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "<IDEOGRAPHIC>",
      "position" : 2
    },
    {
      "token" : "国",
      "start_offset" : 3,
      "end_offset" : 4,
      "type" : "<IDEOGRAPHIC>",
      "position" : 3
    },
    {
      "token" : "人",
      "start_offset" : 4,
      "end_offset" : 5,
      "type" : "<IDEOGRAPHIC>",
      "position" : 4
    }
  ]
}

可以看到,标准分词器只能 1 字 1 词条,无法正确对中文做分词。

接下来,测试 IK 分词器的 ik_smart 模式:

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

执行结果如下:

{
  "tokens" : [
    {
      "token" : "我",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "CN_CHAR",
      "position" : 0
    },
    {
      "token" : "是",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "CN_CHAR",
      "position" : 1
    },
    {
      "token" : "中国人",
      "start_offset" : 2,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 2
    }
  ]
}

最后,测试 IK 分词器的 ik_max_word 模式:

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

执行结果如下:

{
  "tokens" : [
    {
      "token" : "我",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "CN_CHAR",
      "position" : 0
    },
    {
      "token" : "是",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "CN_CHAR",
      "position" : 1
    },
    {
      "token" : "中国人",
      "start_offset" : 2,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "中国",
      "start_offset" : 2,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 3
    },
    {
      "token" : "国人",
      "start_offset" : 3,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 4
    }
  ]
}

IK 分词器的 ik_smart 模式适用于大多数场景,能够根据上下文进行智能分词;而 ik_max_word 模式则尽可能多地切分出词条,适用于需要更细粒度分词的场景。

拓展词典

进入容器后

cd /usr/share/elasticsearch/config/analysis-ik
ls

查看文件内容:

cat extra_main.dic

总结

分词器的作用是什么?

分词器在搜索引擎中有两个主要作用:

  • 创建倒排索引时,对文档分词:在索引阶段,分词器将文档内容分解成一个个的词条(tokens),并将这些词条与文档关联起来,形成倒排索引。倒排索引是搜索引擎的核心数据结构,用于快速查找包含特定词条的文档。
  • 用户搜索时,对输入的内容分词:在搜索阶段,分词器将用户输入的查询内容分解成一个个的词条,然后搜索引擎根据这些词条在倒排索引中查找匹配的文档。

IK 分词器有几种模式?

IK 分词器提供了两种分词模式:

  • ik_smart:智能切分,粗粒度:ik_smart 模式会进行智能切分,通常会生成较少的词条,适用于需要较粗粒度分词的场景。
  • ik_max_word:最细切分,细粒度:ik_max_word 模式会进行最细粒度的切分,尽可能生成更多的词条,适用于需要细粒度分词的场景。

IK 分词器如何拓展词条?如何停用词条?

IK 分词器可以通过配置文件 IKAnalyzer.cfg.xml 来拓展词条和停用词条。

拓展词条:

  • 在 IKAnalyzer.cfg.xml 文件中,通过 <entry key="ext_dict"> 标签指定拓展词典文件的路径。
  • 在拓展词典文件中添加你想要拓展的词条。

停用词条:

  • 在 IKAnalyzer.cfg.xml 文件中,通过 <entry key="ext_stopwords"> 标签指定停用词典文件的路径。
  • 在停用词典文件中添加你想要停用的词条。

示例配置

IKAnalyzer.cfg.xml 示例

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <comment>IK Analyzer 扩展配置</comment>
    <!-- 用户可以在这里配置自己的扩展字典 -->
    <entry key="ext_dict">mydict.dic</entry>
    <!-- 用户可以在这里配置自己的扩展停止词字典 -->
    <entry key="ext_stopwords">stopword.dic</entry>
</properties>

自定义词典文件 mydict.dic 示例

自定义词汇1
自定义词汇2

停用词典文件 stopword.dic 示例

的
是
在

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2175025.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码为笔,合作作墨,共绘共赢画卷———未来之窗行业应用跨平台架构

合作共赢&#xff0c;代码同创&#xff0c;成就非凡 一、资源整合方面 1.1. 技术资源共享 - 不同的合作伙伴可能在技术领域各有所长。例如&#xff0c;一方可能擅长前端用户界面设计&#xff0c;具有丰富的交互设计经验&#xff0c;能够打造出美观、易用的预订界面&#xff…

云舟观测:集成开源Grafana Faro构建前端页面性能监控平台

在当今互联网时代&#xff0c;面对纷乱繁杂的网上资源&#xff0c;用户的耐心和注意力是极为宝贵的资源&#xff0c;当用户访问一个网站或应用时&#xff0c;他们期望的是快速且无缝的体验&#xff0c;任何加载延迟或功能故障都可能导致用户流失&#xff0c;影响品牌体验。因此…

MySQL 中的 FOREIGN KEY 约束:确保数据完整性的关键

在 MySQL 数据库中&#xff0c;FOREIGN KEY&#xff08;外键&#xff09;约束是一种非常重要的机制&#xff0c;它可以帮助我们确保数据的完整性和一致性。那么&#xff0c;FOREIGN KEY 约束究竟是什么呢&#xff1f;让我们一起来深入了解一下。 一、什么是 FOREIGN KEY 约束&…

计算机毕业设计 招生宣传管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

支付宝远程收款api之小荷包跳转码

想要生成小荷包跳转码的二维码&#xff0c;需要进行以下步骤&#xff1a; 1、开通支付宝小荷包的收款功能权限 2、获取支付宝的小荷包收款码和支付宝账户的UID已经手机号等相应信息&#xff08;可能会有变动&#xff09; 3、可能需要一定的代码基础&#xff0c;讲所需信息填…

基于python+控制台+txt文档实现学生成绩管理系统(含课程实训报告)

目录 第一章 需求分析 第二章 系统设计 2.1 系统功能结构 2.1.1 学生信息管理系统的七大模块 2.1.2 系统业务流程 2.2 系统开发必备环境 第三章 主函数设计 3.1 主函数界面运行效果图 3.2 主函数的业务流程 3.3 函数设计 第四章 详细设计及实现 4.1 学生信息录入模块的设计与实…

2024.9.28 作业+思维导图

widget.cpp #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {this->setFixedSize(320,448);this->setWindowFlag(Qt::FramelessWindowHint);//QPushButtonQPushButton *PushButton1 new QPushButton("登录",this);PushButto…

先进封装技术 Part02---TSV科普

一、引言 随着电子设备向更小型化、更高性能的方向发展,传统的芯片互连技术已经无法满足日益增长的需求。在这样的背景下,TSV(Through-Silicon Via,硅通孔)技术应运而生,成为先进封装技术中的核心之一。 如果我们看大多数主板,可以看到两件事:第一,芯片之间的大多数连…

《深度学习》自然语言处理 统计、神经语言模型 结构、推导解析

目录 一、语言转换方法 1、如何将语言转换为模型可以直接识别的内容 1&#xff09;数据预处理 2&#xff09;特征提取 3&#xff09;模型输入 4&#xff09;模型推理 二、语言模型 1、统计语言模型 1&#xff09; 案例&#xff1a; • 运行结果&#xff1a; • 稀疏…

AI Agent如何落地?来看看在教育行业大厂的落地实践

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 以正教育AI Agent 以正教育大模型AI Agen…

【4.7】图搜索算法-DFS和BFS解根到叶子节点数字之和

一、题目 给定一个二叉树&#xff0c;它的每个结点都存放一个 0-9 的数字&#xff0c; 每条从根到叶子节点的路径都代表一个数字 。 例如&#xff0c;从根到叶子节点路径 1->2->3 代表数字 123。计算从根到叶子节点生成的所有数字之和。 说明 : 叶子节点是指没有子节点…

CF补题第二天

题1 先来一道最短路热身 题目描述&#xff1a; 思路&#xff1a;第一眼SPFA&#xff0c;结果直接超时&#xff0c;正解思路&#xff1a;每一条边只走一次&#xff0c;那么我们找出不同的连通块&#xff0c;然后拓扑排序求最短路&#xff08;因为无环&#xff09;&#xff0c;…

有问题未解决(9.28)

#include <stdio.h> int main() {int a 1;int b 2;int c 3;int arr[] { a,b,c };arr[0] 10;printf("%d\n", a);//打印结果为1&#xff1b;return 0; } 颠覆认知了&#xff0c;或许也没有颠覆 arr是一个int类型的数组&#xff0c;他存的就是一个数&…

Android——ContentObserver监听短信

概述 内容观察器ContentObserver给目标内容注册一个观察器&#xff0c;目标内容的数据一旦发生变化&#xff0c;观察器规定好的动作马上触发&#xff0c;从而执行开发者预先定义的代码。 思路 注册一个监听 getContentResolver().registerContentObserver(uri, true, mObser…

QT+ESP8266+STM32项目构建三部曲三--QT从环境配置到源程序的解析

一、阿里云环境配置 大家在编写QT连接阿里云的程序之前&#xff0c;先按照下面这篇文章让消息可以在阿里云上顺利流转 QTESP8266STM32项目构建三部曲二--阿里云云端处理之云产品流转-CSDN博客文章浏览阅读485次&#xff0c;点赞7次&#xff0c;收藏4次。创建两个设备&#xff…

找不到msvcp110.dll怎么办,总结6种解决msvcp110.dll的方法

在电脑使用过程中&#xff0c;我们可能会遇到各种各样的问题&#xff0c;其中之一就是系统提示某个文件丢失。msvcp110.dll丢失是一个比较常见的问题&#xff0c;它可能导致某些程序无法正常运行。那么&#xff0c;如何解决这个问题呢&#xff1f;本文将详细介绍6种修复msvcp11…

手把手教你用PyTorch从零训练自己的大模型(非常详细)零基础入门到精通,收藏这一篇就够了

长按关注《AI科技论谈》 LLM是如今大多数AI聊天机器人的核心基础&#xff0c;例如ChatGPT、Gemini、MetaAI、Mistral AI等。这些LLM背后的核心是Transformer架构。 本文介绍如何一步步使用PyTorch从零开始构建和训练一个大型语言模型&#xff08;LLM&#xff09;。该模型以Tra…

OpenHarmony标准系统上实现对rk系列芯片NPU的支持(npu使用)

在上篇文章中&#xff0c;我们学习了移植rk的npu驱动到OpenHarmony提供的内核。本文我们来学习如何在OpenHarmony标准系统rk系列芯片如何使用npu OpenHarmony RK系列芯片运行npu测试用例 在移植npu驱动到OpenHarmony之后&#xff0c;来运行npu样例进行简单测试 1.O 测试准备…

【球形空间产生器】

题目 代码 #pragma GCC optimize(3) #include <bits/stdc.h> using namespace std; const double eps 1e-6; const int N 12; double g[N][N]; double ss[N]; int n; void gauss() {int c, r, t;for(c 1, r 1; c < n; c){int t r;for(int i r1; i < n; i)i…

Wayfair封号的常见原因及解决方案解析

近期关于Wayfair账号封禁的问题引发了广泛讨论。许多用户报告称&#xff0c;他们的Wayfair账户被突然封禁&#xff0c;这一现象不仅影响了用户的购物体验&#xff0c;也对Wayfair的品牌形象造成了一定的冲击。本文将深入探讨Wayfair封号的原因&#xff0c;并提出相应的解决方案…