Elasticsearch 精粹:一站式学习全方位搜索技术

2024-01-10 10:34:24

1.ElasticSearch概述

Elasticsearch 是一个开源的搜索引擎,建立在 Apache Lucene? 基础上。它被广泛用于全文搜索、结构化搜索、分析以及将这些功能组合在一起的复杂搜索用例。以下是 Elasticsearch 的一些关键特点和功能:

  1. 分布式和可扩展性:Elasticsearch 是分布式的,这意味着它可以处理大量数据并在多个服务器之间分配这些数据。这种分布式特性使其具备高可扩展性和容错能力。

  2. 实时搜索:Elasticsearch 能够提供几乎实时的搜索结果。这是通过其倒排索引机制实现的,该机制允许快速的文本搜索。

  3. 全文搜索:Elasticsearch 支持强大的全文搜索功能,使其能够搜索文本文档中的任何词。

  4. 多种语言处理:它支持多种语言,能够理解不同语言的词汇和语法。

  5. RESTful API:Elasticsearch 提供了一个基于 REST 的 API,这意味着你可以使用 HTTP 方法(如 GET、POST、PUT、DELETE)与 Elasticsearch 交互。

  6. 数据分析和聚合:Elasticsearch 不仅仅是一个搜索引擎。它还提供了强大的分析和聚合工具,使其成为一个有效的数据分析平台。

  7. 灵活性:Elasticsearch 可以存储、搜索和分析各种类型的数据,包括文本、数字、地理位置、结构化和非结构化数据等。

  8. 集成:它可以轻松地与各种数据源(如日志、事务数据、消息队列等)集成,并与其他 Elastic Stack 组件(如 Kibana、Logstash、Beats)配合使用,提供完整的数据分析解决方案。

  9. 安全性:Elasticsearch 提供了多层安全特性,包括角色基础的访问控制、加密等。

  10. 社区和生态系统:作为一个开源项目,Elasticsearch 拥有一个活跃的开发者社区和一个丰富的插件生态系统。

Elasticsearch 的这些特性使其成为一个强大而灵活的搜索和分析工具,适用于各种规模和类型的项目。

2.ElasticSearch下载与安装

Elasticsearch 的下载和安装过程相对简单。以下是基本步骤,适用于大多数标准安装场景:

1. 系统要求

在安装 Elasticsearch 之前,请确保你的系统符合以下要求:

  • Java:Elasticsearch 需要 Java 运行环境。通常需要 Java 8 或更高版本。
  • 操作系统:Elasticsearch 可以在多种操作系统上运行,包括 Linux、Windows 和 macOS。

2. 下载 Elasticsearch

访问 Elasticsearch 的官方网站下载页面 Elasticsearch Download。选择适合你的操作系统的版本进行下载。

3. 安装 Elasticsearch

在 Linux 上
  1. 解压下载的文件。使用命令行,可以使用类似下面的命令:
    tar -xzf elasticsearch-<version>.tar.gz
    
  2. 进入解压后的 Elasticsearch 目录。
  3. 启动 Elasticsearch,通过执行:
    ./bin/elasticsearch
    
在 Windows 上
  1. 解压下载的 ZIP 文件。
  2. 打开解压后的文件夹。
  3. 运行 bin\elasticsearch.bat 文件以启动 Elasticsearch。
在 macOS 上

可以使用 Homebrew 来安装 Elasticsearch:

brew tap elastic/tap
brew install elastic/tap/elasticsearch-full

然后启动 Elasticsearch:

elasticsearch

4. 验证安装

在浏览器或命令行中访问 http://localhost:9200。如果 Elasticsearch 正在运行,你将看到一条消息,即You Know, for Search,其中还包含集群、节点和版本的信息。
在这里插入图片描述

5. 注意事项

  • 配置:根据需要,你可以修改 config/elasticsearch.yml 文件中的配置设置。
  • 安全设置:考虑配置 Elasticsearch 的安全设置,如启用 X-Pack 安全性。
  • 内存设置:可能需要调整 JVM 的堆大小,这可以在 config/jvm.options 文件中进行设置。

以上是基本的安装步骤。具体步骤可能会根据你的操作系统和具体需求有所不同。请参考 Elasticsearch 的官方文档,以获取更详细的安装指南和最佳实践。

3.Elasticsearch-head下载与安装

“Elasticsearch-head” 是一个基于 Web 的界面,用于管理和监控 Elasticsearch 集群。它是一个社区驱动的项目,提供了一个简单直观的界面来执行各种 Elasticsearch 操作,如查看集群状态、创建和删除索引、执行查询等。下面是 Elasticsearch-head 的安装和使用指南:

1. 安装 Elasticsearch-head

有两种主要方式安装 Elasticsearch-head:

1.作为 Elasticsearch 插件安装(适用于 Elasticsearch 5.x 及以下)

  1. 安装插件
    在 Elasticsearch 安装目录下执行以下命令:

    ./bin/elasticsearch-plugin install mobz/elasticsearch-head
    
  2. 重启 Elasticsearch
    重新启动 Elasticsearch 以激活插件。

