面试题答案
一键面试- 查询语句结构:
- 使用
bool
查询来组合不同的查询条件。bool
查询包含must
、filter
等子句。 - 相关性排序:在
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": [ // 后续进行重排序 ] }
- 使用
- 重排序:
- 按用户评价得分排序:在
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" } } ] }
- 按用户评价得分排序:在
- 脚本使用(通常在此场景下不需要,但某些复杂计算可能需要):
- 如果需要对用户评价得分或品牌热度进行一些复杂的计算后再排序,可以使用脚本。例如,如果要对用户评价得分进行加权计算。首先,定义脚本:
{ "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" } } ] }
- 相关配置:
- 索引配置:确保商品基本信息、用户评价得分、库存状态以及商品所属品牌的热度这些字段在索引中正确映射。例如,对于数字类型的字段(用户评价得分、库存状态、品牌热度)要正确设置为数值类型,以保证排序和过滤的准确性。
- 性能配置:如果数据量较大,可能需要考虑分片和副本的配置,以提高查询性能。同时,可以配置缓存策略,如
filter
子句的结果缓存,来减少重复计算。例如,在elasticsearch.yml
中配置:
这可以缓存indices.cache.filter.enable: true
filter
子句的结果,提高后续相同filter
条件查询的性能。