【问题标题】:Elasticsearch function_score decay not working, always returns 1Elasticsearch function_score 衰减不起作用,总是返回 1
【发布时间】:2017-02-03 08:50:20
【问题描述】:

我已经尝试修复这个问题好几个小时了,但似乎没有任何改变 function_score 衰减函数的返回值。它始终只是 1。好像无法获取我指定的字段的整数?

数据模型看起来像这样(显然是假的):

{
  "basics": {
    "name": "Mr Augustus Flybynight (Jim)",
    "name_pref": "Jim",
    "location": {
      "city": "Melbourne",
      "postalCode": "3040",
      "meta": {
        "country": "Australia"
      },
      "region": "VIC",
      "address": "iytiytiyt, tyiuyti"
    },
    "email": "augustus.flybynight2@gmail.com",
    "applicantNumber": "11882",
    "name_first": "Augustus",
    "meta": {
      "alternateContact": "",
      "lastModified": 1473353751,
      "alternateName": "",
      "notificationType": "-1",
      "alternatePhones": [

      ],
      "gender": "M"
    },
    "name_last": "Flybynight",
    "phone": "44556677"
  }
}

我有这个实体的 3 个副本,唯一的区别是它们的时间戳(basics.meta.lastModified)。我正在尝试创建一个“越接近越好”的功能分数,以便最新的排名靠前。我们尚未将时间戳映射为日期,但它已映射为整数。

当尝试使用以下查询时

{
  "query": {
    "function_score": {
      "functions": [
        {
          "gauss": {
            "basics.meta.lastModified": {
              "origin": 1474868635, // now
              "offset": 86400, // one day
              "scale": 604800, // seven days
              "decay": 0.5
            }
          },
          "weight": 2
        }
      ],
      "query": {
        "bool": {
          "should": [
            {
              "match": {
                "_all": "augustus flybynight"
              }
            },
            {
              "match": {
                "basics.all_names.all_names_identifier_whitespace": {
                  "query": "augustus flybynight",
                  "boost": 2
                }
              }
            },
            {
              "match": {
                "basics.email.email_identifier_keyword": {
                  "query": "augustus flybynight",
                  "boost": 3
                }
              }
            },
            {
              "match": {
                "basics.applicantNumber.applicantNumber_identifier_keyword": {
                  "query": "augustus flybynight",
                  "boost": 3
                }
              }
            },
            {
              "wildcard": {
                "basics.email.email_identifier_keyword": {
                  "wildcard": "augustus flybynight*",
                  "boost": 2
                }
              }
            },
            {
              "wildcard": {
                "basics.all_names.all_names_identifier_whitespace": {
                  "wildcard": "augustus flybynight*"
                }
              }
            }
          ],
          "must": []
        }
      }
    }
  },
  "size": 25,
  "from": 0,
  "min_score": 0.2
}

但这总是为功能分数返回“1”,然后将其乘以查询并且不会影响它。这是最奇怪的事情。

查看解释时,返回的是以下内容:

{
  "value": 1,
  "description": "min of:",
  "details": [
    {
      "value": 1,
      "description": "product of:",
      "details": [
        {
          "value": 1,
          "description": "Function for field basics.meta.lastModified:",
          "details": [
            {
              "value": 1,
              "description": "max(0.0, ((2.0 - MIN[0.0])/2.0)",
              "details": [

              ]
            }
          ]
        },
        {
          "value": 1,
          "description": "weight",
          "details": [

          ]
        }
      ]
    },
    {
      "value": 3.4028235e+38,
      "description": "maxBoost",
      "details": [

      ]
    }
  ]
}

似乎 'MIN[0.0]' 是应该返回时间戳的部分,但事实并非如此,而是返回 0 并使衰减函数始终为 1。如果我使衰减参数更严格,例如 origin:0 , offset:0, scale:1 和 decay:0.5,我希望 function_score 接近 0,但它仍然是 1。

请帮忙。我一直在尝试一切,网上似乎没有很多例子。欢迎提出任何建议。

【问题讨论】:

  • 这可能是由于嵌套字段。这看起来像一个类似的问题:stackoverflow.com/a/34467377/689625
  • @jay 是的,是的。错误的映射是罪魁祸首。不敢相信我花了这么长时间才找到它,而且 ES 没有提到它:/

标签: elasticsearch


【解决方案1】:

对于那些遇到同样问题的人,我终于找到了罪魁祸首。

似乎有人没有正确设置映射,因为 basics.meta 属性被设置为嵌套类型,但由于它不是这样填充的(您认为这会在索引时引起问题数据?),当尝试访问其中的数据时,它总是返回MIN[0.0],因为它根本找不到该属性的值。

所以是的,如果你遇到这个问题,彻底检查你的映射,而不是像我一样浪费一整天:|

【讨论】:

    猜你喜欢
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    相关资源
    最近更新 更多