2016-08-03 118 views
2

我在ES有两个查询。这两份文件在同一组文件上有不同的周转时间。两者在概念上都做同样的事情。我有一些疑问过滤布尔与布尔查询:elasticsearch

1-这两者有什么区别? 2-哪一个更好用? 3-如果两者相同,他们表现不同?

1. Filtered bool 
    { 
     "from": 0, 
     "size": 5, 
     "query": { 
     "filtered": { 
      "filter": { 
      "bool": { 
       "must": [ 
       { 
        "term": { 
        "called_party_address_number": "1987112602" 
        } 
       }, 
       { 
        "term": { 
        "original_sender_address_number": "6870340319" 
        } 
       }, 
       { 
        "range": { 
        "x_event_timestamp": { 
         "gte": "2016-07-01T00:00:00.000Z", 
         "lte": "2016-07-30T00:00:00.000Z" 
        } 
        } 
       } 
       ] 
      } 
      } 
     } 
     }, 
     "sort": [ 
     { 
      "x_event_timestamp": { 
      "order": "desc", 
      "ignore_unmapped": true 
      } 
     } 
     ] 
    } 

    2. Simple Bool 

    { 
     "query": { 
     "bool": { 
      "must": [ 
      { 
       "term": { 
       "called_party_address_number": "1277478699" 
       } 
      }, 
      { 
       "term": { 
       "original_sender_address_number": "8020564722" 
       } 
      }, 
      { 
       "term": { 
       "cause_code": "573" 
       } 
      }, 
      { 
       "range": { 
       "x_event_timestamp": { 
        "gt": "2016-07-13T13:51:03.749Z", 
        "lt": "2016-07-16T13:51:03.749Z" 
       } 
       } 
      } 
      ] 
     } 
     }, 
     "from": 0, 
     "size": 10, 
     "sort": [ 
     { 
      "x_event_timestamp": { 
      "order": "desc", 
      "ignore_unmapped": true 
      } 
     } 
     ] 
    } 

映射:

{ 
    "ccp": { 
     "mappings": { 
     "type1": { 
      "properties": { 
       "original_sender_address_number": { 
        "type": "string" 
       }, 
       "called_party_address_number": { 
        "type": "string" 
       }, 
       "cause_code": { 
        "type": "string" 
       },    
       "x_event_timestamp": { 
        "type": "date", 
        "format": "strict_date_optional_time||epoch_millis" 
       }, 
       . 
       . 
       .    
      } 
     } 
     } 
    } 
} 

更新1:

我试图布尔/必须查询和布尔/过滤器对同一组数据的查询,但我发现奇怪的行为

1- 布尔/必须查询能够搜索所需记录

{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "term": { 
      "called_party_address_number": "8701662243" 
      } 
     }, 
     { 
      "term": { 
      "cause_code": "401" 
      } 
     } 
     ] 
    } 
    } 
} 

2- 虽然布尔/过滤器不能够搜索的文档。如果删除了第二场条件它搜索相同的记录与FIELD2的值作为401

{ 
    "query": { 
    "bool": { 
     "filter": [ 
     { 
      "term": { 
      "called_party_address_number": "8701662243" 
      } 
     }, 
     { 
      "term": { 
      "cause_code": "401" 
      } 
     } 
     ] 
    } 
    } 
} 

UPDATE2:

实测值抑制得分相用布尔的溶液/必须由内包裹它查询“constant_score”。 “1235235757” 和 “cause_code”: “304”,我们试图匹配有 “called_pa​​rty_address_number”

{ 
    "query": { 
    "constant_score": { 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "term": { 
       "called_party_address_number": "1235235757" 
       } 
      }, 
      { 
       "term": { 
       "cause_code": "304" 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 

记录。

回答

3

第一个使用旧的1.x查询/过滤器语法(即filtered查询已被弃用,而赞成bool/filter)。

第二个使用新的2.x语法,但不是在过滤器上下文中(即,您使用的是bool/must而不是bool/filter)。与2.x的语法查询其等同于(其中在过滤器中上下文中运行,而不得分计算=更快即)第一个查询将是这样一个:

{ 
    "query": { 
    "bool": { 
     "filter": [ 
     { 
      "term": { 
      "called_party_address_number": "1277478699" 
      } 
     }, 
     { 
      "term": { 
      "original_sender_address_number": "8020564722" 
      } 
     }, 
     { 
      "term": { 
      "cause_code": "573" 
      } 
     }, 
     { 
      "range": { 
      "x_event_timestamp": { 
       "gt": "2016-07-13T13:51:03.749Z", 
       "lt": "2016-07-16T13:51:03.749Z" 
      } 
      } 
     } 
     ] 
    } 
    }, 
    "from": 0, 
    "size": 10, 
    "sort": [ 
    { 
     "x_event_timestamp": { 
     "order": "desc", 
     "ignore_unmapped": true 
     } 
    } 
    ] 
} 
+0

有趣的是,通过头部plugin.Thanks产生的第二个。 – Mudit

+0

两者都是有效的,但第一个用'must'执行的查询上下文(计算得分较慢),而第二个用'filter'则是一种优化,如果你不需要评分的话。 – Val

+0

我不需要为此评分。去找你提出的一个。非常感谢您的快速帮助。 – Mudit