范围奇怪的结果

时间:2015-11-18 20:50:03

标签: elasticsearch

我将此代码用于范围。显示价格范围内的住宿(weekly_price

GET /accommodations/_search
{
    "query": {
        "filtered": {
            "query":  {"match_all":{}},
            "filter": {"and":[{"range":{"weekly_price":{"gte":0,"lte":500}}}]}
        }
    }
}

结果很奇怪。有时候我会得到正确的结果(显示0到500欧元之间的住宿,有时我也会得到2000年weekly_price的住宿。

我做错了什么?

2 个答案:

答案 0 :(得分:0)

唯一可行的方法是,如果您的weekly_price字段是字符串而不是数字字段(integerlong等)。检索范围"0""500"范围内的字符串时,字符串"2000"会在词法范围内,因为"2""0"“更大”且“小于“"5"

如果使用

检索映射
curl -XGET localhost:9200/accommodations/_mapping

您应该会将weekly_price字段视为string类型。

您需要将该类型更改为integer或其他对您的数据有意义的数字类型,擦除索引并使用新映射重新创建它,如下所示。完成后,您的查询将按预期工作。

// delete your index
curl -XDELETE localhost:9200/accommodations 

// re-create your index with the proper mapping
curl -XPUT localhost:9200/accommodations -d '{
    "mappings": {
        "your_type": {
            "properties": {
                "weekly_price": {
                    "type": "integer"
                },
                ... other properties
            }
        }
    }
}'

// re-populate your index
curl -XPOST localhost:9200/accommodations/_bulk

答案 1 :(得分:0)

如果要使用范围过滤器,则应该具有有效的映射;例如;对于你应该拥有的日期;

"properties": {
    "date": {
                "type": "date",
                "format": "date"
              }

也是Val先生在上面写的整数字段。比你可以使用范围过滤器。