Elasticsearch教程:索引、搜索与分析实战

Elasticsearch 教程:索引、搜索与分析实战

Elasticsearch 是一个基于 Lucene 库的开源搜索引擎,它提供了一个分布式、支持多租户的全文搜索引擎,具有 HTTP Web 接口和无模式 JSON 文档。Elasticsearch 是用 Java 开发的,并在 Apache 许可下作为开源软件发布。它可以快速地存储、搜索和分析海量数据。

本教程将带领你深入了解 Elasticsearch 的核心概念,并通过实战演练,让你掌握如何使用 Elasticsearch 进行索引、搜索和分析。我们将涵盖以下主题:

一、 基础概念

  • 1.1 文档 (Document):Elasticsearch 是面向文档的,文档是所有可搜索数据的最小单位。例如,一篇博客文章、一个产品信息或一条用户评论都可以表示为一个文档。文档以 JSON 格式存储。
  • 1.2 索引 (Index):索引是具有相似特征的文档的集合。例如,你可以拥有一个客户数据的索引,另一个产品目录的索引。索引由一个名称来标识,该名称必须是全部小写。
  • 1.3 类型 (Type):在 Elasticsearch 7.x 版本之前,一个索引可以包含多个类型,类型是索引的逻辑分类或分区,允许你在同一索引中存储不同结构的文档。从 Elasticsearch 7.x 版本开始,单个索引只能有一个类型,8.x 版本将完全移除类型的概念, 默认使用 _doc
  • 1.4 字段 (Field):文档由字段组成,每个字段包含一个或多个值。例如,一个产品文档可能包含名称、描述、价格和类别等字段。
  • 1.5 映射 (Mapping):映射定义了索引中每个字段的数据类型和属性,例如文本字段、数字字段、日期字段等。映射还定义了如何分析这些字段,以便于搜索。
  • 1.6 节点 (Node):一个节点是 Elasticsearch 集群中的一个运行实例,负责存储数据和执行搜索操作。
  • 1.7 集群 (Cluster):集群由一个或多个节点组成,它们协同工作以提供索引和搜索功能。集群由一个名称来标识。
  • 1.8 分片 (Shard):为了处理大规模数据,Elasticsearch 可以将一个索引分成多个分片。每个分片本身就是一个完全功能的“索引”,可以托管在集群中的任何节点上。分片可以提高性能和可扩展性。
  • 1.9 副本 (Replica):副本是分片的复制,用于提供高可用性和故障转移。如果一个节点发生故障,副本可以接管其工作。

二、安装与配置

本教程假设你已经安装了 Elasticsearch 和 Kibana。如果没有,请参考官方文档进行安装。

  • 2.1 Elasticsearch 安装:可以从 Elasticsearch 官网下载相应版本的安装包,支持多种操作系统。安装完成后,可以通过 bin/elasticsearch 命令启动 Elasticsearch。
  • 2.2 Kibana 安装:Kibana 是一个开源的数据可视化平台,它可以与 Elasticsearch 配合使用,让你能够直观地查看和分析数据。安装完成后,可以通过 bin/kibana 命令启动 Kibana。
  • 2.3 配置文件:Elasticsearch 的配置文件位于 config/elasticsearch.yml,可以在其中配置集群名称、节点名称、网络设置等。Kibana 的配置文件位于 config/kibana.yml

三、索引操作实战

  • 3.1 创建索引

    我们可以使用 Kibana 的 Dev Tools 来执行 Elasticsearch 的 API 请求。打开 Kibana,导航到 Dev Tools,然后输入以下命令来创建一个名为 products 的索引,其中包含一些示例文档的映射:

    json
    PUT /products
    {
    "mappings": {
    "properties": {
    "name": { "type": "text" },
    "description": { "type": "text" },
    "price": { "type": "double" },
    "category": { "type": "keyword" }
    }
    }
    }

    这个命令创建了一个名为 products 的索引,并定义了四个字段:namedescriptionpricecategory。每个字段都有一个特定的数据类型,例如 text 用于全文搜索,double 用于存储浮点数,keyword 用于精确匹配。

  • 3.2 索引文档

    创建索引后,我们可以开始索引文档。以下命令索引了一个新的产品文档到 products 索引中:

    json
    POST /products/_doc/1
    {
    "name": "Elasticsearch 实战教程",
    "description": "一本详细介绍 Elasticsearch 的实用指南",
    "price": 99.99,
    "category": "书籍"
    }

    这个命令将一个 JSON 文档索引到 products 索引中,并指定了文档 ID 为 1。可以根据需要索引更多文档。

  • 3.3 更新文档

    可以使用 _update API 来更新已有的文档。例如,以下命令更新了 ID 为 1 的文档的价格:

    json
    POST /products/_update/1
    {
    "doc": {
    "price": 88.88
    }
    }

  • 3.4 删除文档

    可以使用 _delete API 来删除文档。例如,以下命令删除了 ID 为 1 的文档:

    json
    DELETE /products/_doc/1

  • 3.5 删除索引

    可以使用 DELETE 请求来删除整个索引。例如,以下命令删除了 products 索引:

    json
    DELETE /products

    请谨慎使用删除索引操作,因为它会永久删除索引及其所有文档。

四、搜索操作实战

