设置参数 `node.name` 可以自定义 Elasticsearch 节点的名字。 此条 Tips 由 medcl 贡献。

elasticsearch 搜索排序

Elasticsearch | 作者 依诺 | 发布于2017年07月26日 | 阅读数:6123

@Medcl 你好,想跟你请教个问题:

数据结构为food_name(菜品名称),ingredients(主料),step(步骤),likenum(收藏数量)

通过关键字keyword输入内容查询范围在food_name,ingredients,step中

想通过es实现一下排序:

   1. 大的排序规则:作品名命中>主料命中>步骤命中,也就是说作品名命中的要排在主料命中的前面,主料命中的排在步骤命中的前面

  2. 作品名命中的结果中,排序规则如下:

   * 按照收藏数量进行排序,收藏数高的在上面

   * 主辅料、步骤、心得体会命中的结果中,排序规则同作品名命中规则

 

例如:输入关键字肉,会查出以下数据


e.png


 

我本来想着用sort来实现,但是用sort来实现的话,算出来的score就失效了,效果很不理想,达不到要求,用以下方式来实现,效果也不是很理想。

{
  "query": {
    "function_score": {
      "query": {
        "bool": {
            "must": {
                "multi_match": {
                    "query": "肉",
                    "fields": [
                        "food_name^800",
                        "ingredients^700",
                        "step^600"
                    ],
                    "type": "phrase_prefix",
                    "operator": "or"
                }
            },
            "filter": {
                "terms": {
                    "status": [
                        1,
                        2
                    ]
                }
            }
        }
      },
      "field_value_factor": {
        "field":    "likenum",
        "modifier": "square",
        "factor":   0.4
      },
      "boost_mode": "sum"
    }
  }

      
}

 

求教,谢谢~<无标签>
已邀请:

medcl - 今晚打老虎。

赞同来自: 依诺 AlixMu tdlLen

你上面的已经在用function_score,可能要微调一下评分和比例。

按理解应该就是一个二级排序:

1.按字段匹配的优先级;拉开各字段权重区间;考虑一点,第二个字段和第三个字段匹配的情况下不能比只匹配第一个字段评分高;所以,现在的权重差距还不够大。

2.按收藏个数,在一级评分下,相同的关键字匹配的结果,按理说应该已经在一个顺序了,所以加上收藏个数的自定义评分要体现出他们的顺序,且不受第二个和三个字段评分的影响。 
 
分解之后就是:

[第一字段评分] >> [收藏影响] >> [第二字段评分] >> [收藏影响] >> [第三字段评分] >> [收藏影响]
 
具体的自己试一下。
 

AlixMu - Elasticsearch小轿车司机

赞同来自: 依诺

 "food_name^800",
 "ingredients^700",
 "step^600"
你可以先把收藏数量field_value_factor的去掉,然后先测试三类权重

要回复问题请先登录注册