2.作为独立的 Node.js 应用运行(适用于所有版本,推荐)

  1. 安装 Node.js
    确保你的系统上安装了 Node.js。

  2. 克隆 Git 仓库
    克隆 elasticsearch-head 的 GitHub 仓库:

    git clone https://github.com/mobz/elasticsearch-head.git
    
  3. 安装依赖
    进入 elasticsearch-head 目录并安装依赖:

    cd elasticsearch-head
    npm install
    
  4. 运行 Elasticsearch-head
    elasticsearch-head 目录中运行:

    npm run start
    

    这将在 http://localhost:9100/ 启动 Elasticsearch-head。

2. 使用 Elasticsearch-head

  1. 访问 Web 界面
    在 Web 浏览器中打开 http://localhost:9100/(如果作为 Node.js 应用运行)或 Elasticsearch 的插件 URL(如果作为插件安装)。

  2. 连接到 Elasticsearch 集群
    默认情况下,elasticsearch-head 会尝试连接到 http://localhost:9200。如果你的 Elasticsearch 集群运行在不同的地址或端口上,你需要在地址栏中输入正确的 URL。

  3. 浏览和管理集群
    使用 Elasticsearch-head 的各种功能来管理你的 Elasticsearch 集群。你可以查看集群健康、浏览数据、执行查询和修改数据等。

3. 注意事项

  • 跨域问题:如果你作为 Node.js 应用运行 elasticsearch-head,可能需要在 Elasticsearch 的配置文件 (elasticsearch.yml) 中设置允许跨域请求,例如:
    http.cors.enabled: true
    http.cors.allow-origin: "*"
    
  • 安全性:考虑到安全性,不建议在生产环境中启用跨域请求或将 Elasticsearch-head 公开到互联网。

Elasticsearch-head 是一个非常实用的工具,特别适合于 Elasticsearch 新手或那些希望通过可视化界面进行集群管理的用户。然而,随着 Elasticsearch 版本的更新,部分功能可能不再与最新版本的 Elasticsearch 完全兼容。因此,始终建议检查兼容性并关注最新的开发动态。

这个ElasticSearch-head就把它当作数据展示工具即可,后面所有的查询都在Kibana里面做即可!

4.Kibana概述

Kibana 是 Elasticsearch 的官方开源数据可视化工具,专为 Elasticsearch 设计。它提供了一个强大的界面,用于搜索、查看和交互存储在 Elasticsearch 索引中的数据。Kibana 让用户能够以图表、图形和地图的形式直观地展示和分析数据。以下是 Kibana 的一些主要特点和功能:

1.数据可视化与仪表板

  • 多样化的可视化选项:Kibana 支持多种类型的图表,包括折线图、柱状图、饼图、散点图、热力图和地图等。
  • 交互式仪表板:用户可以创建包含多种可视化组件的仪表板,这些仪表板可以展示实时数据,并与用户的操作实时交互。

2.搜索与分析

  • 强大的搜索功能:Kibana 利用 Elasticsearch 的搜索能力,允许用户快速检索大量数据。
  • 数据过滤与聚合:用户可以对数据进行过滤、排序和聚合,以更深入地分析数据。

3.Elasticsearch 集成

  • 无缝集成 Elasticsearch:Kibana 与 Elasticsearch 紧密集成,使得从数据索引到分析和可视化的过程非常流畅。
  • 索引管理:Kibana 提供索引管理功能,允许用户查看和管理 Elasticsearch 索引。

4.地理空间数据分析

  • 地图可视化:Kibana 支持地理空间数据的可视化,包括使用地图来展示数据点、形状和热力图。

5.扩展功能

  • Machine Learning:Kibana 通过 X-Pack 集成机器学习功能,可以用于识别数据中的异常模式、时间序列分析等。
  • 日志与指标分析:Kibana 特别适合于日志数据和指标数据的分析,与 Beats 和 Logstash 等工具一起使用时更加强大。

6.安全与管理

  • 安全性和访问控制:通过 X-Pack,Kibana 提供安全功能,包括角色基于的访问控制、加密和审计日志。
  • 空间管理:Kibana 允许创建多个“空间”,每个空间可以有自己的仪表板、可视化和索引模式,适用于多团队或项目。

7.用户友好的界面

  • 易于使用的 UI:Kibana 的用户界面直观易用,使得即使是非技术用户也能轻松上手。
  • 自定义和共享:用户可以自定义仪表板和可视化,也可以与团队成员共享。

8.应用场景

Kibana 适用于各种数据分析和可视化需求,如日志分析、实时数据监控、安全分析、业务智能等。

总的来说,Kibana 是一个功能丰富、灵活且用户友好的数据可视化工具,它使得从简单的数据探索到复杂的数据分析和可视化变得容易和高效。随着 Elasticsearch 生态系统的不断发展,Kibana 也在持续增加新的功能和改进,以满足日益增长的数据分析需求。

5.Kibana安装

安装 Kibana 是一个直接的过程,但需要确保 Elasticsearch 已经安装并运行在你的系统上,因为 Kibana 是作为 Elasticsearch 的前端界面运行的。下面是 Kibana 的基本下载和安装步骤:

