Запрос Elasticsearch function_score field_value_factor присваивает одинаковую оценку, даже если значения полей отличаются - PullRequest
0 голосов
/ 12 апреля 2019
  • Использование Elasticsearch v6.5

Привет, Я использую function_score запрос с field_value_factor в поле даты. Мой запрос следующий:

POST /users/_search
{
  "query": {
    "function_score": {
      "query": {
        "match_all": {}
      },

      "functions": [
        {
          "field_value_factor": {
            "field": "createdAt"
          }
        }
      ]
    }
  }
}

Response
200 OK
{
  "hits": {
    "hits": [
      {
        "_score": 1545536870000000,
        "_type": "_doc",
        "_id": "user1",
        "_source": {
          "createdAt": 1545536877421,
          "firstName": "foo1"
        },
        "_index": "users"
      },
      {
        "_score": 1545536870000000,
        "_type": "_doc",
        "_id": "user2",
        "_source": {
          "createdAt": 1545536877422,
          "firstName": "foo2"
        },
        "_index": "users"
      }
    ],
    "max_score": 1545536870000000
  },
  "took": 17
}

Мой вопрос: 1. почему он возвратил одинаковую оценку для обоих документов, даже если значения поля разные? 2. почему оценка обрезает фактическое значение поля до меньшего значения, а затем умножается на 10000000. Разве не в этом смысл использования коэффициента значения поля - это оценка тех документов, которые имеют более высокое значение поля.

1 Ответ

0 голосов
/ 13 апреля 2019

Если вы добавите параметр explain:true, вы увидите, что вы превышаете максимальное значение для оценки, поэтому все они в конечном итоге одинаковы.

 "hits": {
"total": 2,
"max_score": 1545536930000,
"hits": [
  {
    "_shard": "[test1][2]",
    "_node": "L0mg3oZdRdSSlah6QPVqjQ",
    "_index": "test1",
    "_type": "doc",
    "_id": "2",
    "_score": 1545536930000,
    "_source": {
      "createdAt": 1545536877422,
      "firstName": "foo2"
    },
    "_explanation": {
      "value": 1545536930000,
      "description": "function score, product of:",
      "details": [
        {
          "value": 1,
          "description": "*:*, product of:",
          "details": [
            {
              "value": 1,
              "description": "boost",
              "details": []
            },
            {
              "value": 1,
              "description": "queryNorm",
              "details": []
            }
          ]
        },
        {
          "value": 1545536930000,
          "description": "min of:",
          "details": [
            {
              "value": 1545536930000,
              "description": "field value function: none(doc['createdAt'].value * factor=1.0)",
              "details": []
            },
            {
              "value": 3.4028235e+38,
              "description": "maxBoost",
              "details": []
            }
          ]
        }
      ]
    }
  },
  {
    "_shard": "[test1][3]",
    "_node": "L0mg3oZdRdSSlah6QPVqjQ",
    "_index": "test1",
    "_type": "doc",
    "_id": "1",
    "_score": 1545536930000,
    "_source": {
      "createdAt": 1545536877421,
      "firstName": "foo1"
    },
    "_explanation": {
      "value": 1545536930000,
      "description": "function score, product of:",
      "details": [
        {
          "value": 1,
          "description": "*:*, product of:",
          "details": [
            {
              "value": 1,
              "description": "boost",
              "details": []
            },
            {
              "value": 1,
              "description": "queryNorm",
              "details": []
            }
          ]
        },
        {
          "value": 1545536930000,
          "description": "min of:",
          "details": [
            {
              "value": 1545536930000,
              "description": "field value function: none(doc['createdAt'].value * factor=1.0)",
              "details": []
            },
            {
              "value": 3.4028235e+38,
              "description": "maxBoost",
              "details": []
            }
          ]
        }
      ]
    }
  }
]

}

Цитирование по этой ссылке на выпуск github :

Последний _score - это число с плавающей точкой, которое может представлять только целые числа. точно до 2 ^ 25. Временные метки имеют порядок 2 ^ 40, поэтому не могут быть представлены точно, следовательно, округление, которое вы видя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...