Elasticsearch 教程:轻松掌握全文搜索与数据分析 – wiki基地

Elasticsearch 教程:轻松掌握全文搜索与数据分析

Elasticsearch 是一款基于 Apache Lucene 构建的开源、分布式、RESTful 搜索引擎,以其强大的全文搜索能力、近实时的数据分析能力以及可扩展性,被广泛应用于日志分析、应用监控、电商搜索、企业搜索等众多领域。本教程将带您深入了解 Elasticsearch,从基础概念到高级应用,助您轻松掌握全文搜索与数据分析。

一、 Elasticsearch 核心概念

理解 Elasticsearch 的核心概念是学习的基础。以下是几个关键术语:

  • Index (索引): 类似于关系型数据库中的数据库,用于存储相关文档的集合。例如,您可以创建一个名为 “products” 的索引来存储您的电商商品数据。

  • Document (文档): 类似于关系型数据库中的行,是 Elasticsearch 中存储的基本单元。文档通常以 JSON 格式表示,包含多个字段 (Fields)。 例如,一个 “product” 文档可能包含 “name”、”description”、”price” 和 “category” 等字段。

  • Type (类型): 在 Elasticsearch 7.x 之前,一个 Index 可以包含多个 Type,类似于关系型数据库中的表。但从 Elasticsearch 7.x 开始,Type 已经被弃用,取而代之的是单个 “_doc” 类型。这意味着一个 Index 只能包含一种类型的文档。

  • Field (字段): 类似于关系型数据库中的列,是 Document 中的一个属性。例如,”product” 文档中的 “name” 字段用于存储商品名称。

  • Mapping (映射): 定义了索引中每个字段的数据类型以及索引方式。Mapping 告诉 Elasticsearch 如何索引和搜索数据。例如,您可以将 “name” 字段映射为 text 类型,允许全文搜索;将 “price” 字段映射为 double 类型,允许数值范围搜索。

  • Shard (分片): 为了提高性能和可扩展性,Elasticsearch 将 Index 分割成多个 Shard。每个 Shard 都是一个独立的 Lucene 索引,可以分布在不同的节点上。

  • Replica (副本): 为了保证数据的可靠性和高可用性,Elasticsearch 可以创建 Shard 的多个 Replica。Replica 是 Shard 的拷贝,可以用于读取请求,也可以在主 Shard 发生故障时自动顶替。

  • Node (节点): 是 Elasticsearch 集群中的一个服务器实例。每个节点都可以存储数据,参与索引和搜索操作。

  • Cluster (集群): 由一个或多个节点组成,共同存储和处理数据。

二、 Elasticsearch 安装与配置

  1. 下载 Elasticsearch: 访问 Elasticsearch 官网 (https://www.elastic.co/downloads/elasticsearch) 下载对应您操作系统的 Elasticsearch 安装包。

  2. 解压安装包: 将下载的安装包解压到您选择的目录。

  3. 启动 Elasticsearch: 进入解压目录下的 bin 目录,执行以下命令启动 Elasticsearch:

    • Linux/macOS: ./elasticsearch
    • Windows: elasticsearch.bat
  4. 验证安装: 在浏览器中访问 http://localhost:9200,如果看到包含 Elasticsearch 版本信息的 JSON 响应,则表示安装成功。

  5. 配置 Elasticsearch (可选): 您可以修改 config/elasticsearch.yml 文件来配置 Elasticsearch 集群。常用的配置项包括:

    • cluster.name: 集群名称
    • node.name: 节点名称
    • network.host: 监听地址
    • http.port: HTTP 端口
    • discovery.seed_hosts: 用于发现其他节点的地址列表 (在集群环境中)。

三、 Elasticsearch REST API 基本操作

Elasticsearch 提供了强大的 REST API,允许您通过 HTTP 请求与集群交互。以下是一些基本操作:

  1. 创建索引:

    bash
    PUT /products
    {
    "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 1
    },
    "mappings": {
    "properties": {
    "name": {
    "type": "text",
    "analyzer": "ik_max_word" // 使用中文分词器
    },
    "description": {
    "type": "text",
    "analyzer": "ik_max_word"
    },
    "price": {
    "type": "double"
    },
    "category": {
    "type": "keyword" // 不进行分词
    }
    }
    }
    }

    • PUT /products: 创建名为 “products” 的索引。
    • settings: 配置索引的参数,例如分片数和副本数。
    • mappings: 定义字段的映射。
    • number_of_shards: 设置索引的分片数。
    • number_of_replicas: 设置每个分片的副本数。
    • analyzer: 指定分词器,ik_max_word 是一款流行的中文分词器。如果没有安装,需要先安装并配置。
    • type: 指定字段的数据类型。text 用于全文搜索,keyword 用于精确匹配,double 用于数值类型。
  2. 索引文档:

    bash
    POST /products/_doc
    {
    "name": "小米13 Ultra",
    "description": "小米最新旗舰手机,拥有徕卡光学影像系统。",
    "price": 5999.00,
    "category": "手机"
    }

    • POST /products/_doc: 将一个文档添加到 “products” 索引中。
    • _doc: 指定文档类型(在 Elasticsearch 7.x 及以上版本中,始终为 “_doc”)。
  3. 获取文档:

    bash
    GET /products/_doc/YOUR_DOCUMENT_ID

    • GET /products/_doc/YOUR_DOCUMENT_ID: 根据文档 ID 获取文档。你需要将 YOUR_DOCUMENT_ID 替换为实际的文档 ID。
  4. 更新文档:

    bash
    POST /products/_doc/YOUR_DOCUMENT_ID/_update
    {
    "doc": {
    "price": 6499.00
    }
    }

    • POST /products/_doc/YOUR_DOCUMENT_ID/_update: 更新指定文档 ID 的文档。
    • doc: 包含需要更新的字段。
  5. 删除文档:

    bash
    DELETE /products/_doc/YOUR_DOCUMENT_ID

    • DELETE /products/_doc/YOUR_DOCUMENT_ID: 删除指定文档 ID 的文档。
  6. 删除索引:

    bash
    DELETE /products

    • DELETE /products: 删除 “products” 索引。

