it编程 > 游戏开发 > ar

Elasticsearch 的索引管理与映射配置实战指南

34人参与 2025-11-13 ar

在大数据时代,如何有效存储和检索信息成为了各行各业关注的焦点。elasticsearch,作为一种开源的分布式搜索引擎,因其高效的全文搜索能力和灵活的扩展性而受到广泛欢迎。在使用 elasticsearch 的过程中,索引和映射的管理是至关重要的环节,它们直接影响着数据的组织结构和查询效率。

本文将深入探讨 elasticsearch 中索引与映射的操作,包括如何创建、更新和删除索引,以及如何定义和修改映射。我们将提供实用的示例和最佳实践,以帮助读者掌握这些关键概念,并提高在 elasticsearch 中的数据管理能力。无论你是 elasticsearch 的新手还是有经验的用户,这篇文章都将为你提供宝贵的知识和技巧,助力你在数据处理和分析的道路上更进一步。在 elasticsearch 中执行索引相关操作的基本内容总结。

一、索引操作

(一)创建索引

创建elasticsearch(es)索引是在es中存储和管理数据的重要操作之一。索引是用于组织和检索文档的结构化数据存储。

当创建elasticsearch索引时,通常需要同时指定索引的设置(settings)和映射(mappings)。以下是一个包括索引的设置和映射的示例:

put /my_index
{
  "settings": {
    "number_of_shards": 5,
    "number_of_replicas": 1
  },
  "mappings": {
    "properties": {
      "field1": {
        "type": "text",
        "analyzer": "standard"
      },
      "field2": {
        "type": "keyword"
      },
      "field3": {
        "type": "integer"
      },
      "field4": {
        "type": "date",
        "format": "yyyy-mm-dd"
      }
    }
  }
}

在这个示例中:

这个示例通过dsl告诉elasticsearch如何创建索引、如何配置索引的主分片和副本,以及如何映射字段以便正确存储和检索文档数据。在创建索引后,可以将文档添加到索引中,并使用查询dsl执行各种查询操作。

假设您正在构建一个电子商务网站,需要存储和检索产品信息。可以定义产品索引的映射,包括产品名称、描述、价格等字段的数据类型和属性。

dsl示例

put /products
{
  "mappings": {
    "properties": {
      "product_name": {
        "type": "text",
        "analyzer": "standard"
      },
      "description": {
        "type": "text",
        "analyzer": "english"
      },
      "price": {
        "type": "float"
      },
      "category": {
        "type": "keyword"
      }
    }
  }
}

java示例

createindexrequest request = new createindexrequest("products");
request.mapping("_doc", 
    "product_name", "type=text,analyzer=standard",
    "description", "type=text,analyzer=english",
    "price", "type=float",
    "category", "type=keyword"
);
createindexresponse createindexresponse = client.indices()
.create(request, requestoptions.default);

(二)删除索引

删除 elasticsearch(es)索引是一项重要的操作,可以用来清理不再需要的数据索引。要删除 elasticsearch 索引,可以使用以下常规dsl语句:

delete /my_index

在上述示例中,delete 是 http 请求方法,/my_index 是要删除的索引名称。这个简单的dsl语句会告诉 elasticsearch 删除名为 my_index 的索引及其所有数据。

假设您运营一个博客平台,以索引和存储博客文章。有时,您可能需要删除某些旧的博客索引以释放存储空间。要删除名为 blog_posts 的博客索引,可以使用以下dsl语句:

delete /blog_posts

对应java代码可以为:

deleteindexrequest deleterequest = new deleteindexrequest("blog_posts");
acknowledgedresponse deleteresponse = client.indices()
.delete(deleterequest, requestoptions.default);
if (deleteresponse.isacknowledged()) {
    system.out.println("博客索引删除成功");
} else {
    system.out.println("博客索引删除失败");
}

(三)关闭索引

关闭 elasticsearch(es)索引是一种操作,可以将索引设置为不可用状态,以减少资源消耗,但仍然保留索引定义和数据。要关闭 elasticsearch 索引,可以使用以下常规dsl语句:

post /my_index/_close

在上述示例中,post 是 http 请求方法,/my_index/_close 是要关闭的索引的路径。这个dsl语句会告诉 elasticsearch 关闭名为 my_index 的索引。

假设您运营一个文档管理系统,使用 elasticsearch 来存储文档索引。有时,您可能需要关闭某个索引以释放资源,但仍然保留索引定义,以便以后再次启用。要关闭名为 document_index 的文档索引,可以使用以下dsl语句:

