评分查询:
在Es查询中,Must、Mustnot、Should等查询,在查询过程中,要去判断这个文档是否匹配,同时它还需要判断这个文档匹配的有 _多好_(匹配程度如何)。评分查询(scoring queries)不仅仅要找出 匹配的文档,还要计算每个匹配文档的相关性,计算相关性使得它们比不评分查询费力的多。同时,查询结果并不缓存。
(注:在自定义排序下,并且没有通过script去做_Score的操作,查询时不会计算_score值)
过滤查询:
在Es查询中,Filter,在查询过程中,只需要去判断文档是否匹配,无需计算相关度评分,因此过滤的查询,会比评分查询快的多,并且结果可能会被缓存到内存中以便快速读取。(注:缓存不是绝对的,由近期查询命中次数以及总文档数决定。具体关于缓存,本章不做细写)
如何选择过滤查询还是评分查询:
通常,在做全文检索,并且最后排序通过_score排序时,才选择评分查询,除此以外的情况都使用过滤。因为在一般情况下,一个filter 会比一个评分的query性能更优异,并且每次都表现的很稳定。(注:不参与评分的查询条件都放在filter)。
最后附上两种写过滤查询的方法(两种方式在性能上是完全相同的):
1.Bool中的Filter。(实际开发中,应用的更多)
{
"bool": {
"must": { "match": { "title": "how to make millions" }},
"must_not": { "match": { "tag": "spam" }},
"should": [
{ "match": { "tag": "starred" }}
],
"filter": {
"range": { "date": { "gte": "2014-01-01" }}
}
}
}
2.constant_score
中的Filter(适合用于你只需要执行一个 filter 而没有其它查询)
{
"constant_score": {
"filter": {
"term": { "category": "ebooks" }
}
}
}