1. 索引结构设计
- 基本信息:
- 名称:使用
text
类型,并配置合适的analyzer
(如ik_max_word
用于中文分词),方便全文检索产品名称。例如:
{
"product_name": {
"type": "text",
"analyzer": "ik_max_word"
}
}
- 价格:使用
float
或double
类型,便于进行范围查询。例如:
{
"product_price": {
"type": "float"
}
}
- 描述:使用
text
类型,同样配置合适的分词器(如ik_max_word
),以支持对产品描述的全文检索。例如:
{
"product_description": {
"type": "text",
"analyzer": "ik_max_word"
}
}
- 分类信息:
- 多级分类可以使用
nested
类型来处理。假设分类有category_name
(分类名称)和parent_category
(父分类ID,可空)等字段。例如:
{
"categories": {
"type": "nested",
"properties": {
"category_name": {
"type": "text",
"analyzer": "ik_max_word"
},
"parent_category": {
"type": "keyword"
}
}
}
}
- 使用
nested
类型是因为它可以保持每个分类文档的独立性,在查询时可以准确地对每个分类进行匹配,而不会像object
类型那样出现数据混淆的问题。
- 关联产品:
- 使用
keyword
类型存储关联产品的ID。因为关联产品通常是通过ID来关联的,keyword
类型不会进行分词,适合精确匹配。例如:
{
"related_products": {
"type": "keyword"
}
}
- 用户评价:
- 评价内容:使用
text
类型,并配置合适的分词器(如ik_max_word
),以便对评价内容进行全文检索。例如:
{
"review_content": {
"type": "text",
"analyzer": "ik_max_word"
}
}
- 评分:使用
integer
类型,便于进行评分范围查询。例如:
{
"review_rating": {
"type": "integer"
}
}
- 评价时间:使用
date
类型,方便按时间范围进行查询。例如:
{
"review_date": {
"type": "date"
}
}
2. 索引策略及原因
- 策略:
- 索引分片:根据预估的数据量和服务器资源合理设置分片数。例如,如果数据量较大且查询负载高,可以适当增加分片数,但不宜过多,以免增加集群管理成本。一般初始可以设置为3 - 5片,后续根据实际情况调整。
- 索引副本:设置一定数量的副本,如1 - 2个副本,以提高数据的可用性和查询性能。副本可以分担读请求,在某个分片出现故障时保证数据不丢失。
- 动态映射与静态映射:优先采用静态映射,因为电商产品数据结构相对固定,静态映射可以明确指定每个字段的类型和分词器等设置,避免动态映射可能带来的类型推断错误,提高索引的稳定性和查询性能。
- 定期重建索引:随着数据的更新和增长,索引可能会出现碎片化等性能问题。定期重建索引(例如每月或每季度),可以优化索引结构,提高查询性能。同时,在重建索引时,可以根据业务需求对索引结构进行适当调整。
- 原因:
- 合理的分片和副本设置能够在保证数据可用性的同时,提高查询的并发处理能力,满足电商高并发的查询需求。
- 静态映射可以确保数据类型的准确性,避免因类型错误导致的查询异常,并且能够根据业务需求对每个字段进行针对性的配置,提高索引和查询效率。
- 定期重建索引有助于解决因数据更新导致的索引碎片化问题,保持索引的高效性,同时适应业务的发展对索引结构进行优化。