post /document_index/_close

对应java代码可写为:

closeindexrequest closeindexrequest = new closeindexrequest("document_index");
acknowledgeresponse closeresponse = client.indices()
.close(closeindexrequest, requestoptions.default);
if (closeresponse.isacknowledged()) {
    system.out.println("索引关闭成功");
} else {
    system.out.println("索引关闭失败");
}

(四)打开索引

打开 elasticsearch(es)索引是一种操作,可以将先前关闭的索引重新设置为可用状态,以便进行搜索和写入操作。要打开 elasticsearch 索引,可以使用以下常规dsl语句:

post /my_index/_open

在上述示例中,post 是 http 请求方法,/my_index/_open 是要打开的索引的路径。这个dsl语句会告诉 elasticsearch 打开名为 my_index 的索引。

假设您运营一个文档管理系统,使用 elasticsearch 存储文档索引。有时,可能需要重新打开以前关闭的索引,以便用户可以再次访问和搜索文档。要重新打开名为 document_index 的文档索引,可以使用以下dsl语句:

post /document_index/_open

对应java代码可写为:

openindexrequest openindexrequest = new openindexrequest("document_index");
openindexresponse openresponse = client.indices()
.open(openindexrequest, requestoptions.default);
if (openresponse.isacknowledged()) {
    system.out.println("索引打开成功");
} else {
    system.out.println("索引打开失败");
}

这个示例适用于文档管理系统,如果先前关闭的文档索引需要再次被用户访问和搜索,那么重新打开索引是一个有效的操作。这可以用于重新激活不再频繁使用但仍然有价值的索引。

总之,重新打开 elasticsearch 索引是一种管理索引可用性的操作,可用于恢复先前关闭的索引以进行搜索和写入操作。根据具体需求,可以使用dsl或 elasticsearch 客户端库来执行此操作。请注意,重新打开索引后,用户可以再次对其执行搜索和写入操作。

(五)索引别名

elasticsearch索引别名是一项强大的功能,用于管理索引的命名别称,以提供更灵活的索引管理和查询。

用法分析

注意事项

总之,索引别名是 elasticsearch 灵活索引管理的有力工具,但需要仔细规划和使用。它们可以用于索引版本控制、查询优化和索引维护,但需要谨慎管理以确保正确性和性能。

应用案例举例和具体案例展示

案例举例-版本控制:

案例举例-多索引查询:

案例举例-索引分割与归档:

案例举例索引切换:

这些案例说明了索引别名在处理数据版本控制、查询优化、数据分割与归档以及索引切换方面的实际应用。通过巧妙使用别名,可以更灵活地管理和操作您的 elasticsearch 索引,同时确保数据的可用性和性能。

选择上面提到的 "版本控制" 案例,并进行具体的展示和分析步骤。这个案例涉及使用索引别名进行索引版本控制,允许平滑地更新索引结构而不中断用户查询。

背景:假设我们运营一个博客平台,使用 elasticsearch 来存储博客文章。需要定期更新博客文章的结构,例如,添加新字段或更改映射。同时希望用户可以持续访问其旧的博客文章,并逐渐迁移到新的文章结构。

第一步:创建初始索引和别名

创建初始的博客索引,例如 blog_posts_v1

put /blog_posts_v1
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      },
      "content": {
        "type": "text"
      },
      "date_published": {
        "type": "date"
      }
    }
  }
}

创建一个别名 blog_posts,将其指向初始的博客索引。

post /_aliases
{
  "actions": [
    {
      "add": {
        "index": "blog_posts_v1",
        "alias": "blog_posts"
      }
    }
  ]
}

第二步:定期更新索引结构。当需要更新索引结构时,创建一个新的博客索引,例如 blog_posts_v2,并更新映射。

put /blog_posts_v2
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      },
      "content": {
        "type": "text"
      },
      "date_published": {
        "type": "date"
      },
      "author": {
        "type": "keyword"
      }
    }
  }
}

第三步:切换别名。一旦新的博客索引 blog_posts_v2 准备就绪,使用别名切换将别名 blog_posts 从旧索引 blog_posts_v1 切换到新索引 blog_posts_v2

post /_aliases
{
  "actions": [
    {
      "remove": {
        "index": "blog_posts_v1",
        "alias": "blog_posts"
      }
    },
    {
      "add": {
        "index": "blog_posts_v2",
        "alias": "blog_posts"
      }
    }
  ]
}

