MST

星途 面试题库

面试题:ElasticSearch映射数据类型转换及对搜索的影响

在ElasticSearch中,如果将原本定义为text类型的字段修改为keyword类型,这会对数据存储和搜索功能产生哪些影响?如何在不丢失原有数据的情况下完成这种类型转换?
19.6万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试

对数据存储和搜索功能的影响

  1. 数据存储
    • text类型:text类型在存储时会对文本进行分词处理,将文本拆分成一个个单词(term),并存储这些单词的倒排索引。这种方式占用存储空间相对较多,因为每个单词及其位置等信息都需要存储。
    • keyword类型:keyword类型不会对数据进行分词,而是将整个字段内容作为一个整体进行存储,占用空间相对较小,尤其是对于短文本。
  2. 搜索功能
    • text类型:适合全文搜索场景,能实现模糊匹配、语义搜索等功能。例如,可以搜索包含某个单词的文档。因为它存储的是分词后的结果,搜索时会根据分词后的倒排索引进行查找。
    • keyword类型:适合精确匹配场景,如ID、类别等字段。搜索时会直接对比整个字段内容,只有完全匹配才会返回结果,不支持模糊匹配(除非使用通配符等特殊语法,但性能较差)。

在不丢失原有数据的情况下完成类型转换方法

  1. 使用Reindex API
    • 首先,创建一个新的索引,并在映射中把需要转换的字段定义为keyword类型。例如:
    PUT new_index
    {
      "mappings": {
        "properties": {
          "your_field": {
            "type": "keyword"
          }
        }
      }
    }
    
    • 然后,使用Reindex API将旧索引的数据复制到新索引中,同时将字段值转换为keyword类型。例如:
    POST _reindex
    {
      "source": {
        "index": "old_index"
      },
      "dest": {
        "index": "new_index"
      }
    }
    
    • 最后,更新应用程序的配置,将索引的使用从旧索引切换到新索引,并删除旧索引。
  2. 使用Logstash
    • 配置Logstash,从Elasticsearch读取旧索引的数据。例如:
    input {
      elasticsearch {
        hosts => ["localhost:9200"]
        index => "old_index"
      }
    }
    
    • 在filter阶段,对需要转换类型的字段进行处理,例如:
    filter {
      mutate {
        convert => { "your_field" => "string" }
      }
    }
    
    • 在output阶段,将数据输出到新的Elasticsearch索引中,新索引中字段类型为keyword。例如:
    output {
      elasticsearch {
        hosts => ["localhost:9200"]
        index => "new_index"
      }
    }
    
    • 启动Logstash完成数据迁移和类型转换,然后更新应用程序使用新索引,并删除旧索引。