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