-
数据量小、分布不均匀导致评分异常
如果有两个分片A、B。单词W在A中的出现的次数比较低,但是在B中出现较多,根据TF/IDF算法,IDF计算是基于分片的,A中文档的评分将会高些,排名较高。随着数据量越多,数据分布越均匀,将不会出现这种问题,但是可以配置search_type=dfs_query_then_fetch,告诉ES,先获取每个分片的IDF,然后根据结果再计算全局的IDF。 -
如果采用best field策略,其他字段对评分不会计入,评分异常。
例如查询 W1、W2,文档A的F1包含W1,F2包含W2,文档B的F2包含W2,按照Best Field策略,那么两个文档的得分是一样的,添加tie_breaker参数,除了Best Field以外,其他的参数也参与计算最终得分,但是需要乘以设置的百分比。
案例如下:
GET /music/doc/_search
{
"query": {
"dis_max": {
"tie_breaker": 0.7,
"boost": 1.2,
"queries": [
{
"match": {
"singer": "周杰伦"
}
},
{
"match": {
"wordAuthor": "周杰伦"
}
}
]
}
}
}
- 重新计算
match查询相对match_phrase速度较快,而客户往往只会看最前面几页,那么大部分文档是不需要计算得分的,只对每个shared中排名靠前的几个文档进行重新计算得分。
GET /music/doc/_search
{
"query": {
"match": {
"words": {
"query": "窗外的麻雀",
"minimum_should_match": "30%"
}
}
},
"rescore": {
"query": {
"rescore_query": {
"match_phrase": {
"words": {
"query": "窗外的麻雀"
}
}
}
},
"window_size": 50
}
}