Как сравнить часы наasticsearch - PullRequest
0 голосов
/ 06 ноября 2018

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

{  
   "script":"doc['schedule.from_time'] >= doc['schedule.to_time']"
}

Но у меня есть ошибка:

Невозможно применить операцию [>] к типам [org.elasticsearch.index.fielddata.ScriptDocValues.Dates]

Схема вложенного документа:

{
    "settings": {
        "index.mapping.total_fields.limit": 10000
    },
    "mappings": {
        "_doc": {
           "dynamic_templates": [{
                "integers": {
                    "match_mapping_type": "long",
                    "mapping": {
                        "type": "long",
                        "index": false
                    }
                }
            }],
            "properties": {
                "enabled_services": {
                    "type": "nested",
                    "properties": {
                        "service_id": {
                           "type": "text",
                           "analyzer": "whitespace",
                           "search_analyzer": "whitespace"
                        },
                        "available_day_of_week": {
                            "type": "long"
                        },
                        "available_from_time": {
                            "type": "date",
                            "format": "hour_minute"
                        },
                        "available_to_time": {
                            "type": "date",
                            "format": "hour_minute"
                        }
                    }
                }
            }
        }
    }
}

(значения форматируются как «2:00» или «18:00»).

Я пытался использовать .date или .value, но он не работает, потому что моя переменная содержит только часы, а не дату и время.

Может кто-нибудь помочь мне :)

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

ОК, я нашел ответ:

{
    "script": {
        "script": "doc['enabled_services.available_from_time'].date.isBefore(doc['enabled_services.available_to_time'].date)"
    }
}

Спасибо всем!

0 голосов
/ 06 ноября 2018

Я думаю, что вы ищете:

doc['enabled_services.available_from_time'].value.isAfter(doc['enabled_services.available_to_time'].value)

Вам также необходимо удалить "type": "nested" из вашего сопоставления. Я думаю, что это не нужно в вашем случае.

Рабочий код ниже:

Mapping

PUT /painless-dates
{
  "settings": {
    "index.mapping.total_fields.limit": 10000
  },
  "mappings": {
    "_doc": {
      "dynamic_templates": [
        {
          "integers": {
            "match_mapping_type": "long",
            "mapping": {
              "type": "long",
              "index": false
            }
          }
        }
      ],
      "properties": {
        "enabled_services": {
          "properties": {
            "service_id": {
              "type": "text",
              "analyzer": "whitespace",
              "search_analyzer": "whitespace"
            },
            "available_day_of_week": {
              "type": "long"
            },
            "available_from_time": {
              "type": "date",
              "format": "hour_minute"
            },
            "available_to_time": {
              "type": "date",
              "format": "hour_minute"
            }
          }
        }
      }
    }
  }
}

Добавить два элемента

POST /painless-dates/_doc
{
  "enabled_services": {
    "available_from_time": "02:00",
    "available_to_time": "18:00"
  }
}

POST /painless-dates/_doc
{
  "enabled_services": {
    "available_from_time": "04:00",
    "available_to_time": "03:00"
  }
}

Запрос

GET /painless-dates/_search
{
  "query": {
    "bool": {
      "must": {
        "script": {
          "script": {
            "source": "doc['enabled_services.available_from_time'].value.isAfter(doc['enabled_services.available_to_time'].value)",
            "lang": "painless"
          }
        }
      }
    }
  }
}

Ответ

{
  "took": 8,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "painless-dates",
        "_type": "_doc",
        "_id": "0wFw7mYBueYINcTmJsMG",
        "_score": 1,
        "_source": {
          "enabled_services": {
            "available_from_time": "04:00",
            "available_to_time": "03:00"
          }
        }
      }
    ]
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...