MST
星途 面试题库

面试题:ElasticSearch复杂场景下排序与评分结合的优化

假设在一个包含海量商品数据的电商ElasticSearch索引中,既要根据商品销量排序,又要结合用户自定义的评分系统(用户对商品的打分)以及商品与搜索关键词的相关性进行综合评分排序。描述你会如何设计这个搜索逻辑,包括可能用到的ElasticSearch特性、参数调整等,以确保高效且准确的搜索结果。
13.4万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试
  1. 相关性评分
    • ElasticSearch 默认使用 BM25 算法计算相关性得分,在查询商品时,直接在 query 部分构造合适的查询语句,例如使用 multi - match 查询,指定需要匹配的字段(如商品标题、描述等),这样 ElasticSearch 会基于 BM25 算法给出与搜索关键词的相关性得分 _score
    • 示例查询:
    {
        "query": {
            "multi - match": {
                "query": "搜索关键词",
                "fields": ["title", "description"]
            }
        }
    }
    
  2. 商品销量和用户评分整合
    • 使用 function_score:可以通过 function_score 来调整相关性得分,以结合商品销量和用户自定义评分。
    • 商品销量:假设商品销量字段为 sales_count,可以使用 field_value_factor 函数,将销量作为提升因子。设置 modifierlog1p(对数变换,防止高销量商品过度影响结果)。
    • 用户评分:假设用户评分字段为 user_rating,同样使用 field_value_factor 函数,可根据实际情况选择合适的 modifier,如线性变换可不设 modifier
    • 示例 function_score 查询:
    {
        "query": {
            "function_score": {
                "query": {
                    "multi - match": {
                        "query": "搜索关键词",
                        "fields": ["title", "description"]
                    }
                },
                "functions": [
                    {
                        "field_value_factor": {
                            "field": "sales_count",
                            "modifier": "log1p",
                            "factor": 1
                        }
                    },
                    {
                        "field_value_factor": {
                            "field": "user_rating",
                            "factor": 1
                        }
                    }
                ],
                "score_mode": "sum",
                "boost_mode": "sum"
            }
        }
    }
    
    • 在上述示例中,score_mode 设置为 sum,表示将相关性得分与两个函数计算的得分相加;boost_mode 也设置为 sum,用于控制函数计算得分与原始查询得分的合并方式。
  3. 参数调整
    • BM25 参数
      • k1b 是 BM25 算法中的重要参数。k1 控制词频对得分的影响程度,默认值为 1.2。如果希望词频对相关性影响更大,可以适当增大 k1 值;如果希望减少词频影响,可减小 k1 值。
      • b 用于控制字段长度对得分的影响,默认值为 0.75。对于较短的字段,可适当减小 b 值;对于较长字段,可适当增大 b 值。
    • function_score 相关参数
      • factor:在 field_value_factor 函数中,factor 用于调整对应字段对最终得分的影响权重。如对于用户评分 user_rating,如果觉得其重要性更高,可以增大 factor 值;对于商品销量 sales_count,若不想让其对结果影响过大,可减小 factor 值。
  4. 索引优化
    • 字段映射:确保 sales_countuser_rating 字段设置为合适的数值类型(如 integerfloat),以保证数值计算的准确性和效率。
    • 倒排索引:对于经常用于搜索的文本字段(如 titledescription),确保建立了高效的倒排索引。可以根据数据特点调整索引的分词器,以提高搜索匹配的准确性。例如,对于中文文本,可以使用 IK 分词器等更适合中文的分词器。
    • 数据分片与副本:根据数据量和服务器资源,合理设置索引的分片数和副本数。分片数过多可能会增加管理开销,过少可能影响查询性能;副本数用于提高数据的可用性和读性能,但过多副本会占用更多存储空间。通常,可根据经验和测试,在数据量较大时,设置适当数量的分片(如 5 - 10 片),副本数可设置为 1 - 2 个。