Почему мой запрос даты в Elasticsearch завершается с ошибкой?

#elasticsearch

#elasticsearch

Вопрос:

В настоящее время я следую веб-руководству, и когда я запускаю:

 GET /product/_doc/_search
{
  "query": {
    "range": {
      "in_stock": {
        "gte": 1,
        "lte": 5
      }
    }
  }
}
  

Я получаю кучу записей, включая:

   {
    "_index" : "product",
    "_type" : "_doc",
    "_id" : "366",
    "_score" : 1.0,
    "_source" : {
      "name" : "Eggplant - Baby",
      "price" : 58,
      "in_stock" : 1,
      "sold" : 187,
      "tags" : [ ],
      "description" : "Mauris sit amet eros. Suspendisse accumsan tortor quis turpis. Sed ante. Vivamus tortor. Duis mattis egestas metus. Aenean fermentum. Donec ut mauris eget massa tempor convallis. Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh.",
      "is_active" : false,
      "created" : "2016/01/03"
    }
  },
  

Когда я запускаю:

 GET /product/_doc/_search
{
  "query": {
    "range": {
      "created": {
        "gte": "2010/01/01"
      }
    }
  }
}
  

по тому же набору данных я получаю:

 {
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 0,
    "max_score" : null,
    "hits" : [ ]
  }
}
  

Почему я получаю ноль обращений по моему запросу? Я понимаю, что поиск сканирует записи с созданной датой, превышающей 2010/01/01, поэтому не должно ли оно соответствовать по крайней мере id 366?

Редактировать:

Вот мои сопоставления — похоже, это тип даты:

 {
  "product" : {
    "aliases" : { },
    "mappings" : {
      "_doc" : {
        "dynamic" : "false",
        "properties" : {
          "created " : {
            "type" : "date",
            "format" : "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd"
          },
          "description" : {
            "type" : "text"
          },
          "discount" : {
            "type" : "integer"
          },
          "in_stock" : {
            "type" : "integer"
          },
          "is_active" : {
            "type" : "boolean"
          },
          "name" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword"
              }
            }
          },
          "price" : {
            "type" : "integer"
          },
          "sold" : {
            "type" : "long"
          },
          "tags" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword"
              }
            }
          }
        }
      }
    },
    "settings" : {
      "index" : {
        "creation_date" : "1551151769380",
        "number_of_shards" : "5",
        "number_of_replicas" : "1",
        "uuid" : "3YTYcG-9TPeT_3jXfX5IMA",
        "version" : {
          "created" : "6060199"
        },
        "provided_name" : "product"
      }
    }
  }
}
  

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

1. ваш ‘created’ — это тип даты? проверьте свои сопоставления. Если да, то, пожалуйста, попробуйте указать формат рядом с gte.

2. Я отредактировал свой ответ — ‘created’, похоже, относится к типу date

Ответ №1:

У вас опечатка в имени ваших свойств. У вас есть дополнительный пробел после «созданного»:

 "properties" : {
          "created " : { <-- here
            "type" : "date",
            "format" : "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd"
          },
  

Чтобы диагностировать это, вы должны вызвать

 GET /product/_mapping
  

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