MST
星途 面试题库

面试题:ElasticSearch重排序:处理复杂业务场景下的搜索结果顺序定制

在一个电商搜索场景中,索引里有商品的基本信息、用户评价得分、库存状态以及商品所属品牌的热度。业务需求是,先按相关性得分进行初始排序,然后优先展示库存充足的商品,在库存充足的商品中,再按照用户评价得分从高到低排序,若评价得分相同,则按品牌热度从高到低排序。请详细阐述如何使用ElasticSearch来实现这样复杂的重排序逻辑,包括使用的查询语句结构、可能用到的脚本(如果需要)以及相关配置。
29.2万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试
  1. 查询语句结构
    • 使用bool查询来组合不同的查询条件。bool查询包含mustfilter等子句。
    • 相关性排序:在query部分使用适合电商搜索的查询类型,比如multi - match查询来匹配商品基本信息相关的字段,以获得初始的相关性得分。例如:
    {
        "query": {
            "multi_match": {
                "query": "搜索关键词",
                "fields": ["商品基本信息字段1", "商品基本信息字段2"]
            }
        },
        "sort": [
            // 后续进行重排序
        ]
    }
    
    • 库存充足筛选:使用filter子句来筛选出库存充足的商品。假设库存状态字段为stock_status,库存充足可以表示为stock_status > 0
    {
        "query": {
            "bool": {
                "must": {
                    "multi_match": {
                        "query": "搜索关键词",
                        "fields": ["商品基本信息字段1", "商品基本信息字段2"]
                    }
                },
                "filter": {
                    "range": {
                        "stock_status": {
                            "gt": 0
                        }
                    }
                }
            }
        },
        "sort": [
            // 后续进行重排序
        ]
    }
    
  2. 重排序
    • 按用户评价得分排序:在sort数组中,先按用户评价得分字段(假设为user_rating_score)从高到低排序。
    {
        "query": {
            "bool": {
                "must": {
                    "multi_match": {
                        "query": "搜索关键词",
                        "fields": ["商品基本信息字段1", "商品基本信息字段2"]
                    }
                },
                "filter": {
                    "range": {
                        "stock_status": {
                            "gt": 0
                        }
                    }
                }
            }
        },
        "sort": [
            {
                "user_rating_score": {
                    "order": "desc"
                }
            }
        ]
    }
    
    • 品牌热度排序(评价得分相同时):当用户评价得分相同时,再按品牌热度字段(假设为brand_popularity)从高到低排序。在sort数组中添加第二个排序条件。
    {
        "query": {
            "bool": {
                "must": {
                    "multi_match": {
                        "query": "搜索关键词",
                        "fields": ["商品基本信息字段1", "商品基本信息字段2"]
                    }
                },
                "filter": {
                    "range": {
                        "stock_status": {
                            "gt": 0
                        }
                    }
                }
            }
        },
        "sort": [
            {
                "user_rating_score": {
                    "order": "desc"
                }
            },
            {
                "brand_popularity": {
                    "order": "desc"
                }
            }
        ]
    }
    
  3. 脚本使用(通常在此场景下不需要,但某些复杂计算可能需要)
    • 如果需要对用户评价得分或品牌热度进行一些复杂的计算后再排序,可以使用脚本。例如,如果要对用户评价得分进行加权计算。首先,定义脚本:
    {
        "script": {
            "source": "double weightedScore = doc['user_rating_score'].value * params.weight; return weightedScore;",
            "params": {
                "weight": 1.5
            }
        }
    }
    
    • 然后在sort中使用这个脚本:
    {
        "query": {
            "bool": {
                "must": {
                    "multi_match": {
                        "query": "搜索关键词",
                        "fields": ["商品基本信息字段1", "商品基本信息字段2"]
                    }
                },
                "filter": {
                    "range": {
                        "stock_status": {
                            "gt": 0
                        }
                    }
                }
            }
        },
        "sort": [
            {
                "_script": {
                    "type": "number",
                    "script": {
                        "source": "double weightedScore = doc['user_rating_score'].value * params.weight; return weightedScore;",
                        "params": {
                            "weight": 1.5
                        }
                    },
                    "order": "desc"
                }
            },
            {
                "brand_popularity": {
                    "order": "desc"
                }
            }
        ]
    }
    
  4. 相关配置
    • 索引配置:确保商品基本信息、用户评价得分、库存状态以及商品所属品牌的热度这些字段在索引中正确映射。例如,对于数字类型的字段(用户评价得分、库存状态、品牌热度)要正确设置为数值类型,以保证排序和过滤的准确性。
    • 性能配置:如果数据量较大,可能需要考虑分片和副本的配置,以提高查询性能。同时,可以配置缓存策略,如filter子句的结果缓存,来减少重复计算。例如,在elasticsearch.yml中配置:
    indices.cache.filter.enable: true
    
    这可以缓存filter子句的结果,提高后续相同filter条件查询的性能。