elasticsearch bool过滤器应该是子句的表现

时间:2015-06-02 01:58:40

标签: performance elasticsearch filter

第一次查询:

  {        "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_iduser2_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

0 个答案:

没有答案