Странное поведение при установке параметра scaling_factor - PullRequest
0 голосов
/ 15 октября 2019

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

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

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

ОБНОВЛЕНИЕ

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

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

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

{
  "num": 1.234
}

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

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

IОжидается, что запрос выше не найдет ничего, потому что индекс содержит только округленное значение 1.23.

1 Ответ

1 голос
/ 15 октября 2019

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

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

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

Если вы сохраните этоdocument

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
      ]
    }
  }
...