使用过滤器,查询或混合

时间:2017-03-29 11:05:19

标签: performance elasticsearch elasticsearch-query

我正在尝试提高elasticsearch查询的性能。查询的目标只是检索那些与查询匹配的文档,因此得分无关紧要,同样重要的是我们每天得到一个索引,所以查询。据我所知,对于这种情况最好使用过滤器,避免计算得分,但我只是红色,有一些替代使用finter内部查询检索所有文档得分1,所以我做的第一个查询是关注:

{
 "filter": {
  "bool": {
   "must": [{
     "match": {
      "from": "john.doe@example.com"
     }
    }, {
     "range": {
      "receivedDate": {
       "gte": "date1",
       "lte": "date2"
      }
     }
    }
   ]
  }
 }
}

然后我进行了第一次测试,我将“过滤器”更改为“查询”,大部分时间我使用“查询”然后“过滤”得到更好的时间,这是我的第一个问题,为什么?在我的查询中我做错了过滤器比查询慢?

之后,我继续阅读,试图改进它,我得到了这个:

{
    "query": {
        "bool": {
            "must": {
                "match_all": {}
            },
            "filter": {
                "bool": {
                    "must": [{
                            "match": {
                                "from": "john.doe@example.com"
                            }
                        }, {
                            "range": {
                                "receivedDate": {
                                    "gte": "date1",
                                    "lte": "date2"
                                }
                            }
                        }
                    ]
                }
            }
        }
    }
}

后者我的印象有所改善。因此,根据您的经验,您可以告诉我哪一个更好(至少在理论上)可以获得更快的结果,也存在使用其中一个查询缓存结果以改进查询的机会。有一个更好的方法来进行此查询?在此先感谢您的帮助。我忘了提到我正在使用Elasticsearch v2.3

1 个答案:

答案 0 :(得分:1)

在您的第一个查询中,您只使用了post_filter。您的第二个查询是可行的方法,但可以针对此进行优化(无需在bool/filter内包裹bool/must):

{
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "receivedDate": {
              "gte": "date1",
              "lte": "date2"
            }
          }
        },
        {
          "term": {
            "from": "john.doe@example.com"
          }
        }
      ]
    }
  }
}