第四步:用户迁移。用户可以继续访问和查询博客文章,而无需更改他们的查询代码。新的博客文章将写入新的索引 blog_posts_v2,而旧的博客文章仍然可查询。

第五步:清理旧索引。定期清理旧的博客索引(例如,blog_posts_v1),或者在不再需要它们时进行归档或删除。

这个案例说明了如何使用索引别名在更新索引结构时,平滑地迁移用户到新的索引版本,同时保持查询的连续性。索引别名是实现版本控制和索引维护的有力工具。

二、映射操作

在 elasticsearch 中,映射(mapping)是用来定义如何存储和索引文档中字段的方式的重要概念。映射操作用于指定字段的数据类型、分析器以及其他属性,以便 elasticsearch 能够正确地处理和查询文档中的数据。

映射是 elasticsearch 中的元数据,它描述了索引中每个字段的数据类型、如何被索引以及如何存储。它允许 elasticsearch 理解和处理文档中的数据。

映射的主要元素

映射对于正确索引和查询文档非常重要。如果映射不正确,将导致搜索和分析错误。正确的映射可以优化查询性能,使 elasticsearch 能够更好地理解和处理文档数据。一旦索引创建后,通常不能直接更改映射。但可以通过重新索引数据或创建新索引来应用新的映射

映射的注意事项

总之,映射是 elasticsearch 中用于定义和管理索引字段的关键操作。正确的映射设计可以提高查询性能和数据质量,而不正确的映射可能会导致问题。在设计和管理索引时,请谨慎考虑映射的使用和更改。

(一)查看映射

在 elasticsearch 中,可以使用映射操作查看索引的映射信息。要查看索引的映射,可以使用以下常规dsl语句:

get /my_index/_mapping

在上述示例中,get 是 http 请求方法,/my_index/_mapping 是要查看映射的索引名称。

假设运营一个电子商务网站,使用 elasticsearch 来存储产品信息。电子商务网站存储产品信息的 elasticsearch 索引名为 products,该索引包含产品的名称、价格、描述等信息。使用以下dsl语句来查看产品索引 products 的映射:

get /products/_mapping

使用以下dsl请求 get /products/_mapping 会返回关于索引 products 的映射信息。返回结果将是一个json格式的响应,其中包含有关索引中字段的详细信息。以下是对返回结果的分析说明:

{
  "products": {
    "mappings": {
      "properties": {
        "name": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "price": {
          "type": "float"
        },
        "description": {
          "type": "text"
        },
        // 其他字段...
      }
    }
  }
}

(二)扩展映射

在 elasticsearch 中,扩展映射(mapping expansion)是一项操作,用于在已有的索引映射基础上添加新的字段或修改已有字段的属性。这可以用于动态地适应数据模型的变化或为索引中的字段添加新功能。以下是有关扩展映射的分析:

扩展映射的使用场景

扩展映射的操作步骤

注意事项和考虑因素

总之,扩展映射是 elasticsearch 中用于适应数据模型变化和引入新属性的重要操作。它提供了灵活性,允许根据应用程序需求不断发展和扩展索引映射。在执行扩展映射操作时,请谨慎规划和测试,以确保数据的完整性和性能。

业务举例:扩展映射以添加作者和标签字段

假设运营一个在线新闻门户网站,使用 elasticsearch 来存储新闻文章的索引。最初的索引只包含文章的标题、内容和发布日期。现在,我们决定扩展映射,以添加新的字段以存储文章的作者和标签。新闻门户网站使用 elasticsearch 索引 news_articles 来存储新闻文章。最初的映射定义如下:

{
  "news_articles": {
    "mappings": {
      "properties": {
        "title": {
          "type": "text"
        },
        "content": {
          "type": "text"
        },
        "publish_date": {
          "type": "date"
        }
      }
    }
  }
}

现在,决定扩展映射,以包括文章的作者和标签信息。

第一步:创建新映射。需要创建新的映射,以包括作者和标签字段。新映射如下所示:

{
  "news_articles": {
    "mappings": {
      "properties": {
        "title": {
          "type": "text"
        },
        "content": {
          "type": "text"
        },
        "publish_date": {
          "type": "date"
        },
        "author": {
          "type": "text"
        },
        "tags": {
          "type": "keyword"
        }
      }
    }
  }
}

在新映射中,我们添加了两个新字段:authortags,分别用于存储文章的作者名字和标签(以关键字类型存储)。

第二步:将新映射添加到索引。为了将新映射添加到现有索引中,可以执行以下步骤:

