面试题答案
一键面试以 Elasticsearch 5.x 到 6.x 版本更新中相关性算法变化为例
- 相关性算法具体变化:
- 在 Elasticsearch 5.x 版本中,使用的是基于 TF/IDF (词频/逆文档频率)的经典算法来计算相关性得分。TF 衡量一个词在文档中出现的频率,IDF 衡量一个词在整个文档集合中的稀有程度。例如,如果一个词在某个文档中出现频率高(TF 高)且在整个索引中出现频率低(IDF 高),那么该词对这个文档的相关性得分贡献就大。
- 到了 6.x 版本,引入了 BM25(Best Matching 25)算法作为默认的相关性算法。BM25 是对 TF/IDF 算法的改进,它考虑了文档长度对相关性的影响。BM25 算法通过对 TF 进行更加复杂的计算,引入了两个参数
k1
和b
来控制词频的饱和度以及文档长度的影响。例如,当k1
值较大时,词频对得分的影响更平滑,避免了 TF 过高时得分过度增长的问题;b
参数用于调整文档长度对得分的影响程度,使得较长文档不会因为词频高而获得过高的得分,相对更公平地评估不同长度文档的相关性。
- 实际应用中搜索策略调整:
- 查询词处理:由于 BM25 对词频更敏感,对于一些高频词,可以适当降低其权重。例如,如果某些通用词在文档中频繁出现但对区分度贡献不大,可以在查询时使用
boost
参数降低这些词的权重。示例如下:
- 查询词处理:由于 BM25 对词频更敏感,对于一些高频词,可以适当降低其权重。例如,如果某些通用词在文档中频繁出现但对区分度贡献不大,可以在查询时使用
{
"query": {
"match": {
"content": {
"query": "高频词 重要词",
"boost": {
"高频词": 0.5,
"重要词": 2
}
}
}
}
}
- 文档长度处理:了解 BM25 中
b
参数对文档长度的影响。如果业务场景中,较短文档更重要,可以适当减小b
值,使得较短文档的得分相对更高;如果较长文档更有价值,可以适当增大b
值。在 Elasticsearch 中,可以通过自定义相似度来调整b
参数,示例如下:
{
"settings": {
"index": {
"similarity": {
"my_bm25": {
"type": "BM25",
"b": 0.75
}
}
}
}
}
然后在查询时指定使用这个自定义的相似度:
{
"query": {
"match": {
"content": {
"query": "查询内容",
"similarity": "my_bm25"
}
}
}
}
- 多字段搜索:在进行多字段搜索时,不同字段可能对相关性的贡献不同。可以根据业务需求,对不同字段设置不同的
boost
值。例如,对于标题字段可以给予较高的boost
值,因为标题往往更能代表文档的主题。示例如下:
{
"query": {
"multi_match": {
"query": "查询内容",
"fields": [
"title^3",
"content"
]
}
}
}
通过以上这些搜索策略的调整,可以更好地适应 Elasticsearch 6.x 版本中 BM25 相关性算法的变化,保证搜索结果的准确性和有效性。