当前位置: 首页 > 知识库问答 >
问题:

ElasticSearch:如何根据字段值提高分数?

郏志学
2023-03-14

我试图通过根据场值提升_score来摆脱弹性搜索中的排序。这是我的场景:

我的文档中有一个字段:应用日期。这是自EPOC以来经过的时间。我希望具有更大应用日期(最近)的记录具有更高的分数。

如果两个文档的分数相同,我想在另一个字符串类型的字段上对它们进行排序。说“状态”是另一个可以有值的字段(可用、进行中、关闭)。所以,具有相同应用程序日期的文档应该根据状态_score。可用应该有更多的分数,进行中得分更少,关闭,最少。所以通过这种方式,我不必在得到结果后对文档进行排序。

请给我一些建议。

共有3个答案

花飞扬
2023-03-14

有一个名为rank_feature_field的新字段可用于此用例:

https://www.elastic.co/guide/en/elasticsearch/reference/current/rank-feature.html

段志
2023-03-14

你看过功能分数吗?https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html

具体看上面留档中的衰减函数。

那谦
2023-03-14

您应该能够使用 函数分数 来实现此目的。根据您的要求,它可能像以下示例一样简单:

  put test/test/1 
{
     "applicationDate" : "2015-12-02",
     "status" : "available"
}
put test/test/2
{
     "applicationDate" : "2015-12-02",
     "status" : "progress"
}

put test/test/3
{
     "applicationDate" : "2016-03-02",
     "status" : "progress"
}


post test/_search
{
   "query": {
      "function_score": {
         "functions": [
             {
               "field_value_factor" : {
                    "field" : "applicationDate",
                    "factor" : 0.001
               }
             },
            {
               "filter": {
                  "term": {
                     "status": "available"
                  }
               },
               "weight": 360
            },
            {
               "filter": {
                  "term": {
                     "status": "progress"
                  }
               },
               "weight": 180
            }
         ],
         "boost_mode": "multiply",
         "score_mode": "sum"
      }
   }
}
**Results:**

"hits": [
     {
        "_index": "test",
        "_type": "test",
        "_id": "3",
        "_score": 1456877060,
        "_source": {
           "applicationDate": "2016-03-02",
           "status": "progress"
        }
     },
     {
        "_index": "test",
        "_type": "test",
        "_id": "1",
        "_score": 1449014780,
        "_source": {
           "applicationDate": "2015-12-02",
           "status": "available"
        }
     },
     {
        "_index": "test",
        "_type": "test",
        "_id": "2",
        "_score": 1449014660,
        "_source": {
           "applicationDate": "2015-12-02",
           "status": "progress"
        }
     }
  ]
 类似资料:
  • 下面是我的搜索响应示例,检索到4个结果。 现在,我想根据下面的标准,根据特定的“dir”字段值过滤上述搜索结果。 在且仅在以下情况下将搜索结果包含在响应中: 如果“dir”字段值等于“/shared”或“/private/hitesh” 如果“dir”字段值以“/shared/”或“/private/hitesh/”开头,则为其他 如何在ElasticSearch中实现上述功能?

  • 问题内容: 我知道,弹性查询在计算查询检索的文档分数时会考虑字段的长度。字段越短,权重越高(请参见字段长度范数)。 我喜欢这种行为:当我搜索我在更感兴趣比。 现在,我想尝试增强这些功能,比方说,我想使其重要性加倍。 我知道可以使用功能分数来修改分数,并且我想我可以通过脚本分数来实现我想要的。 我试图像这样向得分添加另一个字段长度范数: 但是我失败很严重,得到了这个错误: 编辑: 我的第一个错误是我

  • 问题内容: 需要在ElasticSearch中找到一种方法来根据字段的特定值来提高文档的相关性。具体来说,我所有文档中都有一个特殊字段,该字段值越高,包含该文档的文档就越相关,而与搜索无关。 考虑以下文档结构: 我希望boosting_field值较高的文档与那些boosting_field值较低的文档 本质上相关性 更高。这只是一个起点- 在确定搜索中每个文档的最终相关性分数时,还将考虑查询与其

  • 问题内容: 例如,如果某个东西的“ favourites_count”值更高,我希望它变得更相关,或者如果它最近更新,那么它就更有意义。有没有办法做到这一点?这与标准的boost功能不同,因为这些字段不包含关键字,而是包含数字值。 问题答案: 您可以使用来基于自定义公式增强文档。有关更多详细信息,请参见此处(部分):https : //www.elastic.co/guide/zh- cn/ela

  • 问题内容: 我有一张像这样的表: SQL或蜂巢中是否有一种方法可以将其转换为类似表的形式: 我不确定有没有一个词来描述这种操作…任何帮助将不胜感激! 问题答案: 这基本上是一个。您没有指定要使用的RDBMS,但是可以使用聚合函数和语句在任何数据库中获取结果: 参见带有演示的SQL Fiddle 结果:

  • 问题内容: 我遇到了我不希望做的事情,我不知道该如何处理活动记录(实际上我无法确切地说出如何使用sql来做)。我想根据某个字段的最高值以及其他一些条件来选择记录。以下是一些伪造的东西,它们解释了我的情况。给出以下记录: 我希望能够获取已保存的修订版本号最高的记录。这意味着ID为:3、6和8的记录 我的第一个本能是做某种子查询,该子查询在修订之类的东西上获得MAX。除此之外,我真的不知道该怎么做,因