我将此代码用于范围。显示价格范围内的住宿(weekly_price
)
GET /accommodations/_search
{
"query": {
"filtered": {
"query": {"match_all":{}},
"filter": {"and":[{"range":{"weekly_price":{"gte":0,"lte":500}}}]}
}
}
}
结果很奇怪。有时候我会得到正确的结果(显示0到500欧元之间的住宿,有时我也会得到2000年weekly_price
的住宿。
我做错了什么?
答案 0 :(得分:0)
唯一可行的方法是,如果您的weekly_price
字段是字符串而不是数字字段(integer
,long
等)。检索范围"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先生在上面写的整数字段。比你可以使用范围过滤器。