第三步:测试和验证。在应用新映射之前,进行测试和验证以确保查询和索引操作按预期工作。确保新字段的数据存储和检索都正确无误。

(三)基本的数据类型

keyword类型

在 elasticsearch 映射操作中,keyword 类型是一种常用的基本数据类型,用于存储关键字数据。与 text 类型不同,keyword 类型不进行分词,它将整个文本视为单个词条。这使得 keyword 类型非常适合用于排序、聚合和精确匹配等操作

假设您正在使用 elasticsearch 存储产品信息,并且每个产品都有一个标签列表,希望能够按照标签进行精确匹配和排序。

创建一个索引映射,包括一个 keyword 类型的字段来存储产品标签。

put /products
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "tags": {
        "type": "keyword"
      }
    }
  }
}

向索引中添加一些产品文档,包括标签信息。

post /products/_doc/1
{
  "name": "product a",
  "tags": ["electronics", "smartphone"]
}

post /products/_doc/2
{
  "name": "product b",
  "tags": ["clothing", "shoes"]
}

执行一个精确匹配的查询,查找包含特定标签的产品。

get /products/_search
{
  "query": {
    "match": {
      "tags": "electronics"
    }
  }
}

此查询将返回包含 "electronics" 标签的产品,而不会返回包含 "smartphone" 标签的产品。

执行一个排序查询,按标签字段的字母顺序对产品进行排序。

get /products/_search
{
  "sort": [
    {
      "tags": "asc"
    }
  ]
}

此查询将返回产品按标签字段的字母顺序升序排列。

通过使用 keyword 类型来存储标签信息,可以轻松地进行精确匹配和排序,同时保留了标签的原始完整性。这在许多应用中非常有用,特别是在需要处理结构化数据的情况下。

text类型

在 elasticsearch 映射操作中,text 类型是一种常用的基本数据类型,用于存储文本数据,通常用于全文搜索和分析

假设正在使用 elasticsearch 存储产品评论,希望能够搜索和分析评论内容。创建一个索引映射,包括一个 text 类型的字段来存储评论内容。

put /product_reviews
{
  "mappings": {
    "properties": {
      "product_name": {
        "type": "keyword"
      },
      "comment": {
        "type": "text"
      }
    }
  }
}

向索引中添加一些产品评论文档。

post /product_reviews/_doc/1
{
  "product_name": "product a",
  "comment": "this product is amazing! i love it."
}

post /product_reviews/_doc/2
{
  "product_name": "product b",
  "comment": "not satisfied with this product. it doesn't meet my expectations."
}

执行一个全文搜索的查询,查找包含特定关键字的评论。

get /product_reviews/_search
{
  "query": {
    "match": {
      "comment": "amazing"
    }
  }
}

此查询将返回包含 "amazing" 关键字的评论。

执行一个分析查询,使用分析功能评分。

get /product_reviews/_search
{
  "query": {
    "match_phrase": {
      "comment": "product satisfaction"
    }
  },
  "sort": [
    "_score" // 根据相关性评分排序
  ]
}

此查询将返回包含 "product satisfaction" 短语的评论,并且可以根据相关性进行排序。

{
  "took": 15,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 2,
      "relation": "eq"
    },
    "max_score": 1.2345678, // 最高评分
    "hits": [
      {
        "_index": "product_reviews",
        "_type": "_doc",
        "_id": "3",
        "_score": 1.2345678, // 文档的评分
        "_source": {
          "product_name": "product c",
          "comment": "i have found great product satisfaction with this item."
        }
      },
      {
        "_index": "product_reviews",
        "_type": "_doc",
        "_id": "4",
        "_score": 0.9876543, // 文档的评分
        "_source": {
          "product_name": "product d",
          "comment": "product satisfaction is important for me."
        }
      }
    ]
  }
}

通过使用 text 类型来存储评论内容,可以进行全文搜索和分析,以更好地理解用户的反馈和需求。这对于处理文本数据的应用场景非常有用,例如产品评论、新闻文章、博客内容等。

数值类型

在 elasticsearch 映射操作中,数值类型用于存储数值数据,这些数据通常包括整数和浮点数。数值类型非常适用于执行范围查询、聚合操作和数值计算。主要数值类型如下:

  1. integer:用于存储整数值。适用于存储没有小数部分的整数。

  2. long:用于存储长整数值。通常用于存储较大范围的整数。

  3. float:用于存储单精度浮点数值。

  4. double:用于存储双精度浮点数值。通常用于存储高精度的浮点数。