1. 系统要求

  • 确保你的系统已经安装了 Elasticsearch。
  • 确保你的系统满足 Kibana 的运行要求,包括适当的操作系统和兼容的 Java 版本(如果适用)。

2. 下载 Kibana

  • 访问 Elasticsearch 的官方网站上的 Kibana Download Page
  • 选择适合你的操作系统的 Kibana 版本进行下载。
  • Kibana的版本需要和你下载的ElasticSearch版本一致。

3. 安装 Kibana

1.在 Linux 上
  1. 解压下载的文件
    使用命令行解压下载的文件,例如:

    tar -xzf kibana-<version>-linux-x86_64.tar.gz
    
  2. 进入 Kibana 目录
    解压后,进入 Kibana 目录。

  3. 配置 Kibana(可选):
    编辑 config/kibana.yml 文件,设置 Elasticsearch 的 URL。默认情况下,它连接到 http://localhost:9200

  4. 启动 Kibana
    使用下列命令启动 Kibana:

    ./bin/kibana
    
2.在 Windows 上
  1. 解压下载的 ZIP 文件

  2. 运行 Kibana
    打开解压后的文件夹,双击 bin\kibana.bat 文件来启动 Kibana。

3.在 macOS 上
  • 可以使用 Homebrew 进行安装:
    brew install kibana
    
  • 启动 Kibana:
    kibana
    

4. 访问 Kibana

  • 在浏览器中访问 http://localhost:5601。如果 Kibana 正在运行,你将看到 Kibana 的主界面。
    在这里插入图片描述

5. Kibana的汉化

截至我最后的更新(2023年4月),Kibana 支持多种语言,包括汉语。为了将 Kibana 界面转换为中文,你需要在 Kibana 的配置文件中设置适当的语言代码。以下是将 Kibana 界面设置为中文的步骤:

1.定位配置文件

找到 Kibana 的配置文件 kibana.yml。这个文件通常位于 Kibana 安装目录的 config 文件夹中。

2.2. 编辑配置文件

打开 kibana.yml 文件,并找到与国际化(i18n)相关的设置。

3. 设置语言

i18n.locale 设置为 zh-CN 来启用简体中文界面。你可以通过添加或修改下面这行来实现:

i18n.locale: "zh-CN"

