ES文本搜索有两个概念
文本召回率
文本准确率
对于用户的搜索我们要尽量保证高的召回率,然后再保证准确率以防止一些结果查询遗漏,但是准确率低的可以通过es的搜索模型打分让其靠后。
#使用function score解决排序模型
GET /shop/_search
{
"_source": "*", #显示出所有字段
"script_fields": { #查询出对应坐标的距离
"distance":{
"script":{
"source":"haversin(lat,lon,doc['location'].lat,doc['location'].lon)",
"lang":"expression",
"params":{"lat":31.23916171,"lon":121.48789949}
}
}
},
"query": {
"function_score": {
"query": {
"bool": {
"must": [
{"match": {"name": {"query": "凯悦","boost": 0.1}}}, #boost 0.1也就是这部分的被降权到0.1,也就是文本搜索召回结果,不会特别影响打分
{"term": {"seller_disabled_flag": 0}}
]}},
"functions": [ #利用高斯方法控制相关性,涉及打分
{
"gauss": {
"location": {
"origin": "31.23916171,121.48789949",
"scale": "100km", #100KM为距离的函数拐点,一旦超过这个点打分就会加速下降
"offset": "0km", #最高点的左右距离为0,也就是只有最高点才为1分
"decay": 0.5 #拐点处为0.5分
}
},
"weight": 9 #距离占据总分数的权重为9
},
{
"field_value_factor": {
"field": "remark_score"
},
"weight": 0.2 #评论字段的打分权重为0.2
},
{
"field_value_factor": {
"field": "seller_remark_score"
},
"weight": 0.1 #商店备注字段打分的权重为0.1
}
],
"score_mode": "sum", #距离,评论字段,商店备注的打分之间的关系为相加(也可以改为相乘,但是放大的会比较大,在相关性计算放的太大不是很好,因为还需要和别的字段打分进行计算,太大会加重这部分权重)
"boost_mode": "replace" #标题,也就是查询部分的权重,replace也就是不计算入内,这部分对查询结果的打分不影响,只做索引查询
}
}
, "sort": [ #结果的排序方式
{
"_score": {
"order": "desc"
}
}
]
}
这是高斯函数图,有对应参数的控制属性可以作为参考理解