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