如果这行代码之前不存在,你需要新添加进去;如果已经存在但被注释掉了(以 # 开头),则需要去掉 # 并确保值设置为 "zh-CN"

4. 重启 Kibana

保存 kibana.yml 文件后,重启 Kibana 以应用更改。重启的方法取决于你的安装方式和操作系统。

5. 验证更改

重启 Kibana 后,打开浏览器并访问 Kibana。此时,界面应该显示为简体中文。

通过这些步骤,你应该能够将 Kibana 的界面设置为中文,从而获得更舒适的本地化用户体验。

6. 注意事项

  • 版本兼容性:确保你下载的 Kibana 版本与 Elasticsearch 版本兼容。
  • 安全配置:考虑配置安全设置,如启用 X-Pack 安全特性。
  • 调整配置:你可能需要根据需要调整更多的配置设置,这些设置可以在 config/kibana.yml 文件中找到。

以上是基本的安装步骤。对于具体操作系统或特定需求的更详细安装指南,请参考 Kibana 的官方文档。

6.ElasticSearch核心概念

Elasticsearch 是一个高度可扩展的开源全文搜索和分析引擎,它允许你快速、近实时地存储、搜索和分析大量数据。

为了更好地理解和使用 Elasticsearch,了解其核心概念非常重要。

下面让我们更深入地探讨 Elasticsearch 的核心概念,并在必要时与传统的关系型数据库进行对比,以便更好地理解其特点和用例。

1. 索引(Index)

  • Elasticsearch:一个索引是文档的集合。Elasticsearch 中的索引类似于传统数据库中的“数据库”,但在物理结构上更为灵活。你可以将其视为一个优化的文档集合,用于快速的全文搜索和分析。
  • 关系型数据库:数据库中的“索引”是优化特定查询的数据结构。而“数据库”更类似于 Elasticsearch 中的“索引”。

2. 文档(Document)

  • Elasticsearch:文档是 Elasticsearch 中的基本信息单位,以 JSON 格式存储。一个文档类似于关系型数据库中的“行”,但其结构不固定,可以包含复杂的嵌套结构。
  • 关系型数据库:表中的一行代表一条记录,结构由表定义的模式决定。

3. 字段(Field)

  • Elasticsearch:文档中的字段类似于数据库表中的列,但由于 Elasticsearch 的 schema-less 特性,文档可以在同一索引中拥有不同的字段。
  • 关系型数据库:字段(列)是表中的基本数据单元,每个表的每行都有相同的字段。

4. 映射(Mapping)

  • Elasticsearch:映射定义了文档中字段的数据类型和其他属性,类似于关系型数据库中的表结构定义。尽管 Elasticsearch 是 schema-less 的,但映射允许你定义如何处理文档中的不同字段。
  • 关系型数据库:表结构定义是创建表时必须指定的,确定了字段名和数据类型。

5. 分片(Shard)

  • Elasticsearch:分片是 Elasticsearch 中数据分布的基本单元。每个索引都可以分成多个分片,每个分片是一个独立的搜索引擎。这使得 Elasticsearch 可以水平扩展,分布在多个服务器上。
  • 关系型数据库:传统数据库通常不直接支持水平分片,需要额外的技术和复杂的管理。

6. 副本(Replica)

  • Elasticsearch:副本是分片的一个或多个完整的副本。副本提供数据冗余,提高系统的容错能力和查询的响应速度。
  • 关系型数据库:副本通常是整个数据库的复制,用于提供容灾恢复和读取负载均衡。

7. 节点和集群(Node & Cluster)

  • Elasticsearch:节点是安装了 Elasticsearch 的单个服务器。多个节点可以形成一个集群,集群通过分布式架构协同工作,提供数据冗余、负载均衡和故障转移。
  • 关系型数据库:虽然也可以通过主从复制或集群配置实现高可用性,但传统数据库通常不具备 Elasticsearch 这样的原生分布式特性。

8. 查询 DSL

  • Elasticsearch:使用强大的查询 DSL 进行数据搜索,支持全文搜索、复杂查询构建等。
  • 关系型数据库:使用 SQL 语言进行数据查询,强调数据的结构和关系。

9. 总结

Elasticsearch 与传统的关系型数据库在数据存储、查询、结构、以及处理方式上有显著差异。Elasticsearch 以其高效的全文搜索能力、灵活的数据模型、强大的水平扩展能力和容错能力而著

理解这些核心概念对于有效地使用 Elasticsearch 是非常重要的,它们构成了 Elasticsearch 功能强大、灵活性高的基础。

7.倒排索引

倒排索引(Inverted Index)是 Elasticsearch 和其他全文搜索引擎的核心概念之一,这种索引类型对于提高搜索效率至关重要。为了理解倒排索引,我们可以将其与传统的正向索引进行对比。

1. 正向索引(Forward Index)

在传统数据库或简单的搜索系统中,可能会使用所谓的正向索引。在正向索引中,数据结构通常是这样的:

  • 文档ID -> 文档内容

例如,如果我们有两个文档:

  • 文档 1: “The quick brown fox”
  • 文档 2: “The brown fox jumps”

正向索引将会记录每个文档ID及其对应的内容。

2. 倒排索引(Inverted Index)

倒排索引颠倒了这种映射关系,记录的是每个词及其出现的文档:

  • 词 -> 文档ID列表

以同样的例子,倒排索引会是这样的:

  • “The”: [文档 1, 文档 2]
  • “quick”: [文档 1]
  • “brown”: [文档 1, 文档 2]
  • “fox”: [文档 1, 文档 2]
  • “jumps”: [文档 2]

3. 倒排索引的工作原理

  1. 分词(Tokenization):将文档的内容分解为一系列的词(或称为“tokens”)。在分词过程中,还可能包括转换为小写、去除停用词(如“的”,“和”等常见但对搜索意义不大的词)等步骤。

  2. 创建词典(Dictionary):所有文档的词汇构成了一个词典。词典中的每个词都指向一个倒排列表。

  3. 建立倒排列表(Posting List):对于词典中的每个词,都有一个倒排列表,记录了该词出现在哪些文档中。

4. 倒排索引的优势

  • 高效搜索:当执行搜索查询时,搜索引擎只需查找包含搜索词的倒排列表,然后提取相关的文档。这比逐个检查每个文档要快得多。
  • 空间效率:虽然建立索引需要额外空间,但倒排索引通常比正向索引更加节省空间,尤其是对于包含大量文档的大型数据库。

在 Elasticsearch 中,倒排索引使得它能够快速处理复杂的全文搜索查询。每个索引在 Elasticsearch 中由一个或多个分片管理,每个分片拥有自己的一套倒排索引。

倒排索引是全文搜索技术的核心, Elasticsearch 这样的系统能够在大规模文档集合中快速、高效地执行搜索查询。倒排索引的设计允许快速从大量数据中找到包含特定词的所有文档,是实现近实时搜索的关键。

8.IK分词器

IK分词器是一个开源的,基于 Java 语言开发的中文分词工具,广泛用于Elasticsearch中。它为中文文本提供了有效的分词处理,尤其在搜索引擎中表现出色。IK分词器特别适用于与Elasticsearch结合使用,因为它能够提高中文搜索的准确性和效率。

1. IK分词器的核心特点

  1. 两种分词模式

    • 精确模式(Smart Mode):尝试将句子最精确地切开,适合精确搜索。
    • 全切分模式(Full Mode):把文本切分成尽可能多的词,适合用于提取关键词。
  2. 自定义词典支持

    • 支持用户自定义词典,以适应特定领域的分词需求。
    • 通过添加自定义词汇,可以提高分词的准确性和覆盖范围。
  3. 同义词处理

    • 可以处理一定程度的同义词,使搜索更加灵活。
  4. 中文停用词处理

    • 能够有效地去除常见的中文停用词,提高搜索的相关性。

2. IK分词器的使用

要在Elasticsearch中使用IK分词器,需要进行以下步骤:

  1. 安装IK插件

    • 下载与你的Elasticsearch版本相对应的IK分词器插件。
    • 将插件安装到Elasticsearch的插件(plugins)目录中。
  2. 配置IK分词器

    • 在创建索引时,可以指定使用IK分词器对文本字段进行分词。
    • 可以配置为使用精确模式或全切分模式。
  3. 自定义词典设置(可选):

    • 你可以根据需要添加自定义词典,以覆盖或扩展默认词库。

IK分词器在处理中文文本时非常有效,尤其适合用于中文全文搜索、文本分析等领域。例如,它可以用于新闻网站、电商平台、社交媒体分析等需要精准搜索和文本分析的应用。

IK分词器通过提供精确和全面的中文分词功能,显著提升了Elasticsearch在处理中文数据时的性能和准确性。这使得它成为处理中文文本的搜索和分析应用中的一个重要工具。

3. Kibana测试

ik_smartik_max_word 是 Elasticsearch 中 IK 分词器提供的两种不同的分词模式,各自适用于不同的场景:

  1. ik_smart(智能分词模式)

    • 特点:在这种模式下,分词器会尝试将句子切分成最少的词汇,同时保持各个词汇的独立性和完整性。它更倾向于提取长词。
    • 应用场景:适用于需要较高精度的场景,比如精确搜索,其中用户期望的结果是严格匹配他们查询的词汇。智能分词有助于减少误命中的可能性,提供更加准确的搜索结果。
  2. ik_max_word(最大切分模式)

    • 特点:这种模式会将文本尽可能多地切分成更细小的词汇。它会产生更多的词汇,包括短语中的所有可能的单词组合。
    • 应用场景:适用于需要更广泛搜索范围的场景,如关键词提取、文本分析或当你想要在文本中查找尽可能多的相关信息时。最大切分模式有利于增加文档的可检索性,但也可能导致更多的误匹配。
      在这里插入图片描述
      对比:
  • ik_smart 更注重于提取有意义的长词,使得搜索结果更加精准,但可能会遗漏一些细粒度的关键词。
  • ik_max_word 提供了更细粒度的分词,能够捕捉到更多的关键词,但可能会导致搜索结果中包含一些不太相关的信息。

选择哪种模式取决于具体的应用场景和搜索需求。在某些情况下,可能需要在两种模式之间进行权衡,以找到最适合特定用例的平衡点。

3. 自定义词典

配置和扩展自定义词典是 IK 分词器的一个重要特性,特别是在处理专业术语或特定领域词汇时。以下是在 Elasticsearch 中配置和扩展 IK 分词器自定义词典的步骤:

1. 准备自定义词典文件

自定义词典通常是文本文件,其中包含了你希望分词器识别的词汇。每个词汇占一行。

例如,你的自定义词典文件 my_dict.txt 可能看起来像这样:

专业术语1
专业术语2
特定词汇
2. 配置 IK 分词器以使用自定义词典

IK 分词器的配置通常在 Elasticsearch 的配置文件夹中的 config 目录下。具体步骤如下:

  1. 将自定义词典文件放入适当的位置:你可以将自定义词典文件放在 Elasticsearch 的 config 目录下,例如 config/ik/my_dict.txt

  2. 修改 IK 分词器的配置文件:IK 分词器的配置文件通常名为 IKAnalyzer.cfg.xml,位于 config/ik 目录下。你需要在这个文件中指定你的自定义词典文件路径。

    例如,添加以下内容:

    <properties>
      <comment>IK Analyzer 扩展配置</comment>
      <!-- 用户可以在这里配置自己的扩展字典 -->
      <entry key="ext_dict">my_dict.txt</entry>
      <!-- 用户可以在这里配置自己的扩展停止词字典 -->
      <entry key="ext_stopwords">my_stopwords.txt</entry>
    </properties>
    
3. 重启 Elasticsearch

配置更改后,需要重启 Elasticsearch 以使更改生效。

4. 测试自定义词典

重启 Elasticsearch 后,你可以通过 _analyze API 测试自定义词典的效果。例如:

GET /_analyze
{
  "analyzer": "ik_smart", 
  "text": "这里是你的测试文本"
}

这应该会根据你的自定义词典来分词。

5. 注意事项
  • 格式和编码:确保自定义词典文件的格式正确(每行一个词汇),并且保存为 UTF-8 编码。
  • 词典维护:随着时间的推移和应用的发展,可能需要定期更新和维护自定义词典。
  • 性能考虑:虽然自定义词典是一个强大的功能,但过大的词典可能会影响分词性能。

通过这些步骤,你可以有效地扩展 IK 分词器的功能,使其更适合你的应用场景。

9.CRUD命令

在 Elasticsearch 中,执行增删改查(CRUD)操作通常是通过 RESTful API 来完成的。这些操作遵循 HTTP 方法的标准实践,使其易于理解和使用。下面是 Elasticsearch 中常见的 CRUD 操作和相应的 RESTful 命令。

1. 创建(Create)

  • 索引一个文档:使用 PUTPOST 方法向指定索引添加一个文档。

    PUT /<index>/_doc/<id>
    {
      "field1": "value1",
      "field2": "value2"
    }
    

    POST /<index>/_doc/
    {
      "field1": "value1",
      "field2": "value2"
    }
    

    在这里,<index> 是索引名,<id> 是文档的唯一标识符。如果不指定 <id>,Elasticsearch 会自动生成一个。

2. 读取(Read)

  • 获取文档:使用 GET 方法根据文档 ID 读取单个文档。

    GET /<index>/_doc/<id>
    
  • 搜索文档:使用 GETPOST 方法在索引中搜索文档。

    GET /<index>/_search
    {
      "query": {
        "match": {
          "field": "value"
        }
      }
    }
    

3. 更新(Update)

  • 更新文档:使用 POST 方法更新现有文档的部分内容,这里只更新指定的字段。

    POST /<index>/_update/<id>
    {
      "doc": {
        "fieldToUpdate": "newValue"
      }
    }
    

    而PUT更新方式执行更新,如果在对应的字段不传递值的会被自动赋值为空,因此一般不建议使用PUT命令执行更新!

4. 删除(Delete)

  • 删除文档:使用 DELETE 方法根据文档 ID 删除一个文档。

    DELETE /<index>/_doc/<id>
    
  • 删除索引:使用 DELETE 方法删除整个索引。

    DELETE /<index>
    
  • 这些操作是基本的 Elasticsearch RESTful API 示例。实际使用中,可能需要根据具体情况对请求进行调整。

  • 对于复杂的搜索请求,Elasticsearch 提供了丰富的查询 DSL,可以在 _search 请求中使用。

  • 安全性考虑:在对外暴露 Elasticsearch 服务时,应确保适当的安全措施,如使用身份验证、授权等。

Elasticsearch 的 RESTful API 提供了强大的灵活性,使其成为处理各种数据和搜索需求的理想选择。通过上述的 CRUD 操作,你可以在 Elasticsearch 中高效地管理数据。

10.花式查询命令

Elasticsearch 提供了多种强大的查询命令,允许进行复杂和灵活的数据检索。以下是一些常见的 Elasticsearch 查询类型和相应的查询命令示例:

1. 基本查询

  • 全文搜索(Match Query):搜索文本字段中匹配特定词汇的文档。

    GET /<index>/_search
    {
      "query": {
        "match": {
          "field": "text"
        }
      }
    }
    

2. 组合查询

  • 布尔查询(Bool Query):组合多个查询条件,支持must(必须)、should(应该)、must_not(不应该)和filter(过滤)。
    GET /<index>/_search
    {
      "query": {
        "bool": {
          "must": [
            { "match": { "field1": "value1" }},
            { "match": { "field2": "value2" }}
          ],
          "filter": [
            { "term": { "field3": "value3" }}
          ]
        }
      }
    }
    

在 Elasticsearch 中,布尔查询(Bool Query)是一种复杂查询类型,它允许你结合多个查询条件,例如“必须”(must)、“应该”(should)、“不应该”(must_not)和“过滤”(filter)。这种查询非常强大,因为它提供了在单个查询中组合多种条件的能力。

布尔查询的组成部分

  1. Must:所有在 must 部分的条件必须满足,类似于逻辑 AND。
  2. Should:在 should 部分的条件中至少有一个应该满足,但不是必须的。如果没有 must 条件,那么至少要满足一个 should 条件。
  3. Must_not:在 must_not 部分的条件都不应该满足,类似于逻辑 NOT。
  4. Filterfilter 部分的条件必须满足,但与 must 不同,它不影响评分(用于过滤而不是评分)。

布尔查询示例

以下是一个布尔查询的示例,该查询结合了多个条件:

GET /<index>/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "field1": "value1" } }
      ],
      "should": [
        { "match": { "field2": "value2" } },
        { "match": { "field3": "value3" } }
      ],
      "must_not": [
        { "match": { "field4": "value4" } }
      ],
      "filter": [
        { "term": { "field5": "value5" } }
      ]
    }
  }
}

