Elasticsearch 解析:倒排索引机制/字段类型/语法/常见问题

news2024/10/28 16:35:01

在这里插入图片描述

Elasticsearch 是一个分布式的开源搜索引擎,广泛用于全文搜索、分析和数据存储。它基于 Apache Lucene 构建,支持 RESTful 风格的 API,使得开发者能够高效地存储和检索数据。本文将详细讲解 Elasticsearch 的基本原理,特别是其倒排索引机制,常见语法的使用,以及在实际应用中可能遇到的常见问题及解决方案。

1. 倒排索引机制

Elasticsearch 是一个用于全文搜索、分析和存储数据的强大工具。它能够处理海量数据,并快速响应复杂的查询请求。Elasticsearch 的核心功能包括:

  • 实时搜索:支持近实时的数据索引和搜索。
  • 分布式特性:可以轻松扩展到多个节点。
  • RESTful API:使用 HTTP 协议进行数据交互。
  • 多种查询方式:支持各种复杂的查询语法。

1.1 什么是倒排索引?

倒排索引(Inverted Index)是 Elasticsearch 高效搜索的核心原理。它将文档中的每个词(term)与包含该词的文档列表建立映射关系。与传统的顺序索引不同,倒排索引能够更快地找到包含特定词的文档。

倒排索引的结构

倒排索引主要由两个部分组成:

  • 词典(Dictionary):存储文档中所有唯一的词(term)。
  • 倒排列表(Posting List):每个词对应一个列表,包含所有包含该词的文档 ID,以及其他相关信息,如词频(TF)和文档频率(DF)。

1.2 倒排索引的工作流程

  1. 文档分析:将文档中的文本分解为词项(tokens),并进行标准化处理(如小写化、去除停用词)。
  2. 构建索引:为每个词项在词典中创建条目,并将对应的文档 ID 添加到倒排列表中。
  3. 搜索请求:当接收到搜索请求时,Elasticsearch 将查询的词项映射到倒排索引,快速找到相关文档。

1.3 倒排索引的优势

  • 高效搜索:能够快速找到包含特定词的文档,提高搜索速度。
  • 支持复杂查询:允许使用布尔查询、短语查询等多种复杂的查询方式。

2.1 基本类型

2.1.1 字符串类型(Text 和 Keyword)

  • Text

    • 用于分析的文本字段,适合全文搜索。
    • 存储时会被分词(tokenization),便于查找。
    • 适用于长文本,如文章、描述等。

    示例

    "description": {
      "type": "text"
    }
    
  • Keyword

    • 不进行分析的字符串字段,适合精确匹配。
    • 通常用于 ID、标签、类别等需要精确查询的字段。

    示例

    "category": {
      "type": "keyword"
    }
    

2.1.2 数字类型(Integer, Float, Double, etc.)

  • Integer

    • 整数类型,适用于整数字段。

    示例

    "age": {
      "type": "integer"
    }
    
  • FloatDouble

    • 浮点数类型,适合存储小数。

    示例

    "price": {
      "type": "float"
    }
    

2.1.3 布尔类型(Boolean)

  • Boolean

    • 只存储 truefalse 值。

    示例

    "is_active": {
      "type": "boolean"
    }
    

2.2 日期类型

  • Date

    • 用于存储日期和时间,支持多种日期格式。

    示例

    "created_at": {
      "type": "date",
      "format": "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
    }
    

2.3 对象和嵌套类型

2.3.1 对象类型(Object)
  • Object

    • 用于存储 JSON 对象,字段可以嵌套。
    • 适合存储复杂的数据结构。

    示例

    "address": {
      "type": "object",
      "properties": {
        "city": { "type": "keyword" },
        "zip": { "type": "integer" }
      }
    }
    
2.3.2 嵌套类型(Nested)
  • Nested

    • 专门用于处理数组中的对象,确保在查询时保持对象之间的关系。
    • 避免在传统对象类型中因扁平化导致的数据混乱。

    示例

    "comments": {
      "type": "nested",
      "properties": {
        "user": { "type": "keyword" },
        "message": { "type": "text" }
      }
    }
    

