Странное поведение при заданном параметре scaling_factor

Я использую Elasticsearch 6.2.1 и теперь пытаюсь понять, как это работает, когда для параметра scaling_factor установлено какое-то значение.

Согласно документации значение поля умножается на scaling_factor и затем сохраняется как long во время индексации. Когда scaling_factor равно 100, я ожидаю, что значение 1,234 будет храниться внутри как 123, и после этого его можно будет найти в индексе как 1,23. Теперь я вижу, что значение 1,234 не теряет своей точности, и я могу получить его из индекса в исходной форме: 1,234.

Это ошибка в этой версии Elasticsearch? Если нет, может кто-нибудь объяснить, что происходит под капотом?

ОБНОВЛЕНИЕ

Ответ @Val прояснил поведение Elasticsearch, но я хотел бы понять, почему можно найти документ по исходному необработанному значению, хотя индекс содержит только масштабированное значение. Например, в случае следующего отображения:

{
  "mappings": {
    "properties": {
      "num": {
        "type": "scaled_float",
        "scaling_factor": 100
      }
    }
  }
}

Я могу индексировать документ

{
  "num": 1.234
}

а затем найти его с помощью следующего запроса:

{
  "query": {
    "match": {
      "num": 1.234
    }
  }
}

Я ожидал, что приведенный выше запрос ничего не найдет, потому что индекс содержит только округленное значение 1,23.


person briarheart    schedule 15.10.2019    source источник


Ответы (1)


Если вы видите 1.234 в исходном документе, это нормально, ES никогда ничего не изменяет в самом исходном документе.

Учитывая это отображение:

PUT scaling
{
  "mappings": {
    "properties": {
      "num": {
        "type": "scaled_float",
        "scaling_factor": 100
      }
    }
  }
}

Если вы храните этот документ

PUT scaling/_doc/1
{
  "num": "1.234"
}

Затем извлечение документа даст те же данные, что и вы проиндексировали:

GET scaling/_doc/1
=>
{
  "num": "1.234"
}

Однако получение значения doc из поля num даст то, что вы ожидаете:

GET scaling/doc/_search
{
  "docvalue_fields": ["num"],
  "script_fields": {
    "doc_value": {
      "script": {
        "source": "doc.num.value"
      }
    },
    "raw_value": {
      "script": {
        "source": "params._source.num"
      }
    }
  }
}

=>

  {
    "_index" : "scaling",
    "_type" : "doc",
    "_id" : "1",
    "_score" : 1.0,
    "fields" : {
      "raw_value" : [
        "1.234"                  <--- raw value that was sent for indexing
      ],
      "doc_value" : [
        1.23                     <--- scaled doc value that was indexed
      ],
      "num" : [
        1.23                     <--- scaled doc value that was indexed
      ]
    }
  }
person Val    schedule 15.10.2019
comment
Спасибо за ответ! Мне стало понятнее, но я все еще не понимаю, почему я могу найти документ, сопоставляя поле num со значением 1,23, а также 1,234? Я ожидал, что второй вариант потерпит неудачу, потому что на самом деле индексированное значение равно 1,23. - person briarheart; 15.10.2019
comment
Пожалуйста, обновите свой вопрос с запросом, который вы отправляете - person Val; 16.10.2019
comment
Я обновил свой вопрос примером простого запроса. Можете ли вы объяснить, что происходит, пожалуйста? - person briarheart; 17.10.2019
comment
Можно предположить, что ES применяет такое же масштабирование к значению запроса, и только после этого выполняется сопоставление. - person Val; 17.10.2019
comment
Разумно, но в этом случае я смогу найти свой документ по значению 1,235 благодаря округлению. Однако это не так. - person briarheart; 17.10.2019
comment
1.235 округляется до 1.24, если попробуете с 1.233 и 1.232 тоже найдете - person Val; 17.10.2019
comment
Ох, какая жалость! :) Мой собственный комментарий содержал ответ на мой вопрос, и я его не видел. Благодарю вас! Я собираюсь принять ваш ответ. - person briarheart; 17.10.2019
comment
Как говорится, дьявол кроется в деталях ;-) Рад, что помог! - person Val; 17.10.2019