面试题答案
一键面试索引字段优化
- 选择合适的字段:
- 思路:仅对真正需要搜索的关键信息字段建立索引,避免对无关紧要的字段创建索引,减少索引构建和维护成本,提升搜索性能。
- 配置项:在索引创建配置文件(如 Elasticsearch 的 mapping 文件)中,明确指定需要建立索引的字段。例如,对于一个新闻文档索引,仅对标题、正文等重要字段设置
index: true
,对一些辅助信息字段(如文章编号等)可不设置索引。
- 字段类型匹配:
- 思路:确保索引字段类型与数据实际类型相符,不同的数据类型在索引构建和搜索算法上有所差异,正确的类型匹配能提高搜索效率。
- 配置项:在索引配置中指定正确的字段类型。如在 Elasticsearch 中,对于文本类型字段使用
text
类型,并可设置analyzer
进行合适的文本分析;对于数值类型字段,使用long
、integer
、float
等相应数值类型。
分词器优化
- 选择合适的分词器:
- 思路:根据文档语言和内容特点,选择合适的分词器,将文本正确切分成有意义的词汇单元,以提高搜索的召回率和准确率。
- 配置项:在索引配置中设置分词器。例如在 Elasticsearch 中,对于中文文本可选择
ik_max_word
等中文分词器;对于英文文本可使用默认的standard
分词器或更适合特定场景的snowball
分词器等。在 mapping 中通过analyzer
字段指定分词器,如"title": {"type": "text", "analyzer": "ik_max_word"}
。
- 自定义分词规则:
- 思路:如果默认分词器无法满足业务需求,可自定义分词规则,对特定词汇、短语等进行特殊处理。
- 配置项:在 Elasticsearch 中,可以通过创建自定义分词器来实现。例如定义一个
char_filter
用于处理特殊字符,一个tokenizer
用于切分文本,以及filter
用于对切分后的词汇进行进一步处理,然后在索引 mapping 中使用自定义的分词器。
索引结构优化
- 索引分片与副本:
- 思路:合理调整索引的分片数和副本数。分片数决定了索引数据在集群节点间的分布,适当增加分片可提高索引的并行处理能力,但过多分片会增加管理开销;副本数用于数据冗余和提高读取性能,但过多副本会占用更多存储资源。
- 配置项:在 Elasticsearch 中创建索引时可指定分片数和副本数。例如,
PUT /my_index?pretty
,请求体中设置"settings": {"number_of_shards": 3, "number_of_replicas": 1}
,可根据集群规模、数据量和读写负载来动态调整这些值。
- 索引合并策略:
- 思路:调整索引合并策略,索引在写入过程中会产生多个小的段文件,合并这些段文件可以减少文件数量,提高搜索性能,但合并操作本身也会消耗资源,需平衡合并频率和性能。
- 配置项:在 Elasticsearch 中,可通过修改索引配置文件中的
index.merge.policy
相关参数来调整合并策略。如tiered_merge_policy
下的max_merge_at_once
(一次最大合并段数)、max_merge_at_once_explicit
(手动合并时一次最大合并段数)等参数。
索引缓存优化
- 字段数据缓存:
- 思路:合理利用字段数据缓存,该缓存存储已加载到内存中的字段数据,对于频繁查询的字段,缓存可显著提高查询速度。
- 配置项:在 Elasticsearch 中,默认情况下字段数据缓存是启用的,但可通过调整
indices.fielddata.cache.size
参数来控制缓存占用堆内存的比例。例如设置为indices.fielddata.cache.size: 20%
,表示字段数据缓存最多使用堆内存的 20%。
- 过滤器缓存:
- 思路:利用过滤器缓存,缓存经常使用的过滤器结果,减少重复计算,提高查询性能。
- 配置项:在 Elasticsearch 中,过滤器缓存默认启用,可通过调整
indices.cache.filter.size
参数来控制其占用堆内存的比例。例如设置为indices.cache.filter.size: 10%
,即过滤器缓存最多使用堆内存的 10%。