在这个示例中:

  • must 部分要求 “field1” 必须匹配 “value1”。
  • should 部分表示 “field2” 应该匹配 “value2” 或者 “field3” 应该匹配 “value3”(或者两者都匹配),但这些条件不是必须的。
  • must_not 部分指定 “field4” 不应该匹配 “value4”。
  • filter 部分要求 “field5” 必须精确匹配 “value5”。

使用布尔查询的场景

布尔查询在需要执行复杂搜索时非常有用,例如:

  • 当你需要同时满足多个条件。
  • 当你想要排除某些文档。
  • 当你有一些首选条件,但它们不是必需的。

布尔查询因其灵活性和强大的组合能力,在 Elasticsearch 查询中占有重要地位。通过适当地组合这些不同的子句,你可以构建出涵盖几乎所有搜寻需求的复杂查询。

3. 范围查询

  • 范围查询(Range Query):在数字或日期字段上搜索特定范围内的值。
    GET /<index>/_search
    {
      "query": {
        "range": {
          "date_field": {
            "gte": "2021-01-01",
            "lte": "2021-12-31"
          }
        }
      }
    }
    

4. 术语查询

  • 术语查询(Term Query):搜索文本字段中包含特定术语的文档。
    GET /<index>/_search
    {
      "query": {
        "term": {
          "field": "value"
        }
      }
    }
    

