面试题答案
一键面试索引结构设计
- 字段类型选择
- 对于需要模糊搜索的文本字段,使用
text
类型,并指定合适的分析器。例如,对于英文文本,可选择english
分析器,它能进行词干提取等操作,减少索引中的词条数量,提升搜索性能。对于中文文本,可选用结巴分词等适合中文的分析器,提高分词准确性。 - 避免在需要模糊搜索的字段上使用
keyword
类型,因为keyword
类型不会对文本进行分词,不适合模糊匹配场景。
- 对于需要模糊搜索的文本字段,使用
- 索引分片与副本
- 根据数据量和集群规模合理设置分片数。分片数过多会增加管理开销和网络传输,过少则可能导致单个分片数据量过大影响性能。一般可根据经验公式和测试来确定,如数据量100GB左右,可先尝试5 - 10个分片。
- 合理设置副本数,副本数主要用于提高系统的可用性和读性能。在读写比例高且集群资源充足的情况下,可适当增加副本数,但也不宜过多,以免占用过多资源。通常可设置1 - 2个副本。
- 多字段索引
- 对于同一文本内容,可创建多个不同分析方式的字段。例如,一个字段使用标准分析器进行全词匹配,另一个字段使用更细化的分析器进行部分匹配,这样能满足不同模糊搜索需求,提高搜索准确性。
查询优化
- 使用合适的查询语句
- 对于模糊搜索,优先使用
match
查询,它会根据字段的分析器进行分词和匹配。例如,match
查询的operator
参数设置为and
,可以提高搜索准确性,只有当所有搜索词都出现在文档中才会返回结果;设置为or
,则只要有一个词出现就返回结果,适用于更宽泛的搜索。 - 避免过度使用
wildcard
查询,因为它是对每个词条进行全匹配,性能较差。如果必须使用,尽量将通配符放在词尾,减少匹配的词条数量。
- 对于模糊搜索,优先使用
- 控制返回结果数量
- 使用
size
参数限制每次返回的文档数量,避免一次性返回过多数据,减少网络传输和处理开销。例如,对于前端展示,可先设置size
为10 - 20,根据用户需求再进行加载更多操作。
- 使用
- 缓存查询结果
- 对于一些经常查询的模糊搜索语句,可以在应用层进行缓存。例如,使用Redis等缓存工具,将查询语句和结果进行缓存,下次相同查询直接从缓存中获取,减少对ElasticSearch的查询压力。
集群配置
- 硬件资源分配
- 确保集群节点有足够的内存,ElasticSearch会将索引数据和查询结果缓存到内存中,充足的内存能提高查询性能。一般建议每个节点至少分配总数据量的1/3 - 1/2的内存。
- 合理配置CPU资源,根据节点的角色(如数据节点、协调节点等)分配CPU核心。数据节点主要负责数据存储和处理,需要较多CPU资源;协调节点主要负责请求分发和结果合并,也需要一定的CPU资源。
- 节点角色划分
- 划分数据节点、协调节点和主节点。数据节点负责存储和处理数据,协调节点负责接收客户端请求,分发查询到数据节点,并合并结果返回给客户端,主节点负责集群的管理和元数据的维护。这样的角色划分能提高集群的整体性能和稳定性。
- 对于大规模集群,可增加专门的预处理节点,对查询请求进行预处理,如规范化查询语句、进行简单的过滤等,减轻数据节点和协调节点的负担。
- 集群网络配置
- 优化集群内部网络,采用高速、低延迟的网络设备和拓扑结构,减少节点间的数据传输延迟。例如,使用万兆网卡等高速网络设备,采用扁平化的网络拓扑,减少网络跳数。
- 合理配置防火墙规则,确保集群节点之间以及客户端与集群之间的网络通信畅通,避免因网络限制导致查询性能下降。