15-DSL查询语法-复合查询-布尔查询

布尔查询是一个或多个查询子句的组合,每一个子句就是一个子查询。子查询的组合方式有:

(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

 

posted @ 2023-05-22 14:24  JustJavaIt  阅读(61)  评论(0编辑  收藏  举报