这些数值类型用于存储不同范围和精度的数值数据,以支持各种数值计算和分析需求。

假设正在使用 elasticsearch 存储销售数据,其中包括产品的价格(浮点数)和销售数量(整数)。创建一个名为 "sales" 的索引,其中包括了价格(price)和销售数量(quantity)字段:

put /sales
{
  "mappings": {
    "properties": {
      "price": {
        "type": "float"
      },
      "quantity": {
        "type": "integer"
      }
    }
  }
}

插入了两个产品的销售数据:

post /sales/_doc/1
{
  "price": 75.99,
  "quantity": 15
}

post /sales/_doc/2
{
  "price": 95.50,
  "quantity": 20
}

假设希望查找价格在 50 到 100 之间且销售数量大于等于 10 的产品。

get /sales/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "price": {
              "gte": 50,
              "lte": 100
            }
          }
        },
        {
          "range": {
            "quantity": {
              "gte": 10
            }
          }
        }
      ]
    }
  }
}

返回结果将包含与查询条件匹配的文档。

{
  "took": 10,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 2,
      "relation": "eq"
    },
    "max_score": 1.0,
    "hits": [
      {
        "_index": "sales",
        "_type": "_doc",
        "_id": "1",
        "_score": 1.0,
        "_source": {
          "product_name": "product a",
          "price": 75.99,
          "quantity": 15
        }
      },
      {
        "_index": "sales",
        "_type": "_doc",
        "_id": "2",
        "_score": 1.0,
        "_source": {
          "product_name": "product b",
          "price": 95.50,
          "quantity": 20
        }
      }
    ]
  }
}

分析说明:

这个示例演示了如何使用数值类型进行范围查询,以查找满足特定条件的文档。数值类型非常适用于存储和查询数值数据,对于分析、统计和报告等用途非常有用。

布尔类型

在 elasticsearch 映射操作中,布尔类型(boolean)是一种基本的数据类型,用于存储布尔值,即 true 或 false。布尔类型通常用于存储表示真假条件的信息,例如是否已完成、是否可用等

假设正在使用 elasticsearch 存储任务列表,并希望标识哪些任务已完成(true)和哪些任务未完成(false)。使用 put 请求创建一个索引(index),并指定索引映射(mapping)。在此示例中,我们创建一个名为 "tasks" 的索引,并定义了两个字段:任务名称(task_name)和是否已完成(is_completed)。

put /tasks
{
  "mappings": {
    "properties": {
      "task_name": {
        "type": "text"
      },
      "is_completed": {
        "type": "boolean"
      }
    }
  }
}

插入一些示例任务数据的请求:

post /tasks/_doc/1
{
  "task_name": "task a",
  "is_completed": true
}

post /tasks/_doc/2
{
  "task_name": "task b",
  "is_completed": false
}

post /tasks/_doc/3
{
  "task_name": "task c",
  "is_completed": true
}

假设要查询所有已完成的任务:

get /tasks/_search
{
  "query": {
    "term": {
      "is_completed": true
    }
  }
}

返回结果将包含已完成的任务文档:

{
  "took": 5,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 3,
      "relation": "eq"
    },
    "max_score": 1.0,
    "hits": [
      {
        "_index": "tasks",
        "_type": "_doc",
        "_id": "1",
        "_score": 1.0,
        "_source": {
          "task_name": "task a",
          "is_completed": true
        }
      },
      {
        "_index": "tasks",
        "_type": "_doc",
        "_id": "3",
        "_score": 1.0,
        "_source": {
          "task_name": "task c",
          "is_completed": true
        }
      }
    ]
  }
}

这个示例演示了如何使用布尔类型字段来标识和查询已完成的任务。布尔类型在存储和查询表示真假条件的信息时非常有用,例如任务状态、商品可用性等。通过这种方式,可以有效地管理和查询布尔值数据。

日期类型

在 elasticsearch 映射操作中,日期类型(date)是一种基本的数据类型,用于存储日期和时间信息。日期类型通常用于记录事件发生的时间戳或日期值。

假设您正在使用 elasticsearch 存储新闻文章,并希望记录每篇文章的发布日期。使用 put 请求创建一个索引(index),并指定索引映射(mapping)。在此示例中,我们创建一个名为 "news_articles" 的索引,并定义了两个字段:新闻标题(headline)和发布日期(publish_date)。

put /news_articles
{
  "mappings": {
    "properties": {
      "headline": {
        "type": "text"
      },
      "publish_date": {
        "type": "date"
      }
    }
  }
}

