2016-08-03 11 views
2

私はESで2つのクエリを持っています。両方とも、同じドキュメントセットで異なる納期がかかります。どちらも概念的に同じことをしています。私は疑いがほとんどありませんフィルタリングされたブール対ブールクエリ: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- bool/mustクエリが必要なものを検索できる文書

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

2- BOOL /フィルタは、ドキュメントを検索することはできないが。私は2番目のフィールド条件を削除した場合には、401のようにフィールド2の値

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

アップデート2と同じレコードを検索します。

ブール値で得点相を抑制するソリューションは/ 以内にそれをラップすることにより、クエリを実行しなければなりませんが見つかりました"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番目の構文は新しい2.x構文を使用しますが、フィルタコンテキストでは使用しません(bool/filterの代わりにbool/mustを使用しています)。 (速い=スコア計算せずにフィルターコンテキストで実行されますすなわち)あなたの最初のクエリと同等です2.xの構文を持つクエリは、この1のようになります。

{ 
    "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

興味深いことに秒1は、ヘッドplugin.Thanksによって生成されます。 – Mudit

+0

どちらも有効ですが、クエリーコンテキスト(スコア計算でゆっくりと)で 'must 'を実行する最初のものが有効ですが、' filter'の2番目のものはスコアリングが不要な場合の最適化の一種です。 – Val

+0

私はこれにスコアリングする必要はありません。あなたから提案されたもののために行く。クイックヘルプに感謝します。 – Mudit

関連する問題