Elasticsearch 提供了强大的搜索功能,可以通过各种查询条件来检索文档。

  • 4.1 基本搜索

    最简单的搜索是使用 _search API,不带任何查询条件。这将返回索引中的所有文档:

    json
    GET /products/_search

  • 4.2 查询字符串搜索 (Query String Search)

    查询字符串搜索允许你在查询字符串中指定搜索条件。例如,以下命令搜索 name 字段中包含 "Elasticsearch" 的文档:

    json
    GET /products/_search?q=name:Elasticsearch

  • 4.3 查询 DSL (Domain Specific Language)

    查询 DSL 是一种更强大、更灵活的搜索方式,它使用 JSON 格式来构建查询。以下是一些常用的查询类型:

    • 4.3.1 匹配查询 (Match Query)

      匹配查询用于执行全文搜索。例如,以下命令搜索 description 字段中包含 "实用指南" 的文档:

      json
      GET /products/_search
      {
      "query": {
      "match": {
      "description": "实用指南"
      }
      }
      }

    • 4.3.2 精确值查询 (Term Query)

      精确值查询用于查找包含指定精确值的文档。例如,以下命令搜索 category 字段值为 "书籍" 的文档:

      json
      GET /products/_search
      {
      "query": {
      "term": {
      "category": "书籍"
      }
      }
      }

    • 4.3.3 范围查询 (Range Query)

      范围查询用于查找指定范围内的值。例如,以下命令搜索 price 字段值在 50 到 100 之间的文档:

      json
      GET /products/_search
      {
      "query": {
      "range": {
      "price": {
      "gte": 50,
      "lte": 100
      }
      }
      }
      }

    • 4.3.4 布尔查询 (Bool Query)

      布尔查询允许你组合多个查询条件。它支持 mustshouldmust_notfilter 子句。

      • must:文档必须匹配所有 must 子句中的查询。
      • should:文档应该匹配 should 子句中的一个或多个查询。
      • must_not:文档不能匹配 must_not 子句中的任何查询。
      • filter:类似于 must,但 filter 子句中的查询不参与评分。

      例如,以下命令搜索 category 字段值为 "书籍" 且 price 字段值小于 100 的文档:

      json
      GET /products/_search
      {
      "query": {
      "bool": {
      "must": [
      { "term": { "category": "书籍" } },
      { "range": { "price": { "lt": 100 } } }
      ]
      }
      }
      }

  • 4.4 过滤搜索结果

    除了使用 filter 子句,还可以使用 post_filter 来过滤搜索结果。post_filter 在查询执行后应用,因此它不会影响评分。

    json
    GET /products/_search
    {
    "query": {
    "match": {
    "description": "实用指南"
    }
    },
    "post_filter": {
    "term": {
    "category": "书籍"
    }
    }
    }

  • 4.5 排序

    可以使用 sort 参数对搜索结果进行排序。例如,以下命令按 price 字段降序排序:

    json
    GET /products/_search
    {
    "query": {
    "match_all": {}
    },
    "sort": [
    { "price": { "order": "desc" } }
    ]
    }

  • 4.6 分页

    可以使用 fromsize 参数对搜索结果进行分页。from 指定起始文档的偏移量,size 指定返回的文档数量。例如,以下命令返回从第 11 个文档开始的 10 个文档:

    json
    GET /products/_search
    {
    "query": {
    "match_all": {}
    },
    "from": 10,
    "size": 10
    }

五、分析操作实战

分析是将文本转换为适合搜索的词条的过程。Elasticsearch 提供了强大的分析功能,可以通过配置不同的分析器、分词器和过滤器来实现。

  • 5.1 分析器 (Analyzer)

    分析器负责将文本分解成词条。Elasticsearch 内置了多种分析器,例如 standardsimplewhitespace 等。你也可以自定义分析器。

  • 5.2 分词器 (Tokenizer)

    分词器将文本分割成单个词条。例如,standard 分词器将文本按单词边界分割,并删除大多数标点符号。

  • 5.3 过滤器 (Token Filter)

    过滤器对分词器生成的词条进行进一步处理,例如转换为小写、删除停用词、添加同义词等。

  • 5.4 测试分析器

    可以使用 _analyze API 测试分析器的效果。例如,以下命令使用 standard 分析器分析文本 "Elasticsearch 实战教程":

    json
    GET /_analyze
    {
    "analyzer": "standard",
    "text": "Elasticsearch 实战教程"
    }

    返回结果将显示分析后的词条列表。

  • 5.5 自定义分析器

    你可以在创建索引时自定义分析器。例如,以下命令创建了一个名为 my_index 的索引,并定义了一个名为 my_analyzer 的自定义分析器,该分析器使用 standard 分词器和 lowercase 过滤器:

    json
    PUT /my_index
    {
    "settings": {
    "analysis": {
    "analyzer": {
    "my_analyzer": {
    "type": "custom",
    "tokenizer": "standard",
    "filter": [
    "lowercase"
    ]
    }
    }
    }
    },
    "mappings": {
    "properties": {
    "content": {
    "type": "text",
    "analyzer": "my_analyzer"
    }
    }
    }
    }

    这个例子中,content 字段使用了自定义的 my_analyzer 分析器。

六、总结

本教程介绍了 Elasticsearch 的核心概念,包括索引、搜索和分析。我们通过实战演练,演示了如何创建索引、索引文档、执行各种搜索操作以及配置分析器。Elasticsearch 是一个功能强大的搜索引擎,可以应用于各种场景,例如全文搜索、日志分析、数据分析等。希望本教程能够帮助你入门 Elasticsearch,并将其应用于你的实际项目中。

为了更深入地学习 Elasticsearch,建议你阅读官方文档并进行更多的实践练习。你还可以探索 Elasticsearch 的高级功能,例如聚合、脚本、地理空间搜索等。祝你在 Elasticsearch 的学习之旅中取得成功!

THE END