两者之间有什么区别
{
"query": {
"filtered": {
"filter": { "term": { "folder": "inbox" } }
}
}
}
和
{
"query": {
"term": { "folder": "inbox" }
}
}
似乎它们都通过folder
值过滤了inbox
字段上的索引。
答案 0 :(得分:1)
查询在弹性搜索中可以具有两种类型的上下文。 Query
上下文和filter
上下文。查询上下文可以判断文档与查询的匹配程度,即计算分数,而过滤条件可以判断文档是否与查询匹配,并且不计分。
查询上下文中的查询告诉您哪个文档与查询更匹配。分数越高,文档越有意义。
过滤器上下文中的查询的行为类似于条件运算符,即如果文档与查询匹配,则为 true ,否则为 false 。
要回答您的问题,两个查询都将匹配相同数量的文档,但是第一个查询将不计算分数(由于跳过了分数计算,因此比第二个查询更快),而第二个查询将计算分数并且比第一个要慢。因此,如果您只想过滤,最好告诉Elastic不需要通过将查询放在过滤器上下文中来计算得分。这样,您可以节省计算分数的计算成本。如果仅需要过滤,那么计算分数将是一项开销,因此存在两种类型的上下文。
第一个查询的示例输出(过滤器上下文):
{
"_index": "test",
"_type": "_doc",
"_id": "3",
"_score": 0, <-------- no scoring done
}
第二次查询(查询上下文)的示例输出:
{
"_index": "test",
"_type": "_doc",
"_id": "2",
"_score": 0.9808292 <-------- score calculated
}
因此,请使用查询上下文获取相关的匹配项,并使用过滤器上下文过滤掉文档。您也可以将两者结合使用。
您可以阅读有关查询和过滤器上下文here的更多信息。
答案 1 :(得分:0)
我同意楼上的说法,但是有一点要补充。 Query 和 Filter 可以在查询中一起使用以减少时间。