2.4 地理位置类型

  • Geo-point

    • 用于存储地理坐标(经纬度),支持地理查询。

    示例

    "location": {
      "type": "geo_point"
    }
    
  • Geo-shape

    • 用于存储复杂的地理形状,如多边形和线条。

    示例

    "area": {
      "type": "geo_shape"
    }
    

2.5 自定义字段类型

Elasticsearch 允许开发者定义自定义字段类型,以满足特定需求。这些自定义类型可以基于已有类型进行扩展,或通过插件实现。

2.6 字段类型选择的考虑因素

在选择字段类型时,需要考虑以下几个因素:

  • 数据特性:字段的数据类型和内容。
  • 查询需求:是否需要全文搜索、精确匹配或聚合。
  • 性能影响:不同类型对存储和查询性能的影响。

2.7 字段类型的映射示例

以下是一个完整的映射示例,展示了多种字段类型的结合使用:

PUT /my_index
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      },
      "author": {
        "type": "keyword"
      },
      "published_date": {
        "type": "date"
      },
      "price": {
        "type": "float"
      },
      "tags": {
        "type": "keyword"
      },
      "comments": {
        "type": "nested",
        "properties": {
          "user": { "type": "keyword" },
          "message": { "type": "text" }
        }
      },
      "location": {
        "type": "geo_point"
      }
    }
  }
}

3. 常见语法介绍

Elasticsearch 提供了丰富的查询语法,以下是一些常见的查询类型及其示例。

3.1 基本查询

3.1.1 匹配查询(Match Query)

匹配查询是最基本的查询类型,用于查找包含特定词的文档。

GET /index_name/_search
{
  "query": {
    "match": {
      "field_name": "search_term"
    }
  }
}
3.1.2 精确匹配查询(Term Query)

精确匹配查询用于查找字段中完全匹配的文档。

GET /index_name/_search
{
  "query": {
    "term": {
      "field_name": "exact_term"
    }
  }
}

3.2 复合查询

3.2.1 布尔查询(Bool Query)

布尔查询允许组合多个查询条件。

GET /index_name/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "field1": "value1" }},
        { "match": { "field2": "value2" }}
      ],
      "filter": {
        "term": { "field3": "value3" }
      }
    }
  }
}
3.2.2 范围查询(Range Query)

范围查询用于查找在某个范围内的文档。

GET /index_name/_search
{
  "query": {
    "range": {
      "field_name": {
        "gte": 10,
        "lte": 20
      }
    }
  }
}

3.3 聚合查询

聚合查询用于对数据进行分析和统计。

GET /index_name/_search
{
  "size": 0,
  "aggs": {
    "group_by_field": {
      "terms": {
        "field": "field_name"
      }
    }
  }
}

4. 常见问题及解决方案

在使用 Elasticsearch 的过程中,可能会遇到一些常见问题。以下是一些常见问题及其解决方案。

4.1 问题:索引未找到(Index Not Found)

  • 描述:尝试查询一个不存在的索引。
  • 解决方案:检查索引名称是否正确,确保索引已创建。可以使用 GET /_cat/indices 查看当前存在的索引。

4.2 问题:查询性能低下

  • 描述:某些查询响应时间过长。

  • 解决方案:

    • 确保使用了合适的查询类型,避免使用 match_all 查询。
    • 对常用字段建立索引,优化字段映射。
    • 监控集群状态,确保集群健康。

4.3 问题:文档丢失或未更新

  • 描述:更新文档后,查询仍返回旧数据。

  • 解决方案:

    • 确认文档已成功更新,可以使用 GET /index_name/_search 查询确认。
    • 检查是否有未提交的变更,确保刷新索引。

4.4 问题:内存不足

  • 描述:集群运行过程中出现内存不足的情况。

  • 解决方案:

    • 调整 JVM 堆内存设置,确保合适的内存配置。
    • 监控和优化索引的数量和大小,避免不必要的索引碎片。

5. 实际案例

以下是一个使用 Elasticsearch 进行日志搜索的实际案例。

5.1 需求背景

在一个电商平台中,用户需要快速搜索和分析日志数据,以便进行故障排查和性能优化。使用 Elasticsearch 能够高效地处理大量日志数据,并提供实时查询能力。

