我正在执行一个简单的范围查询。但是我看到返回了一个空结果。但我知道它们是满足查询条件的许多记录/文档。
以下是我尝试过的三种查询类型。 (第三个是预定查询)
1)
"query": {
"range" : {
"endTime" : {
"gte" : 1559076400.0
}
}
}
2)
"query": {
"bool": {
"must": [
{"range" : {
"endTime" : {
"gte" : 1559076401.0
}
}
}
]
}
}
3)
"query": {
"bool": {
"filter": [
{"range" : {
"startTime" : {
"gt" : 1356873300.0
}
}
},
{"range" : {
"endTime" : {
"gte" : 1559076401.0
}
}
}
]
}
所有3个查询都返回一个空响应。
希望您能为您提供帮助。谢谢。
答案 0 :(得分:0)
在弹性索引中,在插入数据之前,需要将字段映射定义为日期或数字,以便可以应用范围搜索。 或保持动态映射为ON,以便Elastic可以根据插入的数据自动识别字段类型。 如果是后者,请检查索引上自动生成的映射。 还要检查日期/时间戳格式。
检查映射的步骤 https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-get-mapping.html
答案 1 :(得分:0)
由于您使用epoch
时间,因此需要在映射中提及。这就是我所做的。基本上mapping
和存储数据的方式在这里很重要。我不确定是否可以保存所需的任何格式并使用所需的任何格式进行查询。如果可以的话,我将做更多的研究并更新答案
1)创建了映射-展示了endTime
映射是如何完成的
2)插入一些样本文件
3)使用纪元时间-您想要的方式查询文档
映射
PUT so_test24
{
"mappings" : {
"_doc" : {
"properties" : {
"id" : {
"type" : "long"
},
"endTime" : {
"type" : "date",
"format": "epoch_millis"
}
}
}
}
}
插入文档
POST /so_test24/_doc
{
"id": 1,
"endTime": "1546300800"
}
POST /so_test24/_doc
{
"id": 2,
"endTime": "1514764800"
}
POST /so_test24/_doc
{
"id": 3,
"endTime": "1527811200"
}
POST /so_test24/_doc
{
"id": 4,
"endTime": "1535760000"
}
搜索查询
GET /so_test24/_search
{
"query": {
"range": {
"endTime": {"gte": "1532883892"}
}
}
}
结果
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 2,
"max_score" : 1.0,
"hits" : [
{
"_index" : "so_test24",
"_type" : "_doc",
"_id" : "uFIq42sB4TH56W1h-jGu",
"_score" : 1.0,
"_source" : {
"id" : 1,
"endTime" : "1546300800"
}
},
{
"_index" : "so_test24",
"_type" : "_doc",
"_id" : "u1Iq42sB4TH56W1h-zEK",
"_score" : 1.0,
"_source" : {
"id" : 4,
"endTime" : "1535760000"
}
}
]
}
}