深入探索Elasticsearch:从零基础到实战精通的全方位指南

news2024/11/24 3:35:09

ElasticSearch

  • 一、初识ElasticSearch
    • 1、ES的介绍
    • 2、索引
    • 3、正排索引
    • 3、倒排索引
  • 一、安装
    • 1、下载
    • 2、检查是否启动
  • 二、语法
    • 1、添加一个文档编辑
    • 2、批量插入
    • 3、搜索
    • 4、查询某个特定的字段
    • 5、根据id查询
    • 6、修改
    • 7、删除
    • 8、mapping
  • 三、分词器

一、初识ElasticSearch

1、ES的介绍

  • ES是一个使用Java语言并且基于Lucene( https://lucene.apache.org/ )编写的搜索引擎框架,他提供了分布式的全文搜索功能,提供了一个统一的基于RESTful风格的WEB接口,官方客户端也对多种语言都提供了相应的API。

  • Lucene:Lucene本身就是一个搜索引擎的底层。

  • 分布式:ES主要是为了突出他的横向扩展能力。

  • 全文检索:将一段词语进行分词,并且将分出的单个词语统一的放到一个分词库中,在搜索时,根据关键字去分词库中检索,找到匹配的内容。(倒排索引)

  • RESTful风格的WEB接口:操作ES很简单,只需要发送一个HTTP请求,并且根据请求方式的不同,携带参数的同,执行相应的功能。

  • 应用广泛:Github.com,WIKI,Gold Man用ES每天维护将近10TB的数据。

在这里插入图片描述

2、索引

索引是一种特殊的文件,它们包含着对数据表里所有记录的引用指针。数据库索引是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。

索引用于加快数据的检索,类似于书籍的索引。在数据库中索引可以减少数据库程序查询结果时需要读取的数据量,类似于在书籍中我们利用索引可以不用翻阅整本书即可找到想要的内容。
在这里插入图片描述

3、正排索引

​ 正排表是以文档的ID为关键字,表中记录文档中每个字的位置信息,查找时扫描表中每个文档中字的信息直到找出所有包含查询关键字的文档。
在这里插入图片描述
尽管正排表的工作原理非常的简单,但是由于其检索效率太低,除非在特定情况下,否则实用性价值不大。

3、倒排索引

​ 倒排表以关键字进行索引,关键字所对应的表项中记录了出现这个字的所有文档以及ID,字符出现文档的位置。
在这里插入图片描述

一、安装

在学习过程中,选择安装的版本为7.17版本,在ElasticSearch的8版本中有许多安全校验和与springboot版本不适配等情况,所以为了减少学习成本可以选择安装7版本。

1、下载

ElasticSearch安装包:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.22-windows-x86_64.zip
在这里插入图片描述
在这里插入图片描述
kibana安装包:https://artifacts.elastic.co/downloads/kibana/kibana-7.17.22-windows-x86_64.zip

在这里插入图片描述

2、检查是否启动

ES 的启动端口:

  • 9200: 给外部用户 (给客户端调用)的端口

  • 9300: 给ES 群内部通信的 端口(外部调用不了的)

  • 方法一:在浏览器直接输入http://localhost:9200/
    在这里插入图片描述

  • 方法二:使用curl发送http请求
    在这里插入图片描述
    kibana:直接在浏览器访问 http://localhost:5601,kibana可以自由地对ES进行操作(本质也是restful api)。
    在这里插入图片描述

二、语法

1、添加一个文档编辑

提交以下索引请求,向 log-my _ app-default 数据流添加一个日志条目。因为 log-my _ app-default 不存在,所以请求会使用内置的 log-- 索引模板自动创建它。

POST logs-my_app-default/_doc
{
  "title":"我是张三",
  "@timestamp": "2099-05-06T16:21:15.000Z",
  "event": {
    "original": "192.0.2.42 - - [06/May/2099:16:21:15 +0000] \"GET /images/bg.jpg HTTP/1.0\" 200 24736"
  }
}

在这里插入图片描述
响应包含Elasticsearch为文档生成的元数据:

包含该文档的基础 _index。Elasticsearch自动生成基础索引的名称。
文档在索引中的唯一 _id。

2、批量插入

使用_bulk端点一次性添加多个文档。批量数据必须是换行分隔的JSON(NDJSON)。每行必须以换行符(\n)结束,包括最后一行。

PUT logs-my_app-default/_bulk
{ "create": { } }
{  "title":"我是李四","@timestamp": "2099-05-07T16:24:32.000Z", "event": { "original": "192.0.2.242 - - [07/May/2020:16:24:32 -0500] \"GET /images/hm_nbg.jpg HTTP/1.0\" 304 0" } }
{ "create": { } }
{  "title":"我是王五","@timestamp": "2099-05-08T16:25:42.000Z", "event": { "original": "192.0.2.255 - - [08/May/2099:16:25:42 +0000] \"GET /favicon.ico HTTP/1.0\" 200 3638" } }

3、搜索

索引文档可以近实时搜索。以下搜索匹配所有在 logs-my_app-default 中的日志条目,并按 @timestamp 降序排序,match_all表示查询所有,默认情况下,响应的点击部分最多包括与搜索匹配的前10个文档。每次命中的 _ source 包含索引期间提交的原始 JSON 对象。。

GET logs-my_app-default/_search
{
  "query": {
    "match_all": { }
  },
  "sort": [
    {
      "@timestamp": "desc"
    }
  ]
}

4、查询某个特定的字段

对于大型文档来说,解析 whole _ source 非常麻烦。若要从响应中排除它,请将 _ source 参数设置为 false。相反,请使用 fields 参数检索所需的字段。

GET logs-my_app-default/_search
{
  "query": {
    "match_all": { }
  },
  "fields": [
    "title"
  ],
  "_source": false,
  "sort": [
    {
      "@timestamp": "desc"
    }
  ]
}

5、根据id查询

GET post/_doc/Xt-k05ABhHMTq-ZiYgSK

6、修改

#修改
POST post/_doc/Xt-k05ABhHMTq-ZiYgSK
{
  "title":"我是修改后的张三",
 "desc":"张三的描述"
  
}

7、删除

DELETE _data_stream/post

8、mapping

理解为数据库的表结构,有哪些字段、字段类型;
ES支持动态映射,表结构可以动态改变,而不像MySql一样必须手动建表,没有的字段就不能插入。

# 查看文档结构
GET post/_mapping

三、分词器

如果我们直接将这段文本存入Elasticsearch而不使用任何分词器,Elasticsearch可能会将整段文本视为一个整体,导致搜索效果很差。例如,当用户搜索“北京”或“天安门”时,Elasticsearch可能无法找到匹配的文档,因为它只看到了一个完整的字符串“我爱北京天安门”。

由于英文和中文的分词规则不一样,对于英文可能根据空格等进行分词,而对应中文来说显然是不行的,所以我们需要引入一个针对于中文进行分词的分词器,在大部分的企业中主流的中文分词器便是ik分词器(ES的一个插件)。

使用IK分词器的情况
当我们使用IK分词器时,这段文本会被切分为有意义的词语。假设我们使用细粒度分词模式,IK分词器可能会将“我爱北京天安门”切分成以下词语:

  • 北京
  • 天安门
    这些词语将被分别存储到Elasticsearch的索引中。这样,当用户搜索“北京”或“天安门”时,Elasticsearch就能找到匹配的文档,因为这些词语已经被正确地索引了。

ik分词器下载链接:https://github.com/medcl/elasticsearch-analysis-ik/releases
tip
官网链接会缺少一些对应的版本,可以在这个链接找到全部的版本=>https://release.infinilabs.com/analysis-ik/stable/

IK提供了两个分词算法ik_smart 和 ik_max_word。

  • ik_smart:为最少切分
  • ik_max_word:为最细粒度划分。
# 分词器
POST _analyze
{
  "analyzer": "ik_smart",
  "text": "中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"
}
POST _analyze
{
  "analyzer": "ik_max_word",
  "text": "中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"
}

后记
👉👉💕💕美好的一天,到此结束,下次继续努力!欲知后续,请看下回分解,写作不易,感谢大家的支持!! 🌹🌹🌹

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

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

相关文章

大型公司网络系统集成方案

一、前言 1.1.公司综合信息系统建设目标 -----------------------------------------------------3 1.2. 用户具体需求----------------------------------------------------------------------------4 1.3.公司综合信息系统建设原则 -------------------------------…

vue3+ts+mock实现增删改查json文件

1.代码结构图: 2.路由 import { createRouter, createWebHashHistory } from "vue-router";import Home from "/pages/home/index.vue"; import AppDetail from "/pages/app-detail/index.vue"; import PageDetail from "/pages…

hadoop生态圈(四)- MapReduce

目录 MapReduce的基本原理 MapReduce流程图 Map阶段执行流程 Reduce阶段执行流程 Shuffle机制 MapReduce解决的是海量数据计算 MapReduce的思想核心是“分而治之”。就是把一个复杂的问题按一定的“分解”方法分为规模较小的若干部分,然后逐个解决,…

作业0828

使用C手动封装一个顺序表&#xff0c;包含成员数组一个&#xff0c;成员变量N个 #include <iostream> #include <string>using namespace std;using datatype int;struct Seqlist { private:datatype *data NULL;int size 0;int len 0;public://初始化函数voi…

从零成本到高效能:免费报表工具在金融行业的实践与应用

在当今金融行业中&#xff0c;多样化的报表体系是支撑机构高效运营、精准决策的重要基石。这些报表不仅反映了金融机构的财务状况&#xff0c;还涵盖了风险管理、业绩评估、流动性管理及合规监管等多个维度。今天我将带领大家深入探讨金融行业中这些报表的多样性和重要性&#…

数据的存储3(第三十二天)

1.整形在内存中的存储&#xff08;补充&#xff09; 原码&#xff0c;反码&#xff0c;补码的概念 &#xff08;1&#xff09;正数的原码&#xff0c;反码&#xff0c;补码相同 &#xff08;2&#xff09;对于整数来说&#xff1a;数据存放内存中其实存放的就是补码 2.浮点…

最长的一帧学习 part3

文章目录 八、osgUtil:: SceneView::cull ()part1 初始化必要的SceneView类成员变量part2 立体显示的处理part3 执行SceneView::cullStage函数&#xff0c;它也是场景视图筛选工作的核心函数part3.1 首先统计场景中的遮挡节点&#xff08;OccluderNode&#xff09;&#xff0c;…

【python】关于判断空值None、判断len()=0,和 if not 的区别

如果我们问一个问题&#xff1a;如果一个东西是不存在的&#xff0c;那么它的长度是多少&#xff1f; 我一开始会不假思索地回答&#xff1a;都不存在了&#xff0c;长度肯定是0啦。 但是细想一下&#xff0c;它都不存在了&#xff0c;还怎么会有长度呢&#xff1f; 这就有点像…

【Java】数据类型与变量(二)

目录 3.变量 3.1什么是变量&#xff08;变量的概念&#xff09; 3.2语法格式 ​编辑​编辑3.3整型变量 3.3.1整型变量如何定义 ​编辑 3.3.2长整型变量 3.3.3短整型变量 3.3.4字节型变量 3.4浮点型变量 3.4.1双精度浮点型 3.4.2单精度浮点型 3.4.3单精度浮点型与双…

【大模型开源教程】Git开源教程「动手学大模型应用开发」,学微调也太简单了

LLM 正逐步成为信息世界的新革命力量&#xff0c;其通过强大的自然语言理解、自然语言生成能力&#xff0c;为开发者提供了新的、更强大的应用开发选择。随着国内外井喷式的 LLM API 服务开放&#xff0c;如何基于 LLM API 快速、便捷地开发具备更强能力、集成 LLM 的应用&…

AI搜索“懒人神器”,如何向谷歌和百度发起挑战?

“属于传统搜索的时代&#xff0c;已经彻底落幕了。” 2024年2月&#xff0c;全球IT分析与评估机构Gartner在一份报告中如此判断。同时该机构预测&#xff0c;到2026年&#xff0c;传统搜索引擎的搜索量将减少25&#xff05;。 与此同时&#xff0c;从最近公布的财报来看&…

源代码加密是什么?给源代码加密如何做?

一、源代码加密是什么&#xff1f; 源代码加密是一种通过特定的加密算法和工具对软件源代码文件进行保护的技术&#xff0c;使得只有授权用户才能解密和访问代码。加密技术可以防止未经授权的访问、阅读、修改或复制源代码。源代码加密&#xff0c;则是对源代码文件进行加密处…

Kubernetes高级调度2

一.Taint和Toleration 1.为什么使用taint &#xff08;1&#xff09;不让pod被部署到被设置为污点的节点上。 &#xff08;2&#xff09;不让master节点部署业务&#xff0c;只部署系统组件 &#xff08;3&#xff09;除了指点pod外&#xff0c;不想让节点部署其他pod 2.为…

解决ESP32 VScode环境报错:Something went wrong while trying to build the project。

当我在vscode开发esp32时&#xff0c;点击构建项目 报了个错。 说明&#xff1a;项目目录包含了中文字符&#xff0c;我给换成全英文路径&#xff0c;再次尝试 成功 改完发现还有问题&#xff0c;来到这个目录&#xff0c;里面的中文也要改成英文。&#xff08;不止&#xff0…

Qt是不是经常写个QWidget输入参数?

发现Qt自带的一个输入控件QInputDialog类 QInputDialog类提供了一个简单方便的对话框&#xff0c;用于从用户获取单个值。 输入值可以是字符串、数字或列表中的项。必须设置一个标签来告诉用户他们应该输入什么。 提供了五个静态方便函数:getText()、getMultiLineText()、getI…

干货:2024年四大免费PDF编辑器精选指南!

在日常生活工作中&#xff0c;我们几乎每天都会接触到PDF文档。当我们需要对这些文档进行编辑时&#xff0c;一些出色的免费PDF编辑器十分重要。接下来&#xff0c;我将分享自己使用过的几款优秀的免费PDF编辑器&#xff01; 福昕PDF编辑器&#xff1a;简洁高效的编辑体验 链…

【Python基础】学习Python常见的几种运行报错,看完之后,你就不会再犯错了!!!(附带解析)

学习Python时&#xff0c;遇到运行时错误是很常见的&#xff0c;这些错误通常是因为代码中存在语法错误、逻辑错误或是对Python的某些特性理解不够深入所导致的。 如果你也是刚入门的小伙伴呢&#xff0c;小编为你们准备了入门Python学习籽料和Python入门实践&#xff0c;点击…

期权末日轮的前提——高杠杆特性是怎样的?

今天带你了解期权末日轮的前提——高杠杆特性是怎样的&#xff1f;期权末日轮是临近期权到期行权&#xff0c;期权合约往往出现大的波动涨跌幅。 如何在实际交易过程中艺术的运用期权产品的高杠杆&#xff0c;始终是一个永无止境的话题&#xff0c;结合一些实战上的经验就是&a…

miniQMT怎么获取历史/最新行情?miniQMT原生python环境如何获取历史/最新行情?

原生Python 调用方法 python from xtquant import xtdata xtdata.get_market_data_ex(field_list[],# 字段stock_list[],# 合约代码列表period1d,# 数据周期——1m、5m、1d、tickstart_time,# 数据起始时间%Y%m%d或%Y%m%d%H%M%Send_time,# 数据结束时间%Y%m%d或%Y%m%d%H%M%Sc…

QT中UI实现小功能的步骤

1、新建一个目录 要勾选Generate form&#xff0c;生成一个.ui文件 把Shadow build的勾选取消&#xff0c;避免产生两个文件夹&#xff01; 2、具体步骤 1.在UI界面中拖拽需要的组件对象 2.修改组件对象的名称 3.保存并运行&#xff0c;根据运行结果适当调整界面布局 4.业…