?使用 function score query,可以修改文档的相关性算分 (query score),根据新得到的算分排序。
目录
?
几种默认的计算分值的函数:
GET? ?/hotel/_search
{
????????"query":{
????????????????"function_score": {
????????????????????????"query": { "match": {??"al":"外滩" } },? //原始查询条件,搜索文档并根据相关性打分(query score)
????????????????????????"functions":[
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
????????????????????????????????????????"filter": { "term" : { "id":"1" }},? //过滤条件,符合条件的文档才会被重新算分????????????????????????????????????????"weight":10? //?算分函数,算分函数的结果称为function score,将来会与queryscore运算,得到新算分,常见的算分函数有:
????????????????????????????????????????????????weight:给一个常量值,作为函数结果 (function score);
????????????????????????????????????????????????field_value_factor:用文档中的某个字段值作为函数结果;
????????????????????????????????????????????????random_score:随机生成一个值,作为函数结果;
????????????????????????????????????????????????script_score:自定义计算公式,公式结果作为函数结果;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ],
????????????????????????"boost_mode": "multiply"? ?//加权模式,定义function score与query score的运算方式,包括:????????????????multiply:两者相乘。默认。
????????????????replace:用function store 春换query score
????????????????其它:sum、avg、max、min
????????????????}
? ? ? ? }
}
题目1:给“如家”这个品牌的酒店排名靠前一些??
分析如下
- 哪些文档需要算分加权?
????????品牌为如家的酒店
- 算分函数是什么?
????????weight就可以
- 加权模式是什么?
????????求和??
代码示例
GET? ?/hotel/_search
{
????????"query":{
????????????????"function_score": {
????????????????????????"query":{? ?????????//...????????? ?},
????????????????????????"functions" : [? ? ? ? ? ? ? ? ? ? ? ? ? ?// 算分函数
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {????????????????????????????????????????"filter": {? ? ? ? ? ? ? ? ? ? // 满足的条件,品牌必须是如家
????????????????????????????????????????"term": {
????????????????????????????????????????????????"brand":"如家"
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????????}
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? },?
????????????????????????????????"weight" : 2? ? ? ? ? ? ? ? ? ? ? ?// 算分权重为2
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ],
????????????????????????"boost_mode":"sum"????????????????// 求和? ? ? ? ? ? ? ? }
? ? ? ? }
}