插入一些示例新闻文章数据的请求:

post /news_articles/_doc/1
{
  "headline": "elasticsearch 8.0 released",
  "publish_date": "2023-04-15t10:30:00z"
}

post /news_articles/_doc/2
{
  "headline": "big data summit 2023 recap",
  "publish_date": "2023-07-20t14:45:00z"
}

post /news_articles/_doc/3
{
  "headline": "ai advances in healthcare",
  "publish_date": "2023-11-10t08:15:00z"
}

假设您要查询所有发布日期在特定时间段内的文章:

get /news_articles/_search
{
  "query": {
    "range": {
      "publish_date": {
        "gte": "2023-01-01t00:00:00z",
        "lte": "2023-12-31t23:59:59z"
      }
    }
  }
}

返回结果将包含发布日期在指定时间段内的文章:

{
  "took": 5,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 3,
      "relation": "eq"
    },
    "max_score": 1.0,
    "hits": [
      {
        "_index": "news_articles",
        "_type": "_doc",
        "_id": "1",
        "_score": 1.0,
        "_source": {
          "headline": "article a",
          "publish_date": "2023-04-15t10:30:00z"
        }
      },
      {
        "_index": "news_articles",
        "_type": "_doc",
        "_id": "2",
        "_score": 1.0,
        "_source": {
          "headline": "article b",
          "publish_date": "2023-07-20t14:45:00z"
        }
      },
      {
        "_index": "news_articles",
        "_type": "_doc",
        "_id": "3",
        "_score": 1.0,
        "_source": {
          "headline": "article c",
          "publish_date": "2023-11-10t08:15:00z"
        }
      }
    ]
  }
}

这个示例演示了如何使用日期类型字段来存储和查询日期信息。日期类型在存储和分析与时间相关的数据时非常有用,例如新闻发布日期、事件发生时间等。通过这种方式,可以轻松地执行日期范围过滤和聚合操作,以满足各种时间相关的查询需求。

(四)复杂数据类型

数组类型

在 elasticsearch 映射操作中,数组类型用于存储多个值的集合,这些值可以是相同类型的,也可以是不同类型的。数组类型通常用于表示复杂的多值字段,例如标签、评论、作者列表等

假设您正在使用 elasticsearch 存储图书信息,每本书可以有多个作者。使用 put 请求创建一个索引(index),并指定索引映射(mapping)。在此示例中,我们创建一个名为 "books" 的索引,并定义了两个字段:书名(title)和作者列表(authors)。

put /books
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      },
      "authors": {
        "type": "keyword"
      }
    }
  }
}

插入一些示例图书数据的请求:

post /books/_doc/1
{
  "title": "book a",
  "authors": ["john smith", "alice johnson"]
}

post /books/_doc/2
{
  "title": "book b",
  "authors": ["john smith", "david williams"]
}

post /books/_doc/3
{
  "title": "book c",
  "authors": ["alice johnson", "emily davis"]
}

假设要查询包含作者 "john smith" 的书籍:

get /books/_search
{
  "query": {
    "match": {
      "authors": "john smith"
    }
  }
}

返回结果将包含包含 "john smith" 作为作者的书籍:

{
  "took": 7,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 2,
      "relation": "eq"
    },
    "max_score": 1.0,
    "hits": [
      {
        "_index": "books",
        "_type": "_doc",
        "_id": "1",
        "_score": 1.0,
        "_source": {
          "title": "book a",
          "authors": ["john smith", "alice johnson"]
        }
      },
      {
        "_index": "books",
        "_type": "_doc",
        "_id": "2",
        "_score": 1.0,
        "_source": {
          "title": "book b",
          "authors": ["john smith", "david williams"]
        }
      }
    ]
  }
}

这个示例演示了如何使用数组类型字段来存储和查询多个值的集合。数组类型非常适用于表示多值属性,例如多个作者、标签或评论。通过这种方式,可以轻松地查询包含特定值的文档,以满足各种多值属性的查询需求。

对象类型

在 elasticsearch 映射操作中,对象类型(object)是一种复杂的数据类型,用于存储嵌套的结构化数据。对象类型允许将多个字段组合到一个单独的对象中,这些字段可以是不同类型的,形成了文档内的嵌套结构。

假设您正在使用 elasticsearch 存储个人信息,其中每个文档表示一个人,包括姓名(name)、地址(address)、联系信息(contact)等。

