使用过滤器的函数得分Elasticsearch

5
我希望有一个函数,可以在满足过滤条件的情况下对所有结果进行排序。我已经尝试了以下查询,但没有结果。有人能帮忙解决吗?
尝试1:
{
           "query": {
                "function_score": {
                    "query": {
                        "filtered": {
                            "query": {
                                "match_all": {} 
                            },                        
                            "filter": {
                                "bool": {
                                    "must": [
                                        {
                                            "term": {
                                                "category_boats": "motor_boat"
                                            }
                                        }                                           
                                    ]
                                }
                            }
                        }
                    },
                    "functions": [

                    ],
                    "score_mode": "first"
                }
            }
        }

尝试2:

{
           "query": {
                "function_score": {
                    "query": { 
                        "match_all": {}
                    },
                    "functions": [ 
                        {
                            "filter": { 
                                "term": { 
                                    "boat_type": "offshore_yacht" 
                                }
                            }, 
                            "weight": 1
                        },
                        {
                            "filter": { 
                                "term": { 
                                    "year_built": "2016" 
                                }
                            }, 
                            "weight": 1
                        },
                        {
                            "filter": { 
                                "term": { 
                                    "manufacturer": "MasterCraft" 
                                }
                            }, 
                            "weight": 2 
                        }
                    ],
                    "score_mode": "first"
                }
            }
        }

在最后一行代码中,我遇到了一个错误:没有注册名为[weight]的函数。是否支持用于过滤器的weight?可以帮忙吗?

Elasticsearch 的哪个版本? - keety
版本:"数字":"1.3.2"。但如果这是一个问题,我可以更新ElasticSearch服务器。 - Goce Dimkovski
奇怪,下面的方法为什么不起作用呢? - keety
我使用以下解决方案。谢谢Keety。 - Goce Dimkovski
1个回答

4
在 Elasticsearch 1.4 版本之前,称之为 boost_factor,现已添加了对 weight 的支持。
示例:
{
  "query": {
    "function_score": {
      "query": {
        "match_all": {}
      },
      "functions": [
        {
          "filter": {
            "term": {
              "boat_type": "offshore_yacht"
            }
          },
          "boost_factor": 1
        },
        {
          "filter": {
            "term": {
              "year_built": "2016"
            }
          },
          "boost_factor": 1
        },
        {
          "filter": {
            "term": {
              "manufacturer": "MasterCraft"
            }
          },
          "boost_factor": 2
        }
      ],
      "score_mode": "first"
    }
  }
}

谢谢Keety。它有效。我不知道“weight”只适用于1.4之后的弹性搜索。 在教程和示例中,我总是感到困惑,为什么有时会出现“weight”,有时会出现“boost_factor”。 - Goce Dimkovski
我在 Elastic "2.2.0" 中实现这个功能遇到了困难。他们改变了过滤的方式,不仅仅是用 "boost_factor" 替换 "weight" 那么简单。有人可以帮忙吗? - Goce Dimkovski
我刚尝试了上面的查询语句,它在 Elasticsearch 2.2.0 版本中正常工作。您能否提交另一个问题,说明您正在执行的实际查询和您在 2.2.0 版本中遇到的问题? - keety
上述查询列出了结果 - 是的,但它们没有像在 Elasticsearch 1.3.2 中那样按 boost_factor 或 weight 进行排序。 它显示了来自“match_all”:{} 的结果,但没有按照我们想要的过滤器进行排序,就像版本1.3.2中那样。必须有其他方法... - Goce Dimkovski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接