四、 Elasticsearch 搜索

Elasticsearch 提供了强大的搜索功能,可以使用各种查询来查找文档。

  1. Match Query:

    bash
    GET /products/_search
    {
    "query": {
    "match": {
    "name": "小米"
    }
    }
    }

    • match: 对字段进行全文搜索。Elasticsearch 会对查询字符串进行分词,并查找包含这些词的文档。
  2. Term Query:

    bash
    GET /products/_search
    {
    "query": {
    "term": {
    "category": "手机"
    }
    }
    }

    • term: 对字段进行精确匹配。不会对查询字符串进行分词。
  3. Range Query:

    bash
    GET /products/_search
    {
    "query": {
    "range": {
    "price": {
    "gte": 5000, // 大于等于
    "lte": 7000 // 小于等于
    }
    }
    }
    }

    • range: 对数值或日期字段进行范围搜索。
    • gte: 大于等于。
    • lte: 小于等于。
    • gt: 大于。
    • lt: 小于。
  4. Boolean Query:

    bash
    GET /products/_search
    {
    "query": {
    "bool": {
    "must": [
    { "match": { "name": "小米" } },
    { "range": { "price": { "gte": 5000 } } }
    ],
    "must_not": [
    { "term": { "category": "配件" } }
    ],
    "should": [
    { "match": { "description": "徕卡" } }
    ],
    "minimum_should_match": 1
    }
    }
    }

    • bool: 用于组合多个查询条件。
    • must: 必须满足的条件 (相当于 AND)。
    • must_not: 必须不满足的条件 (相当于 NOT)。
    • should: 应该满足的条件 (相当于 OR),满足的条件越多,相关性得分越高。
    • minimum_should_match: should 子句中必须满足的最少条件数。
  5. Highlighting:

    bash
    GET /products/_search
    {
    "query": {
    "match": {
    "description": "徕卡光学"
    }
    },
    "highlight": {
    "fields": {
    "description": {}
    }
    }
    }

    • highlight: 高亮显示搜索结果中的关键词。
  6. Aggregation (聚合):

    bash
    GET /products/_search
    {
    "size": 0, // 不返回具体文档
    "aggs": {
    "category_counts": {
    "terms": {
    "field": "category"
    }
    }
    }
    }

    • aggs: 定义聚合操作。
    • terms: 按照字段进行分组统计。
    • size: 设置返回结果的数量,设置为 0 表示只返回聚合结果。

五、 Elasticsearch 数据分析

Elasticsearch 不仅仅是一个搜索引擎,也是一个强大的数据分析工具。通过聚合 (Aggregation) 功能,您可以对数据进行各种统计和分析。

  • Metric Aggregations: 计算字段的各种指标,例如平均值、最大值、最小值、总和等。例如:

    bash
    GET /products/_search
    {
    "size": 0,
    "aggs": {
    "average_price": {
    "avg": {
    "field": "price"
    }
    }
    }
    }

  • Bucket Aggregations: 将文档按照字段进行分组,例如按照日期、类别、地理位置等。例如:

    bash
    GET /products/_search
    {
    "size": 0,
    "aggs": {
    "price_ranges": {
    "range": {
    "field": "price",
    "ranges": [
    { "to": 3000 },
    { "from": 3000, "to": 6000 },
    { "from": 6000 }
    ]
    }
    }
    }
    }

    • range: 按照价格范围进行分组。

六、 Elasticsearch 进阶主题

  • Analyzer (分词器): Elasticsearch 使用 Analyzer 将文本分解成一个个 Token,以便进行索引和搜索。选择合适的分词器对于搜索效果至关重要。常用的分词器包括:standardwhitespacesimplestopkeywordik_max_word (中文)、ik_smart (中文) 等。您还可以自定义分词器。

  • Scripting (脚本): Elasticsearch 允许您使用脚本来执行复杂的计算和逻辑。常用的脚本语言包括 Painless (Elasticsearch 官方推荐) 和 Groovy。

  • Plugins (插件): Elasticsearch 提供了丰富的插件,可以扩展其功能,例如添加新的分词器、分析器、存储引擎等。

  • Performance Tuning (性能优化): 可以通过调整 Elasticsearch 的配置参数、优化索引结构、使用缓存等方式来提高性能。

  • Security (安全): Elasticsearch 提供了安全特性,例如身份验证、授权、审计等,可以保护您的数据安全。

七、 总结

本教程介绍了 Elasticsearch 的基本概念、安装配置、REST API 操作、搜索功能和数据分析能力。通过学习本教程,您应该能够掌握 Elasticsearch 的基本用法,并将其应用于实际项目中。 Elasticsearch 是一个功能强大的搜索引擎和数据分析工具,希望您能深入学习和探索,充分利用其优势。 记住,实践是最好的老师,多多练习,您将会更加熟练地掌握 Elasticsearch!

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部