put /people
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "address": {
        "type": "object",
        "properties": {
          "city": {
            "type": "text"
          },
          "state": {
            "type": "keyword"
          }
        }
      },
      "contact": {
        "type": "object",
        "properties": {
          "email": {
            "type": "text"
          },
          "phone": {
            "type": "text"
          }
        }
      }
    }
  }
}

插入一些示例数据的请求:

post /people/_doc/1
{
  "name": "alice johnson",
  "address": {
    "city": "new york",
    "state": "ny"
  },
  "contact": {
    "email": "alice@example.com",
    "phone": "555-1234"
  }
}

post /people/_doc/2
{
  "name": "bob smith",
  "address": {
    "city": "los angeles",
    "state": "ca"
  },
  "contact": {
    "email": "bob@example.com",
    "phone": "555-5678"
  }
}

假设您要查询所有居住在特定城市的人:

get /people/_search
{
  "query": {
    "match": {
      "address.city": "new york"
    }
  }
}

返回结果将包含居住在纽约的人的文档:

{
  "took": 5,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 2,
      "relation": "eq"
    },
    "max_score": 1.0,
    "hits": [
      {
        "_index": "people",
        "_type": "_doc",
        "_id": "1",
        "_score": 1.0,
        "_source": {
          "name": "alice johnson",
          "address": {
            "city": "new york",
            "state": "ny"
          },
          "contact": {
            "email": "alice@example.com",
            "phone": "555-1234"
          }
        }
      },
      {
        "_index": "people",
        "_type": "_doc",
        "_id": "2",
        "_score": 1.0,
        "_source": {
          "name": "bob smith",
          "address": {
            "city": "new york",
            "state": "ny"
          },
          "contact": {
            "email": "bob@example.com",
            "phone": "555-5678"
          }
        }
      }
    ]
  }
}

这个示例演示了如何使用对象类型字段来存储和查询嵌套的结构化数据。对象类型非常适用于表示层次结构的数据,例如个人信息、产品属性、订单项目等。通过这种方式,可以轻松地访问和操作嵌套的数据,以满足各种复杂数据结构的存储和查询需求。

地理类型

在 elasticsearch 映射操作中,地理类型(geo)用于存储地理位置信息,如经度和纬度坐标。这种类型允许索引和查询地理位置数据,以便执行空间分析和地理搜索。

假设您正在使用 elasticsearch 存储餐厅信息,每个餐厅都有一个地理坐标,希望能够查询距离特定位置一定距离范围内的餐厅。创建一个名为 "restaurants" 的索引,其中包含了餐厅名称(name)和地理坐标(location)。

put /restaurants
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "location": {
        "type": "geo_point"
      }
    }
  }
}

插入一些示例餐厅数据的请求:

post /restaurants/_doc/1
{
  "name": "restaurant a",
  "location": {
    "lat": 40.7120,
    "lon": -74.0050
  }
}

post /restaurants/_doc/2
{
  "name": "restaurant b",
  "location": {
    "lat": 40.7130,
    "lon": -74.0070
  }
}

post /restaurants/_doc/3
{
  "name": "restaurant c",
  "location": {
    "lat": 40.7110,
    "lon": -74.0080
  }
}

假设要查找距离纽约市中心(40.7128, -74.0060)10公里以内的餐厅。

get /restaurants/_search
{
  "query": {
    "bool": {
      "filter": {
        "geo_distance": {
          "distance": "10km",
          "location": {
            "lat": 40.7128,
            "lon": -74.0060
          }
        }
      }
    }
  }
}

返回结果将包含距离纽约市中心10公里以内的餐厅。

{
  "took": 12,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 3,
      "relation": "eq"
    },
    "max_score": 1.0,
    "hits": [
      {
        "_index": "restaurants",
        "_type": "_doc",
        "_id": "1",
        "_score": 1.0,
        "_source": {
          "name": "restaurant a",
          "location": {
            "lat": 40.7120,
            "lon": -74.0050
          }
        }
      },
      {
        "_index": "restaurants",
        "_type": "_doc",
        "_id": "2",
        "_score": 1.0,
        "_source": {
          "name": "restaurant b",
          "location": {
            "lat": 40.7130,
            "lon": -74.0070
          }
        }
      },
      {
        "_index": "restaurants",
        "_type": "_doc",
        "_id": "3",
        "_score": 1.0,
        "_source": {
          "name": "restaurant c",
          "location": {
            "lat": 40.7110,
            "lon": -74.0080
          }
        }
      }
    ]
  }
}

