在Elasticsearch中,布尔查询(Boolean Query)除了包含must、must_not和should子句之外,还有一个重要的子句叫做filter。
filter子句在布尔查询中扮演着过滤的角色,用于指定文档必须满足的条件,在语义上,和must非常相近,但与must不同的是,filter子句不会影响文档的相关性得分(_score)。
以下是filter子句的一些关键特点:
filter子句用于过滤结果,确保返回的文档集合满足特定的条件。must不同,filter子句不会对文档的得分产生影响。这意味着即使文档满足filter条件,也不会提高其在搜索结果中的排名。filter子句通常可以利用Elasticsearch的缓存机制,这可以提高查询性能,尤其是对于大数据集。filter子句可以与其他子句(如must、must_not和should)结合使用,以构建更复杂的查询。filter子句可以包含多种类型的查询,例如:
term:用于精确匹配字段值。terms:用于匹配字段值的多个可能选项。range:用于匹配数值或日期字段的某个范围内的值。exists:检查字段是否存在于文档中。bool:嵌套的布尔查询,用于组合多个过滤条件。下面是一个包含filter子句的布尔查询示例:
GET bank/_search { "query": { "bool": { "must": [ { "match": { "gender": "M" } }, { "match": { "address": "mill" } } ], "must_not": [ { "match": { "age": "18" } } ], "should": [ { "match": { "lastname": "Wallace" } } ], "filter": [ { "range": { "age": { "gte": 20, "lte": 30 } } } ], "minimum_should_match": 1 } } } 这个布尔查询(Boolean Query),其中包含must、must_not、should和filter子句。
GET bank/_search:这是一个HTTP GET请求,用于在Elasticsearch的bank索引中执行搜索。
query:定义了搜索的具体条件。
bool:布尔查询,用于组合不同类型的子查询。
must:必须满足的条件。文档必须满足must中的所有条件才会被包含在搜索结果中。
must_not:必须不满足的条件。如果文档满足must_not中的任何条件,它将不会被包含在搜索结果中。
should:可选条件,用于提高满足条件的文档的相关性得分,但不是必需的。
filter:过滤条件,用于确保文档满足特定的非得分相关条件。在这个查询中,filter子句包含一个range查询:
range查询的gte(大于等于)和lte(小于等于)参数实现的。minimum_should_match:至少需要满足的should条件数量。在这个查询中,设置为1,意味着至少有一个should条件需要被满足。
filter子句:
filter子句用于过滤结果,返回的文档集合必须满足filter条件,但这些条件不会影响文档的相关性得分。filter子句使用了一个range查询,它指定了年龄的范围。这意味着所有返回的文档,除了必须满足must和must_not条件外,还必须有年龄在20到30岁之间。filter子句可以提高查询性能,特别是对于大数据集,因为Elasticsearch可以利用缓存机制。总结来说,查询将返回满足以下条件的文档:
should条件。