布尔查询是一个或多个查询子句的组合,每一个子句就是一个子查询。子查询的组合方式有:
(1)must:必须匹配每个子查询,类似“与”
(2)should:选择性匹配子查询,类似“或”
(3)must_not:必须不匹配,不参与算分,类似“非”
(4)filter:必须匹配,不参与算分
比如在搜索酒店时,除了关键字搜索外,我们还可能根据品牌、价格、城市等字段做过滤:
每一个不同的字段,其查询的条件、方式都不一样,必须是多个不同的查询,而要组合这些查询,就必须用bool查询了。
需要注意的是,搜索时,参与打分的字段越多,查询的性能也越差。因此这种多条件查询时,建议这样做:
-
搜索框的关键字搜索,是全文检索查询,使用must查询,参与算分
-
其它过滤条件,采用filter查询。不参与算分
语法示例
示例
需求:搜索名字包含“凯悦”,价格不低于1000,在坐标31.21,121.5周围10km范围内的酒店。
分析:
-
名称搜索,属于全文检索查询,应该参与算分。放到must中
-
价格不低于1000,用range查询,属于过滤条件,不参与算分。放到must_not中
-
周围10km范围内,用geo_distance查询,属于过滤条件,不参与算分。放到filter中
1 #布尔查询 2 GET /hotel/_search 3 { 4 "query":{ 5 "bool":{ 6 "must": [ 7 { 8 "match": { 9 "name": "凯悦" 10 } 11 } 12 ], 13 "must_not": [ 14 { 15 "range": { 16 "price": { 17 "lte": 1000 18 } 19 } 20 } 21 ], 22 "filter": [ 23 { 24 "geo_distance": { 25 "distance": "10km", 26 "location": { 27 "lat": 31.21, 28 "lon": 121.5 29 } 30 } 31 } 32 ] 33 } 34 } 35 }View Code
标签:算分,15,参与,查询,filter,DSL,搜索,must From: https://www.cnblogs.com/liaowenhui/p/17420417.html