每次执行此查询时需要200多毫秒:
{
"filter": {
"term": {
"id": "123456",
"_cache": true
}
}
}
但是每次在第一次查询后执行时,这个只需要2-3毫秒:
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"term": {
"id": "123456"
}
}
}
}
}
请注意两个查询中的相同ID值。看起来第二个查询使用第一个查询的缓存结果。但为什么第一个查询不能使用缓存结果本身呢?从第一个查询中删除"_cache" : true
不会改变任何内容。
当我用其他ID执行第二个查询时,第一次执行它需要大约40 ms,之后每次需要2-3 ms。因此,第二个查询不仅工作得更快,而且还缓存结果并将缓存用于后续调用。
对所有这些都有解释吗?
答案 0 :(得分:5)
第一个请求中的顶级filter
元素在Elasticsearch中具有非常特殊的功能。它用于过滤搜索结果而不影响构面。为了避免干扰facet,此过滤器在结果收集期间应用,而不是在搜索期间应用,这会导致其性能降低。使用没有构面的顶级filter
几乎没有意义,因为filtered
和constant_score
查询通常可以提供更好的性能。如果使用filtered
match_all
查询的详细程度困扰您,您可以将第二个请求重写为等效的constant_score
查询:
{
"query": {
"constant_score": {
"filter": {
"term": {
"id": "123456"
}
}
}
}
}