2015-03-31 76 views
0

我使用ElasticSearch进行测试,并遇到远程查询问题。 考虑,我已经插入下列文件:使用ElasticSearch进行远程查询

curl -XPUT 'localhost:9200/test/test/test?pretty' -d ' 
{ 
    "name": "John Doe", 
    "duration" : "10", 
    "state" : "unknown" 
}' 

现在I'me尝试这样做,抓住其持续时间为5和15之间的所有文档的远程查询:

curl -XPOST 'localhost:9200/test/_search?pretty' -d ' 
{ 
    "query": { 
    "range": { 
     "duration": { 
     "gte": "5", 
     "lte": "15" 
     } 
    } 
    } 
}' 

这将返回但是如果我像这样运行查询,没有命中:

curl -XPOST 'localhost:9200/test/_search?pretty' -d ' 
{ 
    "query": { 
    "range": { 
     "duration": { 
     "gte": "10" 
     } 
    } 
    } 
}' 

它返回我之前插入的文档。如何查询ElasticSearch的持续时间值介于5和15之间的文档。

回答

1

问题是您正在将值作为字符串编入索引。这会导致范围查询不起作用。尝试索引和查询,如下所示:

curl -XPUT 'localhost:9200/test/test/test?pretty' -d ' 
{ 
    "name": "John Doe", 
    "duration" : 10, 
    "state" : "unknown" 
}' 

curl -XPOST 'localhost:9200/test/_search?pretty' -d ' 
{ 
    "query": { 
    "range": { 
     "duration": { 
     "gte": 5, 
     "lte": 15 
     } 
    } 
    } 
}' 

这港岛线产生以下结果:

{ 
    "took" : 2, 
    "timed_out" : false, 
    "_shards" : { 
    "total" : 5, 
    "successful" : 5, 
    "failed" : 0 
    }, 
    "hits" : { 
    "total" : 1, 
    "max_score" : 1.0, 
    "hits" : [ { 
     "_index" : "test", 
     "_type" : "test", 
     "_id" : "test", 
     "_score" : 1.0, 
     "_source": 
{ 
    "name": "John Doe", 
    "duration" : 10, 
    "state" : "unknown" 
} 
    } ] 
    } 
} 
+0

谢谢你,事实是,我已经尝试过多次,但我从来没有试图删除文件和再次插入它,我不断更新相同的对象,将持续时间字段更改为整数,但它永远不会工作,但是,删除我的旧文档并重新编制索引使得范围查询按预期工作。 – 2015-03-31 11:01:16

+0

很好用!您必须删除文档的原因是,如果未指定映射,则弹性会在首次编制索引时自动为您的文档创建映射。然后它猜测用于文档字段的类型。在这种情况下,它决定使用一个字符串来存储持续时间。 只有当您删除索引时,此自动创建的映射也会被删除。 – mdewit 2015-03-31 11:05:58

相关问题