这个示例演示了如何使用地理类型字段来存储和查询地理位置信息。地理类型非常适用于处理地理空间数据,如地点搜索、附近搜索和地理分析等需求。通过这种方式,可以轻松地执行地理空间查询和分析,以满足各种地理位置相关的查询需求。

(五)动态映射

动态映射(dynamic mapping)是 elasticsearch 中的一项功能,允许自动检测和创建索引映射,无需手动定义字段的数据类型和属性。当索引文档时,elasticsearch 根据文档内容自动创建映射,包括字段的数据类型、分析器、索引选项等。这使得索引的管理更加灵活,特别适用于处理不断变化的数据和不确定的数据结构。

以下是常见的 json 数据类型和 elasticsearch 索引类型的对应表:

json 数据类型:字符串(string)

json 数据类型:整数(integer)

json 数据类型:浮点数(float/double)

json 数据类型:布尔值(boolean)

json 数据类型:日期和时间(date/time)

json 数据类型:数组(array)

json 数据类型:对象(object)

json 数据类型:地理坐标(geospatial coordinates)

这个对应表展示了常见的 json 数据类型与 elasticsearch 索引类型之间的映射关系。当索引文档时,elasticsearch 会根据文档的字段内容自动选择合适的数据类型。如果需要更精细的控制,可以通过显式映射来定义字段的数据类型和属性。动态映射为 elasticsearch 提供了灵活性,使其适应各种数据结构和用例。

(六)多字段

在 elasticsearch 中,多字段(multi-field)是一种索引映射策略,用于将一个字段存储在多个不同的子字段中,每个子字段可以具有不同的数据类型或分析器。多字段的引入允许在一个字段上执行多种操作,例如全文搜索、精确匹配、聚合等,同时保留原始数据的不同表示形式。

多字段的特点和用途

多字段示例

假设有一个名为 "product" 的索引,其中包含了产品名称(product_name)字段。希望能够在同一字段上执行全文搜索和精确匹配。以下是使用多字段的示例映射:

put /product
{
  "mappings": {
    "properties": {
      "product_name": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

在上述映射中,我们定义了一个 product_name 字段,并在该字段下创建了一个子字段 keyword,它具有 keyword 数据类型。这个子字段将用于精确匹配。

多字段的用法示例-全文搜索:要执行全文搜索,可以使用原始字段 product_name。例如:

get /product/_search
{
  "query": {
    "match": {
      "product_name": "elasticsearch"
    }
  }
}

多字段的用法示例-精确匹配:要执行精确匹配,可以使用子字段 product_name.keyword。例如:

get /product/_search
{
  "query": {
    "term": {
      "product_name.keyword": "elasticsearch"
    }
  }
}

在此示例中,我们分别使用原始字段和子字段执行不同类型的查询。

多字段的引入使得索引中的字段可以灵活地适应各种查询需求,同时保持原始数据的完整性。这在处理多样性的数据和不同的查询场景时非常有用。

三、总结

在本文中,我们深入探讨了 elasticsearch 中索引与映射的基本概念及其重要性。通过详细的操作示例,我们了解了如何创建、更新和删除索引,以及如何定义和修改映射,以优化数据存储和查询性能。这些操作不仅是数据管理的基础,也是实现高效搜索和分析的关键。

索引和映射的管理对于确保数据的一致性、可用性和快速检索至关重要。我们强调了使用合适的数据类型、设置合理的字段属性以及根据业务需求进行动态映射调整的重要性。此外,掌握索引生命周期管理(ilm)和使用合适的分析器也是提升 elasticsearch 性能的有效方法。

通过本文的介绍和示例,希望读者能够更好地理解 elasticsearch 的索引与映射操作,从而在实际应用中实现数据的高效管理和灵活检索。未来,随着数据规模的不断增长和应用场景的多样化,深入掌握这些技术将为数据分析师和开发者带来更多的优势和机遇。

到此这篇关于elasticsearch 的索引管理与映射配置实战的文章就介绍到这了,更多相关elasticsearch索引映射配置内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

虚拟机CentOS 9网络配置全过程

11-07

Vmware虚拟机配置CentOS 7网络实例

11-07

小艺帮帮忙正式登场! 华为鸿蒙 HarmonyOS 6.0.0.110 SP8 全面推送

11-04

服务器获取Jar包运行目录实现方式

11-18

C盘留多少空间比较好很多人都分错了! 电脑C盘容量分配保姆级攻略

11-03

电脑如何扩容c盘分区? 2种扩容C盘的分区方法

11-03

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论