第一次查询:
{ "query" : {
"filtered" : {
"filter" : {
"bool" : {
"must" : [
{"term" : {"user1_id" : "1"}},
{"range" : {"day" : {"gte" : "2015-04-01", "lte" : "2015-04-30"}}}
]
}
}
}
}
在关系SQL中,第一个查询等于SQL:
select * from table where user1_id =1 and (day>=2015-04-01 and day <= 2015-04-30)
第二次查询:
{ "query" : {
"filtered" : {
"filter" : {
"bool" : {
"should" : [{"term" : {"user1_id" : "1"}}, {"term" : {"user2_id" : "1"}}],
"must" : {"range" : {"day" : {"gte" : "2015-04-02", "lte" : "2015-04-30"}} },
"_cache" : true
}
}
}
} }
在关系SQL中,第二个查询等于SQL:
select * from table where (user1_id =1 or user2_id = 1) and (day>=2015-04-01 and day <= 2015-04-30)
区别在于,
第一个查询仅考虑user1_id
,而第二个查询也会检查user2_id
。
user1_id
和user2_id
都已编入索引。
但是,性能差异很大。
第一个查询需要5秒钟,而第二个查询需要20秒。
第二个查询还有更好的方法吗?
映射:
user1_id:
type: "string"
index: "not_analyzed"
doc_values: true
user2_id:
type: "string"
index: "not_analyzed"
doc_values: true
day:
type: "date"
format: "YYYY-MM-dd"
ignore_malformed: true
doc_values: true
如果我第二次运行第一次查询,第一次是user1_id
,第二次是user2_id
,然后合并两个结果。它比使用第二个查询快得多。
总共有10亿份文件。 AWS,m2.4xlarge,共8个实例。
/usr/bin/java -Xms30g -Xmx30g