我正在尝试提高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
答案 0 :(得分:1)
在您的第一个查询中,您只使用了post_filter
。您的第二个查询是可行的方法,但可以针对此进行优化(无需在bool/filter
内包裹bool/must
):
{
"query": {
"bool": {
"filter": [
{
"range": {
"receivedDate": {
"gte": "date1",
"lte": "date2"
}
}
},
{
"term": {
"from": "john.doe@example.com"
}
}
]
}
}
}