MST

星途 面试题库

面试题:ElasticSearch建立索引时如何优化字段映射以提高搜索性能

在ElasticSearch中建立索引,假设我们有一个包含多种数据类型(如文本、数字、日期)的文档,描述一下如何合理设置字段映射,例如哪些字段应该设置为keyword类型,哪些设置为text类型,以及如何通过这种设置来优化搜索性能。
41.9万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试

文本类型字段

  1. text类型
    • 适用场景:对于需要进行全文搜索的长文本字段,如文章内容、产品描述等,应设置为text类型。例如,一篇博客文章的正文部分,用户可能会搜索其中的某些关键词,text类型会对文本进行分词处理,建立倒排索引,从而实现高效的全文检索。
    • 示例
{
    "mappings": {
        "properties": {
            "article_content": {
                "type": "text"
            }
        }
    }
}
  1. keyword类型
    • 适用场景:当字段用于精确匹配、排序、聚合等操作时,设置为keyword类型。比如产品的SKU(库存保有单位)、用户的ID、文章的分类标签(如果分类标签数量有限且固定)等。这些字段不需要分词,直接以完整的字符串形式进行存储和检索。
    • 示例
{
    "mappings": {
        "properties": {
            "product_sku": {
                "type": "keyword"
            },
            "user_id": {
                "type": "keyword"
            },
            "article_category": {
                "type": "keyword"
            }
        }
    }
}

数字类型字段

对于数字类型字段,如产品价格、用户年龄等,应设置为合适的数字类型,如long(长整型,适用于较大整数)、integer(整型)、float(单精度浮点数)、double(双精度浮点数)等。这不仅可以准确存储数据,还能在进行数值范围查询、聚合计算(如求平均值、总和等)时提供高效支持。

  • 示例
{
    "mappings": {
        "properties": {
            "product_price": {
                "type": "float"
            },
            "user_age": {
                "type": "integer"
            }
        }
    }
}

日期类型字段

日期类型字段,如文章发布时间、订单创建时间等,应设置为date类型。可以通过format参数指定日期格式,以确保日期数据的正确存储和检索。常见的日期格式有yyyy - MM - ddyyyy - MM - dd HH:mm:ss等。

  • 示例
{
    "mappings": {
        "properties": {
            "article_publish_date": {
                "type": "date",
                "format": "yyyy - MM - dd"
            },
            "order_create_date": {
                "type": "date",
                "format": "yyyy - MM - dd HH:mm:ss"
            }
        }
    }
}

优化搜索性能

  1. 减少不必要的分词:对于不需要全文搜索的字段设置为keyword类型,避免分词带来的性能开销,同时能加快精确匹配的速度。
  2. 合理使用字段数据类型:正确选择数字和日期类型,可提高数值和日期相关操作的效率。例如,使用整数类型存储年龄比使用字符串类型在查询和聚合时更高效。
  3. 多字段设置:有时候可以对一个字段同时设置textkeyword类型,以满足全文搜索和精确匹配等多种需求。例如:
{
    "mappings": {
        "properties": {
            "article_title": {
                "type": "text",
                "fields": {
                    "keyword": {
                        "type": "keyword"
                    }
                }
            }
        }
    }
}

这样article_title字段既可以用于全文搜索,其keyword子字段又可用于精确匹配和排序等操作。