每次执行此查询需要200毫秒以上的时间:
{ "filter": { "term": { "id": "123456", "_cache": true } } }
但这每次在第一次查询后每次执行只需要2-3毫秒:
{ "query": { "filtered": { "query": { "match_all": {} }, "filter": { "term": { "id": "123456" } } } } }
注意在两个查询中相同的ID值。看起来第二个查询使用第一个查询的缓存结果。但是,为什么第一个查询不能使用缓存的结果本身?"_cache" : true从第一个查询中删除不会更改任何内容。
"_cache" : true
当我使用其他ID执行第二个查询时,第一次执行该查询大约需要40毫秒,此后每次需要2-3毫秒。因此,第二个查询不仅运行速度更快,而且还缓存结果并将缓存用于后续调用。
所有这些都有解释吗?
第filter一个请求中的顶级元素在Elasticsearch中具有非常特殊的功能。它用于过滤搜索结果而不会影响构面。为了避免干扰方面,此过滤器在结果收集过程中而不是在搜索过程中应用,这会导致其性能下降。采用顶级filter无需方面做很少的意义,因为filtered与constant_score查询通常提供更好的性能。如果filtered查询的冗长match_all困扰您,您可以将第二个请求重写为等效constant_score查询:
filter
filtered
constant_score
match_all
{ "query": { "constant_score": { "filter": { "term": { "id": "123456" } } } } }