Запрос диапазона Elasticsearch на число в строковом формате

#elasticsearch

#elasticsearch

Вопрос:

У меня есть Elasticsearch индекс следующим образом

 {
  "Price": "50.99"
},
{
  "Price": "30.99"
},
{
  "Price": "40.99"
},
{
  "Price": "10.99"
}
  

Я пытаюсь извлечь документы на основе диапазона price . Я хочу вернуть документы с диапазоном цен 30-100 . Но он не возвращает никакого документа.

  GET index_name/_search
 {
  "query": {
    "bool": {
      "must": [
        { "range": {"Price": {"gte": 40, "lte": 100}}}
      ]
    }
  }
}
  

Поскольку Price это в строковом формате, я не могу получить документы. У меня нет возможности изменить index . Есть ли способ запросить его без изменения индекса?

Комментарии:

1. Вам необходимо обновить сопоставление, тогда это будет наиболее эффективным решением в долгосрочной перспективе

Ответ №1:

Лучший способ: измените тип поля на float

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

 GET index_name/_search
{
  "query": {
    "bool": {
      "must": {
        "script": {
          "script": {
            "inline": "Float.parseFloat(doc['Price.keyword'].value) >= 40 amp;amp; Float.parseFloat(doc['Price.keyword'].value) <= 100",
            "lang": "painless"
          }
        }
      }
    }
  }
}