5.2 数据建模

定义日志数据的索引结构,包括时间戳、用户 ID、操作类型等字段。

PUT /logs
{
  "mappings": {
    "properties": {
      "timestamp": { "type": "date" },
      "user_id": { "type": "keyword" },
      "action": { "type": "text" },
      "details": { "type": "text" }
    }
  }
}

5.3 数据插入

使用 Bulk API 批量插入日志数据。

POST /logs/_bulk
{ "index": { "_id": "1" } }
{ "timestamp": "2024-01-01T10:00:00", "user_id": "user1", "action": "login", "details": "User logged in" }
{ "index": { "_id": "2" } }
{ "timestamp": "2024-01-01T10:05:00", "user_id": "user2", "action": "purchase", "details": "User purchased item A" }

5.4 查询示例

用户想要查询在某个时间段内的所有登录操作。

GET /logs/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "action": "login" }},
        { "range": { "timestamp": { "gte": "2024-01-01T00:00:00", "lte": "2024-01-01T23:59:59" }}}
      ]
    }
  }
}

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

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

相关文章

ctfshow(66->70)--RCE/命令执行漏洞--禁用命令执行函数

Web66 源代码: if(isset($_POST[c])){$c $_POST[c];eval($c); }else{highlight_file(__FILE__); }代码审计: POST传参c,eval进行代码执行。 思路: 由于题目过滤了命令执行函数,所以使用其他方法进行RCE。 先使用c…

一文讲明白大模型分布式逻辑(从GPU通信原语到Megatron、Deepspeed)

1. 背景介绍 如果你拿到了两台8卡A100的机器(做梦),你的导师让你学习部署并且训练不同尺寸的大模型,并且写一个说明文档。你意识到,你最需要学习的就是关于分布式训练的知识,因为你可是第一次接触这么多卡…

【ROS概述】概念及环境搭建

学习途径: 教程:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 课程视频:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 机器人体系 要完全实现一个机器人的系统研发,几乎是“全栈”开发,…

python 爬虫 入门 五、抓取图片、视频

目录 一、图片、音频 二、下载视频: 一、图片、音频 抓取图片的手法在上一篇python 爬虫 入门 四、线程,进程,协程-CSDN博客里面其实有,就是文章中的图片部分,在那一篇文章,初始代码的28,29行…

Python 函数返回值之None类型

什么是None None是类型‘NoneType’字面量,用于表示:空的、无意义的 函数如何返回None 不使用return语句即返回None 主动return None 使用场景 函数返回值if判断变量定义 练习: 练习一:无return语句的函数返回值 # 无ret…

Docker | centos7上对docker进行安装和配置

安装docker docker配置条件安装地址安装步骤2. 卸载旧版本3. yum 安装gcc相关4. 安装需要的软件包5. 设置stable镜像仓库6. 更新yum软件包索引7. 安装docker引擎8. 启动测试9. 测试补充:设置国内docker仓库镜像 10. 卸载 centos7安装docker https://docs.docker.com…

交易逆序对的总数 ---- 分治-归并

题目链接 题目: 分析: 解法一: 暴力解法, 遍历所有的数对, 找到逆序对, 需要两重for循环, 一定会超时解法二: 归并排序的思想如果我们将数组分成两半, 我们在每一半中各找一个数字, 判断是否为逆序对, 再根据归并的思想, 再将一半数组分半, 判断是否为逆序对, 直到数组只有一…

合约门合同全生命周期管理系统:企业智能合同管理的新时代

合约门合同全生命周期管理系统:企业智能合同管理的新时代 1. 引言 随着现代企业的快速发展,合同管理的复杂性日益增加。无论是采购合同、销售合同还是合作协议,合同管理已成为企业运营中至关重要的一环。传统的手工合同管理方式往往效率低下…

WISE:重新思考大语言模型的终身模型编辑与知识记忆机制

论文地址:https://arxiv.org/abs/2405.14768https://arxiv.org/abs/2405.14768 1. 概述 随着世界知识的不断变化,大语言模型(LLMs)需要及时更新,纠正其生成的虚假信息或错误响应。这种持续的知识更新被称为终身模型编…

