面试题答案
一键面试对数据存储和搜索功能的影响
- 数据存储:
- text类型:text类型在存储时会对文本进行分词处理,将文本拆分成一个个单词(term),并存储这些单词的倒排索引。这种方式占用存储空间相对较多,因为每个单词及其位置等信息都需要存储。
- keyword类型:keyword类型不会对数据进行分词,而是将整个字段内容作为一个整体进行存储,占用空间相对较小,尤其是对于短文本。
- 搜索功能:
- text类型:适合全文搜索场景,能实现模糊匹配、语义搜索等功能。例如,可以搜索包含某个单词的文档。因为它存储的是分词后的结果,搜索时会根据分词后的倒排索引进行查找。
- keyword类型:适合精确匹配场景,如ID、类别等字段。搜索时会直接对比整个字段内容,只有完全匹配才会返回结果,不支持模糊匹配(除非使用通配符等特殊语法,但性能较差)。
在不丢失原有数据的情况下完成类型转换方法
- 使用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" } }
- 最后,更新应用程序的配置,将索引的使用从旧索引切换到新索引,并删除旧索引。
- 使用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完成数据迁移和类型转换,然后更新应用程序使用新索引,并删除旧索引。