5. 聚合查询

  • 聚合查询(Aggregations):对搜索结果执行统计分析。
    GET /<index>/_search
    {
      "size": 0,
      "aggs": {
        "agg_name": {
          "terms": {
            "field": "field_to_aggregate"
          }
        }
      }
    }
    

聚合查询在 Elasticsearch 中是一个非常强大的功能,它允许你对数据进行统计分析,类似于 SQL 中的 GROUP BY 功能。聚合可以是简单的计数,也可以是更复杂的操作,如求平均值、求和、最大值、最小值等。

聚合查询的主要类型

  1. 桶(Bucket)聚合:这类聚合创建了一个包含文档组的桶,每个桶都是满足特定条件的文档集合。常见的桶聚合有:

    • 术语聚合(Terms Aggregation):基于字段值的唯一项进行分组。
    • 范围聚合(Range Aggregation):基于数值范围进行分组。
    • 日期范围聚合(Date Range Aggregation):基于日期范围进行分组。
  2. 指标(Metric)聚合:对文档集进行一些统计计算。常见的指标聚合包括:

    • 平均值(Average Aggregation)
    • 最大值(Max Aggregation)
    • 最小值(Min Aggregation)
    • 求和(Sum Aggregation)
    • 计数(Value Count Aggregation)

示例:聚合查询