Colorful/七彩虹将星X17 Pro Max 2023款 Win11原厂OEM系统 带COLORFUL一键还原

安装完毕自带原厂驱动和预装软件以及一键恢复功能,自动重建COLORFUL RECOVERY功能,恢复到新机开箱状态。 【格式】:iso 【系统类型】:Windows11 原厂系统下载网址:http://www.bioxt.cn 注意:安装系统会…

网页上的视频怎么下载下来?三种方法

分享三个简单好用的网页视频下载工具,值得使用! 1.IDM IDM 是一款可以提高下载速度达5倍的工具,同时具有恢复、调度和组织下载的功能。如果由于网络问题或意外的电源中断,程序将恢复未完成的下载。 IDM 还具有一个完全功能的站点…

Redis 过期策略 总结

前言 相关系列 《Redis & 目录》(持续更新)《Redis & 过期策略 & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Redis & 过期策略 & 总结》(学习总结/最新最准/持续更新)《Redis &a…

【SpringBoot】✈️@Service 代替 @Controller 在控制层场景使用

目录 🍸前言 👋一、区别 🍻二、本地测试 2.1 响应类 2.2 控制层 3.Service 测试 🍺三、分析 👀四、章末 🍸前言 小伙伴们大家好,由于最近比较忙,文章更新的稍微怠慢了&#xff0…

leetcode-62-不同路径

题解: 1、dp[i][j]代表到达(i,j)点最多的路径;题目要求机器人每次只能向右或向下走一步,所以到达(i,j)点的最多路径为到达(i-1,j)的最多路径与到达(i,j-1)的最多路径之和。即dp[i][j]dp[i-1][j]dp[i][j-1]。 2、当(i,j)位于矩阵的第一行或第…

rabbitmq高级特性(1):消息确认,持久性,发送方确认和重试机制

目录 1.消息确认机制 1.1.消息确认机制介绍 2.1.Spring-AMQP的三种消息确认(重点) 2.持久性 2.1.交换机持久性 2.2.队列持久性 2.3.消息持久性 3.发送方确认 3.1.confirm确认模式 3.2.return退回模式 4.重试机制 4.1.重试机制定义 4.2.重试…

Padavan开启IPV6

开户IPV6 如果运营商支持IPV6,在网络地图中可以看到获取到的ipv6地址 开启SSH 输入如下命令让访火墙放行IPV6 ip6tables -F ip6tables -X ip6tables -P INPUT ACCEPT ip6tables -P OUTPUT ACCEPT ip6tables -P FRWARD ACCEPT 可以写在自启动脚本里 关闭路由器的防…

CH592进一步降功耗问题

目录 问题描述: 自制模块电流测试: 成熟产品电流测试: 优化程序: 总结: 关注我,躺不平就一起卷吧 问题描述: 之前有记录过,CH592与app连接时电流过大问题&#…

群控系统服务端开发模式-应用开发-业务架构逻辑开发BaseAPI

一、加密工具开发 首先在根目录下extend文件中创建Encipher文件夹&#xff0c;用于专门开发加解密工具&#xff0c;新建RSA算法控制器并命名为Encrypt.php。然后在根目录下config文件夹中创建rsa.php文件&#xff0c;用于配置RSA算法参数。 1、秘钥生成算法 <?php /*** RS…

聚类分析算法——K-means聚类 详解

K-means 聚类是一种常用的基于距离的聚类算法&#xff0c;旨在将数据集划分为 个簇。算法的目标是最小化簇内的点到簇中心的距离总和。下面&#xff0c;我们将从 K-means 的底层原理、算法步骤、数学基础、距离度量方法、参数选择、优缺点 和 源代码实现 等角度进行详细解析。…

web3.0 开发实践

优质博文&#xff1a;IT-BLOG-CN 一、简介 Web3.0也称为去中心化网络&#xff0c;是对互联网未来演进的一种概念性描述。它代表着对现有互联网的下一代版本的设想和期望。Web3.0的目标是通过整合区块链技术、分布式系统和加密技术等新兴技术&#xff0c;构建一个更加去中心化…