0

我正在尝试提高弹性搜索查询的性能。查询的目标只是检索那些与查询匹配的文档,所以分数无关紧要,也很重要的是我们每天得到一个索引,所以查询。据我所知,对于这种情况,最好使用过滤器,避免计算得分,但我也只是认为有/有一些替代方法在查询中使用 finter 检索所有文档分数 1,所以我做的第一个查询是 followig :

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

4

1 回答 1

1

在您的第一个查询中,您只使用了post_filter. 您的第二个查询是要走的路,但可以对此进行优化(无需换行bool/filterbool/must

{
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "receivedDate": {
              "gte": "date1",
              "lte": "date2"
            }
          }
        },
        {
          "term": {
            "from": "john.doe@example.com"
          }
        }
      ]
    }
  }
}
于 2017-03-29T11:17:53.300 回答