假设你有一个包含销售数据的索引 sales,你想要计算每个产品的平均销售额。

GET /sales/_search
{
  "size": 0,  // 不返回文档数据,只返回聚合结果
  "aggs": {
    "average_sales": {  // 聚合的名字
      "terms": {  // 术语聚合,按产品分组
        "field": "product"
      },
      "aggs": {
        "average_price": {  // 每个产品的平均销售额
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

这个查询的解释:

  • "size": 0 表示不返回搜索结果中的文档,只返回聚合数据。
  • aggs 是定义聚合的地方。
  • "terms": { "field": "product" } 表示根据 product 字段的值进行分组。
  • 在每个产品分组内部,我们又定义了一个名为 average_price 的子聚合,用于计算该组中所有销售记录的平均价格。

注意事项

  • 聚合操作可能在大数据集上非常耗资源,特别是在执行复杂的聚合时。因此,应当关注其对性能的影响。
  • 对于高基数字段(即字段有许多唯一值)的术语聚合,可能需要考虑对内存的影响,因为 Elasticsearch 需要在内存中为每个唯一值保留一个桶。
  • 对于大型数据集,考虑使用 composite 聚合来分页聚合结果。

聚合查询是 Elasticsearch 中极其强大的功能之一,它可以帮助你从数据中提取有意义的模式和统计信息。

6. 模糊查询

  • 模糊查询(Fuzzy Query):搜索拼写相似的词汇。
    GET /<index>/_search
    {
      "query": {
        "fuzzy": {
          "field": {
            "value": "text",
            "fuzziness": 2
          }
        }
      }
    }
    

在 Elasticsearch 中,模糊查询(Fuzzy Query)允许你在查询时对某些不确定性或拼写错误进行容错处理。这种查询对于处理用户的输入错误或提供更宽松的搜索体验特别有用。

模糊查询的工作原理

模糊查询通过计算字词的 Levenshtein 编辑距离来工作。编辑距离是将一个字词转换成另一个字词所需的单个字符更改(插入、删除或替换)的次数。在 Elasticsearch 中,你可以指定所允许的最大编辑距离。

示例:模糊查询

假设你有一个字段 field,想要搜索接近于 “elastc” 的词汇,可以使用以下查询:

GET /<index>/_search
{
  "query": {
    "fuzzy": {
      "field": {
        "value": "elastc",
        "fuzziness": 2
      }
    }
  }
}

在这个查询中:

  • "fuzzy" 指定了模糊查询。
  • "field" 是你要搜索的字段。
  • "value": "elastc" 指定了你想要搜索的近似词汇。
  • "fuzziness": 2 表示允许的最大编辑距离为 2。这意味着 Elasticsearch 会寻找那些最多需要两次单字符更改就能从 “elastc” 变成的词汇。

使用模糊查询的场景

  • 处理拼写错误:当用户输入可能包含拼写错误时,模糊查询可以提供更弹性的搜索结果。
  • 近似搜索:在某些情况下,你可能不确定确切的词汇或者想要包括拼写的变体。

模糊查询是 Elasticsearch 中一个非常实用的功能,尤其在处理用户输入或开发需要容错能力的搜索应用时非常有价值。

7. 前缀和通配符查询

  • 前缀查询(Prefix Query):搜索以特定前缀开头的词汇。

    GET /<index>/_search
    {
      "query": {
        "prefix": {
          "field": "pre"
        }
      }
    }
    
  • 通配符查询(Wildcard Query):使用通配符(*?)进行模式匹配搜索。

    GET /<index>/_search
    {
      "query": {
        "wildcard": {
          "field": "pat*ern"
        }
      }
    }
    

8. 分页与排序

此外,在 Elasticsearch 中进行分页查询和排序是常见的需求,特别是当处理大量数据时。

下面是结合分页和排序的 Elasticsearch 查询示例,以及对这些命令的详细说明:

假设你想对一个名为 “example_index” 的索引进行查询,获取第2页的数据(每页10条),并根据 “date_field” 字段进行降序排序:

GET /example_index/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    { "date_field": { "order": "desc" }}
  ],
  "from": 10,
  "size": 10
}
  • GET /example_index/_search:这是向 Elasticsearch 发送的 HTTP GET 请求,用于搜索名为 “example_index” 的索引。

  • query:这部分定义了你想要执行的搜索查询。

    • match_all:这里使用了一个匹配所有文档的查询,作为一个示例。
  • sort:这部分用于定义结果的排序方式。

    • { "date_field": { "order": "desc" }}:这表示根据 “date_field” 字段的值对结果进行降序排序。
  • fromsize:这两个参数用于控制分页。

    • from: 定义了返回结果的起始位置。在这个例子中,from: 10 表示从第11个文档开始返回(因为计数从0开始)。
    • size: 定义了返回的文档数量。在这个例子中,size: 10 表示返回10个文档。

分页和排序的应用

  • 分页:在处理大量数据时,分页是一种常见的方法,用于减少单次请求加载的数据量,从而提高响应速度和用户体验。

  • 排序:排序对于提供有意义和相关的搜索结果非常重要,特别是在数据分析和报告应用中。

  • 分页的 fromsize 参数需要根据实际需求调整。请注意,非常大的 from 值可能会影响性能。

  • 在使用排序时,确保字段已经被正确索引并适用于排序。例如,对于文本字段,通常需要一个未分析的(keyword 类型的)版本来进行排序。

  • 排序和分页结合使用时,应特别注意性能和资源使用情况,尤其是在大规模数据集上。

9. 高亮查询

在 Elasticsearch 中,高亮查询是一种显示特性,用于在搜索结果中突出显示匹配的文本片段。这在全文搜索中非常有用,因为它可以帮助用户快速定位为什么某个文档与他们的查询匹配。高亮显示通常用于提高搜索结果的可读性和相关性。

1. 基本用法

要在 Elasticsearch 查询中使用高亮显示,你需要在查询请求体中添加一个 highlight 字段。以下是一个基本的示例:

GET /<index>/_search
{
  "query": {
    "match": {
      "content": "elasticsearch"
    }
  },
  "highlight": {
    "fields": {
      "content": {}
    }
  }
}

在这个查询中:

  • match 查询用于在 content 字段中查找包含 “elasticsearch” 的文档。
  • highlight 部分指定了高亮显示设置。
  • fields 下的 "content": {} 表示 content 字段中匹配的部分将被高亮显示。
2. 自定义高亮显示

Elasticsearch 还提供了一些高亮显示的定制选项,包括:

  • 设置前后标签:可以自定义高亮片段的前后标签(默认为 <em> 标签)。

    "highlight": {
      "fields": {
        "content": {
          "pre_tags": ["<highlight>"],
          "post_tags": ["</highlight>"]
        }
      }
    }
    
  • 限制片段数和长度:可以限制返回的高亮片段的数量和长度。

    "highlight": {
      "fields": {
        "content": {
          "number_of_fragments": 3,
          "fragment_size": 150
        }
      }
    }
    
  • 字段类型:不是所有字段类型都支持高亮。通常,只有文本(text)字段才支持高亮显示。

  • 性能考虑:高亮查询可能会增加查询的处理时间,尤其是在大型文档或大量文档的情况下。

  • 前后标签:确保自定义的前后标签与你的应用程序中的样式兼容。

通过使用高亮显示,你可以改善搜索体验,使用户更容易理解为何某个文档与其搜索查询相匹配。这在用户界面和用户体验方面非常重要。

"query": {
    "match": {
      "content": "elasticsearch"
    }
  },
  "highlight": {
    "fields": {
      "content": {}
    }
  }
}

在这个查询中:

  • match 查询用于在 content 字段中查找包含 “elasticsearch” 的文档。
  • highlight 部分指定了高亮显示设置。
  • fields 下的 "content": {} 表示 content 字段中匹配的部分将被高亮显示。
2. 自定义高亮显示

Elasticsearch 还提供了一些高亮显示的定制选项,包括:

  • 设置前后标签:可以自定义高亮片段的前后标签(默认为 <em> 标签)。

    "highlight": {
      "fields": {
        "content": {
          "pre_tags": ["<highlight>"],
          "post_tags": ["</highlight>"]
        }
      }
    }
    
  • 限制片段数和长度:可以限制返回的高亮片段的数量和长度。

    "highlight": {
      "fields": {
        "content": {
          "number_of_fragments": 3,
          "fragment_size": 150
        }
      }
    }
    
  • 字段类型:不是所有字段类型都支持高亮。通常,只有文本(text)字段才支持高亮显示。

  • 性能考虑:高亮查询可能会增加查询的处理时间,尤其是在大型文档或大量文档的情况下。

  • 前后标签:确保自定义的前后标签与你的应用程序中的样式兼容。

通过使用高亮显示,你可以改善搜索体验,使用户更容易理解为何某个文档与其搜索查询相匹配。这在用户界面和用户体验方面非常重要。

文章来源:https://blog.csdn.net/qq_51447436/article/details/135495612
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。